BeeL
REMOTE · MCP.BEEL.ES · 2 COMPONENTS · SCANNED SEP 21
Spanish e-invoicing with VeriFactu (AEAT): issue invoices, manage customers, validate NIFs.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security94
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- The endpoint enforces authorisation, advertised via RFC 9728 protected-resource metadata. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability0
- Transport blocked by authentication: the endpoint requires auth we don't have to verify streamable-http. See how to fix → View diagnostics → Unverified
Schema Quality & AI Usability0
- Schema blocked by authentication: the endpoint requires auth we don't have to read it. See how to fix → Unverified
Stability & Change Management0
- Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage0
- Tool coverage blocked by authentication: the endpoint requires auth we don't have to read its tools.Unverified
Tool Safety0
- Tool safety blocked by authentication: the endpoint requires auth we don't have to read its tools.Unverified
Capabilities0
- Capabilities blocked by authentication: the endpoint requires auth we don't have to read them. See how to fix → Unverified
Unverified: 6 categories
Categories scored 0 because we could not verify them: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm. Claim this server and supply a read-only token to verify it and lift the score.
How do I install the BeeL MCP server?
BeeL is a hosted endpoint at https://mcp.beel.es/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · mcp.beel.es
claude mcp add --transport http es-beel-mcp 'https://mcp.beel.es/mcp'
{
"mcpServers": {
"es-beel-mcp": {
"url": "https://mcp.beel.es/mcp"
}
}
} {
"servers": {
"es-beel-mcp": {
"type": "http",
"url": "https://mcp.beel.es/mcp"
}
}
} [mcp_servers.es-beel-mcp] url = "https://mcp.beel.es/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"es-beel-mcp": {
"type": "remote",
"url": "https://mcp.beel.es/mcp",
"enabled": true
}
}
} openclaw mcp add es-beel-mcp --url 'https://mcp.beel.es/mcp' --transport streamable-http
mcp_servers:
es-beel-mcp:
url: "https://mcp.beel.es/mcp" {
"McpServers": {
"es-beel-mcp": {
"Transport": "http",
"Url": "https://mcp.beel.es/mcp"
}
}
} assistant mcp add es-beel-mcp -t streamable-http -u 'https://mcp.beel.es/mcp'
{
"mcpServers": {
"es-beel-mcp": {
"type": "http",
"url": "https://mcp.beel.es/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 18 Sept 26 −49
- Endpoint reachability: reachable → behind authorisation ▼ security
- Stability: 0.60 → unverified ▼ security
- Transport: pass → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Authorization: The endpoint enforces authorisation, advertised via RFC 9728 protected-resource metadata. security
- Schema quality: 100 → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Capabilities: pass → unverified ▼ functional
- 16 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.
- 14 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.
- 12 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.
- 10 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.
- 8 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.
- 5 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.
- 3 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 21 Sept 2026 · Probed https://mcp.beel.es/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=beel.es | CN=WE1,O=Google Trust Services,C=US | 11 Aug 2026 | 9 Nov 2026 | ECDSA 256 | ECDSA-SHA256 | 344c60005341dc180ecf90facb658f01 |
| SANs: beel.es, mcp.beel.es, *.mcp.beel.es | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of mcp.beel.es. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| es. | present | 54404 | 8 | Verified |
| beel.es. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On connection |
| HTTP status | 401 |
WWW-Authenticate challenge Bearer realm="OAuth", resource_metadata="https://mcp.beel.es/.well-known/oauth-protected-resource/mcp", scope="accounts:read accounts:write companies:list companies:read companies:write configuration:read configuration:write customers:read customers:write emails:read invoices:read invoices:write logs:read members:read members:write nif:validate payment-connections:read payment-connections:write products:read products:write sandbox series:read series:write webhooks:read webhooks:write"
Bearer realm="OAuth", resource_metadata="https://mcp.beel.es/.well-known/oauth-protected-resource/mcp", scope="accounts:read accounts:write companies:list companies:read companies:write configuration:read configuration:write customers:read customers:write emails:read invoices:read invoices:write logs:read members:read members:write nif:validate payment-connections:read payment-connections:write products:read products:write sandbox series:read series:write webhooks:read webhooks:write" | Header | Value |
|---|---|
| strict-transport-security | max-age=15552000 |
| x-content-type-options | nosniff |
| www-authenticate | Bearer realm="OAuth", resource_metadata="https://mcp.beel.es/.well-known/oauth-protected-resource/mcp", scope="accounts:read accounts:write companies:list companies:read companies:write configuration:read configuration:write customers:read customers:write emails:read invoices:read invoices:write logs:read members:read members:write nif:validate payment-connections:read payment-connections:write products:read products:write sandbox series:read series:write webhooks:read webhooks:write" |
Protected resource metadata
| Document | https://mcp.beel.es/.well-known/oauth-protected-resource/mcp |
|---|---|
| Retrieved | Yes |
| Resource | https://mcp.beel.es/mcp |
| Authorisation server | https://mcp.beel.es |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://mcp.beel.es/mcp | Auth required | 401 | |
| http (plaintext) | http://mcp.beel.es/mcp | HTTPS enforced | 301 | https://mcp.beel.es/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
beel_get_email_delivery_indicators ~278
Returns, for each related entity id given, how many emails the history holds for it, the status of the most recent one and when it was sent. Lets you show the state of an entity's email without loading its full history. - **`last_status`:** carries whatever the latest attempt ended in, `REJECTED` and `QUEUED` included, so a `count` above zero does not mean an email reached anyone. - **Ids with no associated emails:** omitted from the response rather than returned with `count` 0. **Closed catalogue.** This collection is fixed and bounded by the request itself — at most one indicator per id in `related_entity_ids`: it carries no `pagination`, it takes no `page`/`limit`, and every response holds the whole set. Endpoint: GET /v1/accounts/{account_id}/email-indicators
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account, or an account you provisioned. It — not the credential — decides which account the operation acts on; a `403` is returned when you do not reach it, the same response an account that… |
| related_entity_ids | array | yes | Comma-separated list of related entity ids (e.g. invoice ids) |
No output schema declared.
No examples provided.
beel_get_fiscal_summary ~341
Returns the VAT and IRPF summary of the invoices issued under this company over the requested period, together with the annual IRPF projection and its progressive bracket breakdown. `start_date` and `end_date` go together: send both, or neither. Omitting both defaults to the current month; sending only one answers `400`, because a period you did not ask for is worse than an error. The range may not exceed 365 days, and every fault names itself in `details.reason`. Endpoint: GET /v1/companies/{company_id}/fiscal-summary
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| end_date | string | – | Period end date (inclusive), as `YYYY-MM-DD`. Goes together with `start_date`: supply both or neither. Omitting both defaults to the current month; supplying only one is rejected with `400` (`PERIOD_… |
| start_date | string | – | Period start date (inclusive), as `YYYY-MM-DD`. Goes together with `end_date`: supply both or neither. Omitting both defaults to the current month; supplying only one is rejected with `400` (`PERIOD_… |
No output schema declared.
No examples provided.
beel_get_invitation ~167
Returns one invitation of the account, with the same shape the list returns. An invitation stays readable for its whole life: `ACCEPTED`, `REVOKED` and `EXPIRED` ones are returned with their `status`, because the record is the trail of who was granted access to the account's fiscal data and revoking it does not erase it. Endpoint: GET /v1/accounts/{account_id}/invitations/{invitation_id}
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account, or an account you provisioned. It — not the credential — decides which account the operation acts on; a `403` is returned when you do not reach it, the same response an account that… |
| invitation_id | string | yes | – |
No output schema declared.
No examples provided.
beel_get_invoice ~196
Retrieves the full details of an invoice of this company. Endpoint: GET /v1/companies/{company_id}/invoices/{invoice_id} ⚠️ Fiscal guardrails — read before calling: - When an invoice can still be changed, and what to do once it cannot. (resource: beel://guardrails/invoice-state-machine) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| invoice_id | – | yes | Invoice ID |
No output schema declared.
No examples provided.
beel_get_invoice_customization ~192
Returns how the invoices of a company are rendered and delivered: PDF template, accent colour, invoice language, email language and current logo. Customization is a per-NIF property, so each company of the account carries its own. The catalogue of available templates and suggested colours is served by `GET /v1/invoice-customization-options`. Endpoint: GET /v1/companies/{company_id}/invoice-customization
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
No output schema declared.
No examples provided.
beel_get_invoice_pdf ~234
Returns a temporary pre-signed URL to download the invoice PDF. - **URL:** expires in five minutes and only allows `GET`. - **`202`:** the PDF is still being generated and no body is returned; poll this endpoint until it answers `200`. - **Drafts:** a draft has no fiscal PDF and answers `400 INVOICE_NOT_ISSUED_NO_PDF`. Issue it, or render it with `GET …/{invoice_id}/pdf/preview`. Endpoint: GET /v1/companies/{company_id}/invoices/{invoice_id}/pdf
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| invoice_id | – | yes | Invoice ID |
No output schema declared.
No examples provided.
beel_get_invoice_preview ~190
Returns a temporary pre-signed URL to a preview image (WebP) of the invoice, suitable for inline rendering. The image is generated and cached on first request, so a later call returns the cached image. The URL expires in five minutes and only allows `GET`. Endpoint: GET /v1/companies/{company_id}/invoices/{invoice_id}/preview
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| invoice_id | – | yes | Invoice ID |
No output schema declared.
No examples provided.
beel_get_invoice_schedule ~275
Returns the date and generation mode currently scheduled for this invoice. An invoice with no scheduling answers `404`, since the sub-resource does not exist yet. To move only the date, read the current `generation_mode` here and send it back on the `PUT`. Endpoint: GET /v1/companies/{company_id}/invoices/{invoice_id}/schedule ⚠️ Fiscal guardrails — read before calling: - When an invoice can still be changed, and what to do once it cannot. (resource: beel://guardrails/invoice-state-machine) - Choosing wrong here misreports to AEAT. The 30-second decision. (resource: beel://guardrails/cancel-vs-rectify) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| invoice_id | – | yes | Invoice ID |
No output schema declared.
No examples provided.
beel_get_issuing_readiness ~412
Returns whether a company can issue its STANDARD invoice right now in the environment of the request, and the `blockers` that stop it otherwise. Readiness is a per-NIF property, evaluated independently for each company of the account. - **`ready`:** `true` only when `blockers` is empty. - **Activation:** issuing any fiscal document requires the company to be activated in the environment of that document, whether or not it goes to VeriFactu. - **VeriFactu chain:** the AEAT census and signed representation are additionally demanded only when the company applies VeriFactu by default, the same derivation invoice creation uses when `verifactu_enabled` is omitted. A company with VeriFactu off is ready with a NIF, a default series and an activation. Issuing an invoice with an explicit `verifactu_enabled: true` still enforces the full chain at emission time regardless of this answer, and the separate `verifactu` block reports that chain independently of the setting. - **Not evaluated:** the account's quota or subscription, and the payload of any particular invoice. Endpoint: GET /v1/companies/{company_id}/issuing-readiness ⚠️ Fiscal guardrails — read before calling: - Which company an operation acts on, and how that is selected. (resource: beel://guardrails/multi-nif) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company whose issuing readiness is evaluated — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `Bee… |
No output schema declared.
No examples provided.
beel_get_member ~108
Returns one member of the account, with the same shape the list returns. Endpoint: GET /v1/accounts/{account_id}/members/{member_id}
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account, or an account you provisioned. It — not the credential — decides which account the operation acts on; a `403` is returned when you do not reach it, the same response an account that… |
| member_id | string | yes | Membership unique UUID. |
No output schema declared.
No examples provided.
beel_get_my_identity ~244
Returns the identity of the authenticated principal: the account the credential belongs to, the person's email, name, logo and interface language, and a description of the credential itself. Unlike every other operation, it requires no scope — any valid credential resolves, so a `200` confirms the credential works and tells you which account it belongs to, and a `401` that it does not. - **`account_id`:** identifies who the credential belongs to, not what it is currently pointed at; selecting a different company with `BeeL-Active-Company` does not change it. - **`name`:** resolves as `trade_name ?? legal_name` of the active fiscal profile, and is `null` until onboarding creates one. - **`credential`:** describes the credential the call was authenticated with — its type, the environment it operates on and the permissions it holds — so a client can adapt what it offers instead of discovering the limits through a `403`. - **Caching:** responses are never cached (`Cache-Control: no-store`). Endpoint: GET /v1/me/identity
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
beel_get_payment_event ~272
Retrieves a single payment event of the NIF's connection, including the outcome of its automatic invoicing and, when it failed, the stable failure code you can act on. - **Not found:** an event that does not belong to this NIF's connection returns `404`, the same answer an event that does not exist gets, so an event of another NIF is never disclosed. Endpoint: GET /v1/companies/{company_id}/payment-connections/{provider}/events/{event_id}
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the events belong to — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Company… |
| event_id | string | yes | Identifier of the payment event, as returned by the list operation. |
| provider | string | yes | Payment provider slug in **lowercase**. Currently only `stripe` (Stripe Connect) is operative; `woocommerce` and `shopify` are reserved for future providers. |
No output schema declared.
No examples provided.
beel_get_product ~142
Retrieves the details of a product of this company. Endpoint: GET /v1/companies/{company_id}/products/{product_id}
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| product_id | string | yes | Product unique UUID |
No output schema declared.
No examples provided.
beel_get_recurring_invoice ~246
Retrieves the full details of a recurring invoice template of this company, including its schedule, template lines and next generation date. Endpoint: GET /v1/companies/{company_id}/recurring-invoices/{recurring_invoice_id} ⚠️ Fiscal guardrails — read before calling: - How BeeL derives the AEAT invoice type, and the rules each type imposes. (resource: beel://guardrails/invoice-types) - What regime_key means, where it lives, and which combinations are rejected. (resource: beel://guardrails/regime-keys) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| recurring_invoice_id | string | yes | – |
No output schema declared.
No examples provided.
beel_get_recurring_invoice_history ~412
Returns the invoices previously generated from this recurring template, including their status and generation dates, newest first. **Paginated** with the usual `page`/`limit`, and the usual defaults: without them you get the 20 most recent generations, not the whole history — which grows with every cycle the template runs. Read `data.pagination` to walk the rest. The deprecated flat alias `GET /v1/recurring-invoices/{recurring_invoice_id}/history` does **not** paginate: it is frozen as it shipped until its `Sunset` date, and returns the whole history with no `pagination`. Only this route pages. Endpoint: GET /v1/companies/{company_id}/recurring-invoices/{recurring_invoice_id}/history ⚠️ Fiscal guardrails — read before calling: - How BeeL derives the AEAT invoice type, and the rules each type imposes. (resource: beel://guardrails/invoice-types) - What regime_key means, where it lives, and which combinations are rejected. (resource: beel://guardrails/regime-keys) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| limit | integer | – | How many items to return per page. The response echoes it back as `pagination.items_per_page`. |
| page | integer | – | Page number, starting at 1. The response echoes it back as `pagination.current_page`. |
| recurring_invoice_id | string | yes | – |
No output schema declared.
No examples provided.
beel_get_recurring_next_occurrence ~267
Returns the invoice that would be produced by the next generation of this recurring template, computed from the current issuer, recipient and series data. Nothing is persisted and no numbering is consumed. Endpoint: GET /v1/companies/{company_id}/recurring-invoices/{recurring_invoice_id}/next-occurrence ⚠️ Fiscal guardrails — read before calling: - How BeeL derives the AEAT invoice type, and the rules each type imposes. (resource: beel://guardrails/invoice-types) - What regime_key means, where it lives, and which combinations are rejected. (resource: beel://guardrails/regime-keys) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| recurring_invoice_id | string | yes | – |
No output schema declared.
No examples provided.
beel_get_representation ~219
Returns the state of the AEAT fiscal representation of a company: whether the document has been generated, signed and submitted, and whether AEAT accepted it or it was cancelled. - **`status`:** `NOT_STARTED`, `PDF_GENERATED`, `SUBMITTED`, `ACTIVE`, `ERROR` or `CANCELLED`. - **Never started:** not an error. The endpoint answers `200` with `NOT_STARTED`, so polling it is always safe. Endpoint: GET /v1/companies/{company_id}/representation
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
No output schema declared.
No examples provided.
beel_get_request_log ~299
Returns the full detail (bodies and headers) of a request made by you, with any of your API keys in this environment — including one made with a key other than the one you are authenticating with, because the axis is the person, not the individual credential. - **`{account_id}`:** authorizes the call; it does not widen what you can see. - **`404`:** the request does not exist, was made by another user (including another user of this same account), or belongs to the other environment. - **The widest read `logs:read` opens:** it returns the bodies and headers that any key of yours exchanged in this environment, so a key holding only `logs:read` reads the traffic of your privileged keys too. It never crosses to another user or to another account. Grant it accordingly. Endpoint: GET /v1/accounts/{account_id}/request-logs/{request_id}
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Account the call is authorized against. It does not widen the result set. |
| request_id | string | yes | Correlation identifier (X-Request-Id). |
| timestamp | string | – | Log timestamp (the one returned by the list). Narrows the search window around that instant so the detail also works for logs older than the default window. If omitted, the default recent window is s… |
No output schema declared.
No examples provided.
beel_get_series ~212
Returns one invoice series of a company, with its code, format, counter state, document type and whether it is the default of that type. Endpoint: GET /v1/companies/{company_id}/series/{series_id} ⚠️ Fiscal guardrails — read before calling: - How invoice numbers are formed, and why numbering can never be rewritten. (resource: beel://guardrails/series-and-numbering) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| series_id | – | yes | Series ID |
No output schema declared.
No examples provided.
beel_get_setup_status ~142
Read-only setup status across your account: for each company it reports whether it can issue Live, exactly what is missing (issuing-readiness blockers, default series, VeriFactu, payment connection) and the single recommended next action. Use this to drive onboarding instead of guessing. Aggregates several endpoints; a section that could not be read carries an `error` and never a default, so an unknown is never reported as ready.
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | – | Optional: restrict the report to a single company, by its company id (a UUID). This is not the NIF; the NIF is reported as a field of each company. |
| Name | Type | Req | Description |
|---|---|---|---|
| account | object | yes | The authenticated account, or an error note if identity could not be read. |
| companies | array | yes | – |
| environment | string | yes | Which BeeL environment this session operates on. `live` means every invoice issued is a real fiscal document. |
| error | string | – | Why the report is incomplete: the company listing failed, a filter matched nothing, or entries were unusable. Present only when something went wrong. |
| next_action | string | yes | Single recommended next action across the whole account. |
No examples provided.
beel_get_tax_configuration ~201
Returns the tax configuration of a company: its default main tax (`IVA`, `IGIC`, `IPSI` or `OTHER`) with the default percentage and regime key, the default exemption reason, its IRPF and equivalence surcharge settings, and the default payment method and payment term. The catalogue of tax types this configuration draws from is not company data and lives outside this resource. Endpoint: GET /v1/companies/{company_id}/tax-configuration
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
No output schema declared.
No examples provided.
beel_get_usage ~145
Returns how many accounts you have provisioned and the billable count that follows from them — the figure behind your offline B2B invoice. - **Billable unit:** the provisioned account, not the real NIF. Every account you provision counts as one, empty and unclaimed ones included. - **`account_id`:** your own account. Usage is a property of the provisioner, not of each provisioned account, so any other id returns `404`. - **Entitlement:** requires `manage_accounts`. Endpoint: GET /v1/accounts/{account_id}/usage
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account id. |
No output schema declared.
No examples provided.
beel_get_verifactu_configuration ~216
Retrieves the VeriFactu configuration of this company. The configuration belongs to the NIF, so the NIF in the path is what decides which one is returned. Endpoint: GET /v1/companies/{company_id}/verifactu-configuration ⚠️ Fiscal guardrails — read before calling: - Why an issued invoice may never reach AEAT, and how to tell before issuing. (resource: beel://guardrails/verifactu-gates) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
No output schema declared.
No examples provided.
beel_get_webhook_subscription ~167
Returns a single webhook subscription. The signing secret is never included. Endpoint: GET /v1/accounts/{account_id}/webhooks/{webhook_id}
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account, or an account you provisioned. It — not the credential, and not the `BeeL-Active-Company` header — decides which account the operation acts on. An account you do not reach answers `… |
| webhook_id | string | yes | Subscription of the account in the path. A subscription of another account answers `404`, the same as one that does not exist: under the account resolved from `{account_id}` it simply is not there. |
No output schema declared.
No examples provided.
beel_initiate_payment_connection ~601
Opens an authorization session so the holder of a company your account **manages** can connect a payment provider (`stripe`), and returns the `authorization_url` where they authorize it. - **`return_url`:** once the holder authorizes, BeeL's callback finalizes the connection and redirects back to the `return_url` of your portal, if you supplied one, with the parameters described under `return_url`. - **When the connection appears:** it is created only when the holder authorizes, so it does not appear in `GET /v1/companies/{company_id}/payment-connections` until then. It is sealed under the NIF in the path, so auto-invoicing issues under that NIF. - **The NIF must be activated in the mode of your API key** (`beel_sk_test_*` → Test, `beel_sk_live_*` → Live); otherwise the request answers `400` `COMPANY_NOT_ACTIVATED_IN_ENVIRONMENT` and no `authorization_url` is issued, because without activation there is no invoice series or tax configuration to invoice with. Test and Live activations are independent — a NIF activated in one mode still needs activating in the other. - **One provider account, one NIF:** a provider account (`acct_...`) can be connected to a single NIF across the whole platform. Authorizing the same provider account from a second NIF does not move it: the callback fails with `OAUTH_ACCOUNT_CONNECTED_TO_OTHER_COMPANY`, and the existing connection keeps invoicing under the NIF it was sealed with. To move it, first `DELETE /v1/companies/{company_id}/payment-connections/{provider}` on the NIF that holds it, then open a new authorization on the NIF you want it under. Endpoint: POST /v1/companies/{company_id}/payment-connections/authorizations
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| company_id | string | yes | Unique identifier (UUID) of the company the authorization is opened for — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Act… |
| idempotency_key | string | – | Optional idempotency key for this operation. Omit it and one is derived from the request itself, which makes a blind retry safe but also collapses a SECOND, deliberately identical operation into the… |
No output schema declared.
No examples provided.
beel_issue_invoice ~620
Finalizes a draft invoice of this company: assigns its definitive number from the configured series and makes it immutable. - **Irreversible:** an issued invoice is corrected with a corrective invoice (`POST …/{invoice_id}/corrective`) or voided (`POST …/{invoice_id}/void`), never edited. - **Asynchronous:** PDF generation and submission to the AEAT happen after the response, so a `200` means the invoice was accepted for submission, not that the AEAT has registered it. Use `wait_for_pdf` to wait for the PDF. Endpoint: POST /v1/companies/{company_id}/invoices/{invoice_id}/issue ⚠️ Fiscal guardrails — read before calling: - When an invoice can still be changed, and what to do once it cannot. (resource: beel://guardrails/invoice-state-machine) - Why an issued invoice may never reach AEAT, and how to tell before issuing. (resource: beel://guardrails/verifactu-gates) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| attach_source_invoices | boolean | – | Only applies when the invoice has automatic email sending enabled. If `true`, the email sent after issuing also attaches a ZIP (`suplidos_<invoice-number>.zip`) with the PDFs of the source invoices r… |
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| idempotency_key | string | – | Optional idempotency key for this operation. Omit it and one is derived from the request itself, which makes a blind retry safe but also collapses a SECOND, deliberately identical operation into the… |
| invoice_id | – | yes | Invoice ID |
| wait_for_pdf | boolean | – | If `true`, waits for PDF generation and returns the URL in the response. Adds ~1-2s of latency but guarantees the PDF is immediately available. |
No output schema declared.
No examples provided.
beel_list_accounts ~263
Returns the accounts you provisioned, newest first. Each carries its lifecycle `status` (`PROVISIONED` → `CLAIMED` → `ACTIVE`), the `access_level` you hold over it and the state of its claim link. - **`status`:** narrows the list to one lifecycle stage. - **`external_ref`:** looks an account up by the reference you assigned when provisioning it; returns the 0..1 matching accounts. **Cursor pagination.** This collection pages by `cursor`/`next_cursor` instead of by `page`, so it carries no `pagination` block. That is a documented variant of pagination, not a different envelope: the collection still travels under a named key inside `data`. Keep asking with the `next_cursor` of the previous response until it comes back `null`. Endpoint: GET /v1/accounts
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Opaque pagination cursor from a previous response's `next_cursor`. |
| external_ref | string | – | Your own id for the account; returns the 0..1 matching accounts. |
| limit | integer | – | Maximum number of accounts to return per page (1–200). Defaults to 50. |
| status | – | – | – |
No output schema declared.
No examples provided.
beel_list_companies ~381
Returns the companies (NIFs) belonging to the account in the path, ordered with the primary company first. An account with no companies yet returns an empty list rather than an error. - **`search`:** filters case-insensitively on NIF, legal name and trade name. - **`include=readiness`:** adds each company's issuing-readiness block. - **`pagination`:** present only when the request is paginated — that is, when any of `page`, `limit` or `search` is sent. It is omitted for the full list. - **Series:** not part of this response. Read them from `GET /v1/companies/{company_id}/series`. Endpoint: GET /v1/accounts/{account_id}/companies ⚠️ Fiscal guardrails — read before calling: - Which company an operation acts on, and how that is selected. (resource: beel://guardrails/multi-nif) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account, or an account you provisioned. It — not the credential — decides which account the operation acts on; a `403` is returned when you do not reach it, the same response an account that… |
| include | – | – | Include derived data. `readiness` adds each company's issuing-readiness status. |
| limit | integer | – | How many items to return per page. The response echoes it back as `pagination.items_per_page`. |
| page | integer | – | Page number, starting at 1. The response echoes it back as `pagination.current_page`. |
| search | string | – | Case-insensitive filter on NIF, legal name or trade name. Blank/omitted returns all. |
No output schema declared.
No examples provided.
beel_list_customers ~376
Returns a paginated list of the customers of this company, with optional filters. Only the customers of the company in the path are returned. Endpoint: GET /v1/companies/{company_id}/customers
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | – | Filter by active/inactive status. Defaults to `true`, so inactive customers must be requested explicitly with `active=false`. Deleted customers are never returned by either value. |
| city | string | – | Filter by city |
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| string | – | Filter by email (partial search) | |
| legal_name | string | – | Filter by legal name (partial search case-insensitive) |
| limit | integer | – | How many items to return per page. The response echoes it back as `pagination.items_per_page`. |
| nif | string | – | Filter by NIF (partial search) |
| page | integer | – | Page number, starting at 1. The response echoes it back as `pagination.current_page`. |
| phone | string | – | Filter by phone (partial search) |
| province | string | – | Filter by province |
| search | string | – | Global search by name, NIF or email |
| sort_by | – | – | Field to sort by. Results are always tie-broken by a stable internal key, so paging through the collection never repeats or skips a customer. |
| sort_order | – | – | Sort order direction |
No output schema declared.
No examples provided.
beel_list_email_deliveries ~417
Returns the emails the system recorded on behalf of the account in the path: invoice deliveries, verification, onboarding. It only reads the history; it does not send or resend anything. - **Every attempt is recorded**, not only the ones that went out: an email stopped by policy is listed with `status` `REJECTED`, and one accepted but not dispatched yet as `QUEUED`, rather than being omitted. - **Order:** by `sent_at` descending, configurable with `sort_by` / `sort_order`. - **Filters:** `type`, `status`, `recipient` and `related_entity_id`. - **`sent_at`:** the moment the message was handed over, so it is absent while an email is still `QUEUED`. - **Scope:** the account is the one named in the path; the environment is not, and comes from the credential. Endpoint: GET /v1/accounts/{account_id}/emails
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account, or an account you provisioned. It — not the credential — decides which account the operation acts on; a `403` is returned when you do not reach it, the same response an account that… |
| limit | integer | – | How many items to return per page. The response echoes it back as `pagination.items_per_page`. |
| page | integer | – | Page number, starting at 1. The response echoes it back as `pagination.current_page`. |
| recipient | string | – | Filter to emails where any recipient contains the term (case-insensitive) |
| related_entity_id | string | – | Filter to emails associated with a given related entity (e.g. an invoice id) |
| sort_by | – | – | Field to sort by |
| sort_order | – | – | Sort order direction |
| status | – | – | Filter by delivery status |
| type | string | – | Filter by email type (e.g. INVOICE_EMITTED) |
No output schema declared.
No examples provided.
beel_list_invitations ~176
Lists the invitations sent to join the account, whatever their `status`. Accepted, revoked and expired invitations stay in the list: the record is the trail of who was granted access to the account's fiscal data. Endpoint: GET /v1/accounts/{account_id}/invitations
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account, or an account you provisioned. It — not the credential — decides which account the operation acts on; a `403` is returned when you do not reach it, the same response an account that… |
| limit | integer | – | How many items to return per page. The response echoes it back as `pagination.items_per_page`. |
| page | integer | – | Page number, starting at 1. The response echoes it back as `pagination.current_page`. |
No output schema declared.
No examples provided.
beel_list_invoice_customization_options ~186
Returns the PDF templates a NIF can be rendered with. For each one, the `code` to send as `template_type` in `PUT /v1/companies/{company_id}/invoice-customization`, plus a name and a short description translated into the language of the user the credential belongs to. The accepted values are already in the `template_type` enum; what this operation adds are the readable labels, so you do not have to show `MODERN_TABLE` to a person. The catalogue is identical for every account and every NIF, so it is not nested under one. **Closed catalogue.** This collection is fixed and bounded: it carries no `pagination`, it takes no `page`/`limit`, and every response holds the whole set. Endpoint: GET /v1/invoice-customization-options
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
beel_list_invoices ~871
Returns a paginated list of the invoices of this company, filterable by status, type, series, customer, date range and free text. Only the documents of the company in the path are returned. Endpoint: GET /v1/companies/{company_id}/invoices ⚠️ Fiscal guardrails — read before calling: - When an invoice can still be changed, and what to do once it cannot. (resource: beel://guardrails/invoice-state-machine) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| customer_id | – | – | Filter by customer UUID |
| date_from | string | – | Issue date from (YYYY-MM-DD) |
| date_to | string | – | Issue date to (YYYY-MM-DD) |
| external_ref | string | – | Filter by exact external reference (client-supplied order/cart/contract id). |
| fiscal_only | boolean | – | When `true`, returns only fiscal documents (STANDARD, CORRECTIVE, SIMPLIFIED), excluding proformas and any other non-fiscal document. Defaults to `false` (the list returns every document type). Ignor… |
| invoice_number | string | – | Search by invoice number (e.g., 2025/0001) |
| limit | integer | – | How many items to return per page. The response echoes it back as `pagination.items_per_page`. |
| metadata | object | – | Filter by metadata key/value pairs (exact match, AND between keys). Repeat the bracket-style param to filter on multiple keys. Max 50 pairs per request. Keys must match `^[A-Za-z0-9_\-.]{1,64}$`. Exa… |
| page | integer | – | Page number, starting at 1. The response echoes it back as `pagination.current_page`. |
| recipient_name | string | – | Filter by recipient's fiscal name (partial, case-insensitive search) |
| recipient_nif | string | – | Filter by recipient's NIF (partial search) |
| rectified_invoice_id | string | – | Return the corrective invoices that correct this invoice. Accepts the id of an issued invoice; a single invoice can have several partial correctives. |
| search | string | – | Global search across invoice number, recipient name, recipient NIF, and series code (partial, case-insensitive) |
| series_code | string | – | Filter by series code (exact match, case-insensitive). Use `search` for partial matching across the invoice number, recipient and series code. |
| sort_by | string | – | Field to sort by (e.g., issue_date, invoice_number, invoice_total) |
| sort_order | – | – | Sort direction |
| status | array | – | Filter by invoice status. Accepts a comma-separated list to match any of several statuses, for example `status=DRAFT,ISSUED`. A single value is also valid. |
| taxable_base_max | number | – | Maximum taxable base |
| taxable_base_min | number | – | Minimum taxable base |
| total_max | number | – | Maximum invoice total |
| total_min | number | – | Minimum invoice total |
| type | – | – | Filter by invoice type |
| verifactu_enabled | boolean | – | Filter by whether VeriFactu is enabled for the invoice — the same flag published as `verifactu.enabled`. `false` returns the invoices that never reach AEAT. |
| verifactu_status | – | – | Filter by the VeriFactu submission status of the invoice, using the very same vocabulary that `verifactu.submission_status` publishes on each invoice. `NOT_SUBMITTED` selects issued invoices with Ver… |
No output schema declared.
No examples provided.
beel_list_member_grants ~241
Lists the companies (NIFs) granted to a `MEMBER` and the `access_level` of each. Empty for `OWNER` and `ADMIN`, who reach every company of the account implicitly and hold no grants. **Paginated** with the usual `page`/`limit`, and the usual defaults: without them you get the first 20 grants, not all of them. Read `data.pagination` to walk the rest. Endpoint: GET /v1/accounts/{account_id}/members/{member_id}/grants
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account, or an account you provisioned. It — not the credential — decides which account the operation acts on; a `403` is returned when you do not reach it, the same response an account that… |
| limit | integer | – | How many items to return per page. The response echoes it back as `pagination.items_per_page`. |
| member_id | string | yes | Membership unique UUID. |
| page | integer | – | Page number, starting at 1. The response echoes it back as `pagination.current_page`. |
No output schema declared.
No examples provided.
beel_list_members ~211
Lists the people with access to the account, each with their `account_role` and, for `MEMBER`s, the companies (NIFs) granted to them. **Paginated** with the usual `page`/`limit`, and the usual defaults: without them you get the first 20 members, not all of them. Read `data.pagination` to walk the rest. Endpoint: GET /v1/accounts/{account_id}/members
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account, or an account you provisioned. It — not the credential — decides which account the operation acts on; a `403` is returned when you do not reach it, the same response an account that… |
| limit | integer | – | How many items to return per page. The response echoes it back as `pagination.items_per_page`. |
| page | integer | – | Page number, starting at 1. The response echoes it back as `pagination.current_page`. |
No output schema declared.
No examples provided.
beel_list_payment_connections ~270
Returns the payment provider connections of a company your account **owns or manages**, with the provider-side account each one points at and its `status`. Use it to check whether a NIF you provisioned has completed its connection. - **A NIF with no connections:** answers `200` with an empty list. - **`environment`:** Test and Live connections are independent, so only the ones living in the mode of the key you ask with are returned; this field states which. **Closed catalogue.** This collection is fixed and bounded — one entry per supported provider at most: it carries no `pagination`, it takes no `page`/`limit`, and every response holds the whole set. Endpoint: GET /v1/companies/{company_id}/payment-connections
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
No output schema declared.
No examples provided.
beel_list_payment_events ~344
Lists the payment events received through the payment provider connection of a NIF (company), most recent first. Use it to audit the charges that produced an invoice and to find the ones that did not. - **Scope:** events belong to the connection, not to the NIF directly. The `{provider}` segment picks the connection of the NIF in the path, and only the events of that connection are returned; an event of another NIF of the same account is never reachable from here. - **No connection:** if the NIF has none for the provider, the request returns `404`. Endpoint: GET /v1/companies/{company_id}/payment-connections/{provider}/events
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the events belong to — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Company… |
| limit | integer | – | How many items to return per page. The response echoes it back as `pagination.items_per_page`. |
| page | integer | – | Page number, starting at 1. The response echoes it back as `pagination.current_page`. |
| provider | string | yes | Payment provider slug in **lowercase**. Currently only `stripe` (Stripe Connect) is operative; `woocommerce` and `shopify` are reserved for future providers. |
No output schema declared.
No examples provided.
beel_list_products ~354
Returns a paginated list of the products/services of this company, with optional filters. - **`q`:** searching is done on this collection, there is no separate search path. `q` matches the name, the code and the description, so it returns at least everything the withdrawn `GET /v1/products/search` returned, in the paginated envelope of this list. Endpoint: GET /v1/companies/{company_id}/products
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | – | Filter by active/inactive status |
| category | – | – | Filter by product category |
| code | string | – | Filter by code (partial search) |
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| limit | integer | – | How many items to return per page. The response echoes it back as `pagination.items_per_page`. |
| max_price | number | – | Maximum price |
| min_price | number | – | Minimum price |
| name | string | – | Filter by name (partial search case-insensitive) |
| page | integer | – | Page number, starting at 1. The response echoes it back as `pagination.current_page`. |
| q | string | – | Search by name, code or description |
| sort_by | – | – | Field to sort by |
| sort_order | – | – | Sort order direction |
No output schema declared.
No examples provided.
beel_list_recurring_invoices ~334
Lists the recurring invoice templates of this company, with filters and pagination. Only the templates of the company in the path are returned. Endpoint: GET /v1/companies/{company_id}/recurring-invoices ⚠️ Fiscal guardrails — read before calling: - How BeeL derives the AEAT invoice type, and the rules each type imposes. (resource: beel://guardrails/invoice-types) - What regime_key means, where it lives, and which combinations are rejected. (resource: beel://guardrails/regime-keys) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| customer_id | string | – | – |
| limit | integer | – | How many items to return per page. The response echoes it back as `pagination.items_per_page`. |
| page | integer | – | Page number, starting at 1. The response echoes it back as `pagination.current_page`. |
| sort_by | – | – | Field to sort by. Defaults to `created_at` when omitted. |
| sort_order | – | – | Sort direction. Defaults to `desc` when omitted. |
| status | – | – | – |
No output schema declared.
No examples provided.
beel_list_request_logs ~506
Returns the history of public API requests made by you, with any of your API keys in this environment — not only the key you are authenticating with. Only `auth_type=API_KEY` traffic is recorded. - **The axis is the person, not the individual credential:** a second key of yours sees the same history, and narrowing it to one key is a filter (`api_key_id`), not the default. - **It is still not the account's traffic:** requests made by other users of the same account, or by their API keys, are never returned. The `{account_id}` in the path authorizes the call; it does not widen what you can see. - **Environment is not a filter:** results are always scoped to the environment of the credential you authenticate with — a `beel_sk_test_*` key sees the test traffic of all your test keys, a `beel_sk_live_*` key the live traffic of all your live ones. To see the other environment, use a key from that environment. - **Cursor pagination:** navigate with the opaque `cursor` returned in `next_cursor` / `prev_cursor`; there is no jump to an arbitrary page N. - **Time window:** defaults to the last 30 days; narrow or move it with `from`/`to`. Endpoint: GET /v1/accounts/{account_id}/request-logs
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Account the call is authorized against. It does not widen the result set. |
| api_key_id | string | – | Narrow the result to one of your API keys. Any key of yours in this environment is accepted, not just the one you authenticate with; a key belonging to someone else simply yields no results. |
| cursor | string | – | Opaque cursor returned by a previous response (next_cursor / prev_cursor). |
| from | string | – | Lower bound of the time range (inclusive). Defaults to 30 days ago. |
| http_status | integer | – | Filter by an exact HTTP status code. |
| limit | integer | – | – |
| method | string | – | Filter by HTTP method. |
| only_errors | boolean | – | If true, only requests with status >= 400. |
| path_contains | string | – | Filter by path substring (case-insensitive). |
| to | string | – | Upper bound of the time range (inclusive). Defaults to now. |
No output schema declared.
No examples provided.
beel_list_series ~397
Returns the invoice series of a company. - **Filters:** `active` restricts to active or inactive series — omit it and you get all of them. `document_type` filters by type and always includes the `UNASSIGNED` series, which are compatible with any type. - **Pagination (opt-in):** send `page` and/or `limit` to receive a single page plus a `data.pagination` block with the totals. Omit both and the response carries the full list in `data.series` and no `pagination` block. Endpoint: GET /v1/companies/{company_id}/series ⚠️ Fiscal guardrails — read before calling: - How invoice numbers are formed, and why numbering can never be rewritten. (resource: beel://guardrails/series-and-numbering) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | – | Filters by activity: `true` returns only active series, `false` only inactive ones. Omit it and you get **all** the series, active and inactive. |
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| document_type | – | – | Filter by document type (UNASSIGNED series are always included) |
| limit | integer | – | Items per page. Omit for the full, unpaginated list. |
| page | integer | – | Page number (starts at 1). Omit for the full, unpaginated list. |
No output schema declared.
No examples provided.
beel_list_stats ~431
Returns, for each company of the account, how many fiscal documents it has issued and when it last issued one. - **`invoice_count`:** drafts, scheduled invoices and proformas are not counted; a rectifying invoice counts as a document of its own, and a voided invoice counts only when a live rectifying invoice compensates it. - **`last_invoice_at`:** issue date of the most recent document in that same set, or `null` when there is none. - **Not a cursor:** the count is not monotonic — voiding an uncompensated invoice lowers it and moves `last_invoice_at` backwards — so do not synchronise on it. **Paginated** with the usual `page`/`limit`, and the usual defaults: without them you get the stats of the first 20 companies, not of all of them. One row per company, over the same universe and in the same order as `GET /v1/accounts/{account_id}/companies` — `search` included — so asking both with the same `page`, `limit` and `search` lines the two responses up company by company. Endpoint: GET /v1/accounts/{account_id}/companies/stats
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account, or an account you provisioned. It — not the credential — decides which account the operation acts on; a `403` is returned when you do not reach it, the same response an account that… |
| limit | integer | – | How many items to return per page. The response echoes it back as `pagination.items_per_page`. |
| page | integer | – | Page number, starting at 1. The response echoes it back as `pagination.current_page`. |
| search | string | – | Case-insensitive filter on NIF, legal name or trade name — the same filter, over the same universe, as the one `GET /v1/accounts/{account_id}/companies` applies. Blank or omitted returns all. |
No output schema declared.
No examples provided.
beel_list_tax_types ~328
Returns the tax regimes and percentages that Spanish law allows on an invoice. Use it to validate a rate before sending it, or to build your own picker instead of hard-coding the percentages. - **Contents:** VAT (mainland), IGIC (Canary Islands), IPSI (Ceuta and Melilla), the withholding (IRPF) percentages, the equivalence surcharge that corresponds to each VAT rate, and the exemption reasons with the classification each one implies. - **Scope:** the catalogue is the same for every credential and does not depend on any account or on any NIF, so the operation takes no identifier and works before the first NIF exists. ## VAT rates and the zero case - **VAT lists 4, 5, 10 and 21, and deliberately not 0:** under VAT (and IPSI) a 0 % is not a rate but the exemption/non-subject sentinel, and on its own it says nothing. A 0 % line is only valid together with an `exemption_reason`, which this same response publishes under `exemption_reasons`. - **IGIC does list 0:** there it is the real "Tipo Cero" and needs no reason. - **The 5 % VAT rate (RD-ley 11/2022):** kept even though it no longer applies to new operations, because correctives and late filings for those periods still need it. Endpoint: GET /v1/tax-types
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
beel_list_webhook_deliveries ~329
Returns the delivery attempts of this subscription, newest first. Each entry records one attempt with the response it got, so a retried event appears once per attempt. - **`event_type`:** narrows the list to a single event type. - **`event_id`:** follows one event across every attempt made on it, without paging through the whole history. Endpoint: GET /v1/accounts/{account_id}/webhooks/{webhook_id}/deliveries
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account, or an account you provisioned. It — not the credential, and not the `BeeL-Active-Company` header — decides which account the operation acts on. An account you do not reach answers `… |
| event_id | string | – | Only deliveries of this event. Use it to follow every attempt on one event without paging through the whole history. |
| event_type | string | – | Only deliveries of this event type. |
| limit | integer | – | How many items to return per page. The response echoes it back as `pagination.items_per_page`. |
| page | integer | – | Page number, starting at 1. The response echoes it back as `pagination.current_page`. |
| webhook_id | string | yes | Subscription of the account in the path. A subscription of another account answers `404`, the same as one that does not exist: under the account resolved from `{account_id}` it simply is not there. |
No output schema declared.
No examples provided.
beel_list_webhook_subscriptions ~198
Returns the webhook subscriptions of the account in the path, active and inactive alike. Every member of the account sees the same list: who registered a subscription is authorship, not visibility. The signing secrets are never included. Endpoint: GET /v1/accounts/{account_id}/webhooks
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account, or an account you provisioned. It — not the credential, and not the `BeeL-Active-Company` header — decides which account the operation acts on. An account you do not reach answers `… |
| limit | integer | – | How many items to return per page. The response echoes it back as `pagination.items_per_page`. |
| page | integer | – | Page number, starting at 1. The response echoes it back as `pagination.current_page`. |
No output schema declared.
No examples provided.
beel_patch_company ~538
Updates the editable fields of a company; the set is the one `UpdateCompanyRequest` declares. - **Immutable fields:** `nif`, `entity_type` and `legal_form`, once set. - **`legal_name`:** changing it requires the NIF to pass an AEAT census re-validation — which for a company checks the CIF only, so it cannot fail because of the name sent. ## Test credentials on a Live company Once the company is activated in Live, a test credential may only write the fields that affect how the invoice looks: `logo_url`, `invoice_accent_color`, `invoice_template_type`, `invoice_language`, `email_language` and `additional_info`. Any other field describes the real business — fiscal address, legal representative, bank details, contact data, IAE, activity start date, payment term — and answers `422 FISCAL_IDENTITY_LIVE_ONLY` from Test, since the company is a single record shared by both modes. A company not activated in Live accepts the whole body from Test, and sending a field its current value is never a change. ## What comes back The `200` returns `CompanyData` with **every field this request accepts**, under the same name and the same type — so the response is the confirmation of what was stored, and a later `GET` says the same. A field you never set comes back absent, which means "nothing stored", not "hidden". Two things live outside this body and keep their own reads: the invoice series (`GET /v1/companies/{company_id}/series`) and the rendering block, which is also served on its own by `GET /v1/companies/{company_id}/invoice-customization`. Endpoint: PATCH /v1/companies/{company_id} ⚠️ Fiscal guardrails — read before calling: - Which company an operation acts on, and how that is selected. (resource: beel://guardrails/multi-nif) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
No output schema declared.
No examples provided.
beel_patch_customer ~227
Updates only the fields present in the body, leaving every other field of the customer as it is. - **Null vs omitted:** a field sent as `null` is cleared, which is different from omitting it (see `PatchCustomerRequest`). - **Only update verb:** this is the canonical way to edit a customer. There is no `PUT` of full replacement under the company, which would clear the fields you omit. Endpoint: PATCH /v1/companies/{company_id}/customers/{customer_id}
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| customer_id | – | yes | Customer ID |
No output schema declared.
No examples provided.
beel_patch_invoice ~279
Updates only the fields present in the body, leaving every other field of the invoice as it is. - **Status:** only a draft invoice can be modified. An issued one is amended with a corrective invoice (`POST …/{invoice_id}/corrective`) or voided. - **Series:** changing `series_id` never moves the invoice to another NIF — a series of another company is not visible from here. Endpoint: PATCH /v1/companies/{company_id}/invoices/{invoice_id} ⚠️ Fiscal guardrails — read before calling: - When an invoice can still be changed, and what to do once it cannot. (resource: beel://guardrails/invoice-state-machine) For the exhaustive rules and worked examples, call beel_docs_search.
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| invoice_id | – | yes | Invoice ID |
No output schema declared.
No examples provided.
beel_patch_member ~191
Changes a member's `account_role` between `ADMIN` and `MEMBER`. - **`OWNER`:** not an assignable value here. An account has exactly one owner, and ownership is handed over only through `PUT /v1/accounts/{account_id}/owner`, which promotes the new owner and steps the current one down in the same operation. - **Last owner:** the account's last `OWNER` cannot be demoted. Endpoint: PATCH /v1/accounts/{account_id}/members/{member_id}
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Your own account, or an account you provisioned. It — not the credential — decides which account the operation acts on; a `403` is returned when you do not reach it, the same response an account that… |
| body | – | yes | – |
| member_id | string | yes | Membership unique UUID. |
No output schema declared.
No examples provided.
beel_patch_product ~252
Updates only the fields present in the body, leaving every other field of the product as it is — in particular `main_tax`, `irpf_rate` and `equivalence_surcharge_rate`. - **Null vs omitted:** a field sent as `null` is cleared, which is different from omitting it (see `PatchProductRequest`). - **Only update verb:** the total replacement `PUT /v1/products/{product_id}`, which reset the omitted fields to their creation defaults, is not carried over to the canonical form. Endpoint: PATCH /v1/companies/{company_id}/products/{product_id}
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | yes | – |
| company_id | string | yes | Unique identifier (UUID) of the company the operation acts on — its identifier, not its NIF. It is the only source of context: the account that owns it is derived from it, and the `BeeL-Active-Compan… |
| product_id | string | yes | Product unique UUID |
No output schema declared.
No examples provided.
What is the BeeL MCP server?
BeeL is an MCP server listed in the public MCP registry as es.beel/mcp. Spanish e-invoicing with VeriFactu (AEAT): issue invoices, manage customers, validate NIFs. This page covers its hosted endpoint (https://mcp.beel.es/mcp).
Is the BeeL MCP server safe to use?
BeeL scores 38 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the BeeL MCP server expose?
BeeL exposes 121 tools: beel_activate_company, beel_cancel_representation, beel_change_managed_access_level, beel_convert_proforma_to_invoice, beel_create_claim_token, and 116 more. Their descriptions and schemas cost roughly 37,184 tokens of context every time the server is loaded.
Does the BeeL MCP server require authentication?
Yes. BeeL asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.
Is the BeeL MCP server still maintained?
BeeL is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.