BeeL
NPM · @BEEL_ES/MCP · 2 COMPONENTS · SCANNED SEP 20
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 from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- No production dependencies, so there is no dependency health to assess. View diagnostics → Pass
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to beel-es/beel-mcp). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 20 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability75
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 37628 tokens (~282/item across 133 items; 121 tools + 12 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management84
- Stability check failed: the tool surface changed between 0.3.1 and 0.5.0: 7 tool removals, 0 breaking changes, 6 additions. See how to fix → Fail
Tool Coverage95
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 84% of tool parameters carry a description.Partial
- Structured output schemas are declared (1% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 17 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 123 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
- Supports UI / widget rendering.Pass
How do I install the BeeL MCP server?
BeeL runs locally as an npm package, launched with npx -y @beel_es/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @beel_es/mcp
claude mcp add es-beel-mcp -- npx -y @beel_es/mcp
{
"mcpServers": {
"es-beel-mcp": {
"command": "npx",
"args": [
"-y",
"@beel_es/mcp"
]
}
}
} {
"servers": {
"es-beel-mcp": {
"command": "npx",
"args": [
"-y",
"@beel_es/mcp"
]
}
}
} codex mcp add es-beel-mcp -- npx -y @beel_es/mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"es-beel-mcp": {
"type": "local",
"command": [
"npx",
"-y",
"@beel_es/mcp"
],
"enabled": true
}
}
} openclaw mcp add es-beel-mcp --command npx --arg -y --arg @beel_es/mcp
mcp_servers:
es-beel-mcp:
command: "npx"
args: ["-y", "@beel_es/mcp"] {
"McpServers": {
"es-beel-mcp": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"@beel_es/mcp"
]
}
}
} assistant mcp add es-beel-mcp -t stdio -c npx -a -y @beel_es/mcp
{
"mcpServers": {
"es-beel-mcp": {
"command": "npx",
"args": [
"-y",
"@beel_es/mcp"
]
}
}
} 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.
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 81 to 84.
- 18 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 74 to 78.
- 15 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 64 to 68.
- 13 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 58 to 61.
- 11 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 51 to 54.
- 9 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 44 to 48.
- 7 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 38 to 41.
- 5 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 31 to 34.
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 20 Sept 2026 · Analysed npm/@beel_es/mcp@0.5.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | beel-es/beel-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/beel-es/beel-mcp/.github/workflows/publish.yml@refs/tags/v0.5.0 |
| Rekor log index | 2650467297 |
| Predicate type | https://slsa.dev/provenance/v1 |
| Subject digest | sha512:ecdf573e9debf162b111be5a62316b312361b1629b28ca822dec313a5027f454df2b9e1abcbb23e90b29185136c448c2a8456249353a3eaa846f0878b |
Background: How many MCP packages publish verified provenance →
Dependencies 0 packages
| Packages resolved | 0 |
|---|---|
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
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 npm package (@beel_es/mcp).
Is the BeeL MCP server safe to use?
BeeL scores 93 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. 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.
Is the BeeL MCP server still maintained?
BeeL is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the BeeL MCP server under?
BeeL declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.