Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

BeeL

NPM · @BEEL_ES/MCP · 2 COMPONENTS · SCANNED SEP 20

Spanish e-invoicing with VeriFactu (AEAT): issue invoices, manage customers, validate NIFs.

+3 this week 93 Trust /100
Trust breakdown (7 categories)

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
Install

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

# add to Claude Code
claude mcp add es-beel-mcp -- npx -y @beel_es/mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "es-beel-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@beel_es/mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "es-beel-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@beel_es/mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add es-beel-mcp -- npx -y @beel_es/mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "es-beel-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@beel_es/mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add es-beel-mcp --command npx --arg -y --arg @beel_es/mcp
# ~/.hermes/config.yaml
mcp_servers:
  es-beel-mcp:
    command: "npx"
    args: ["-y", "@beel_es/mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "es-beel-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@beel_es/mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add es-beel-mcp -t stdio -c npx -a -y @beel_es/mcp
// mcp.json
{
  "mcpServers": {
    "es-beel-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@beel_es/mcp"
      ]
    }
  }
}
Changelog

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.

Diagnostics

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 →

MCP tools · 121 exposed · ~37,184 tokens

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 →

Tool Tokens
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

NameTypeReqDescription
account_idstringyesYour 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_idsarrayyesComma-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

NameTypeReqDescription
company_idstringyesUnique 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_datestringPeriod 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_datestringPeriod 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}

NameTypeReqDescription
account_idstringyesYour 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_idstringyes

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.

NameTypeReqDescription
company_idstringyesUnique 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_idyesInvoice 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

NameTypeReqDescription
company_idstringyesUnique 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

NameTypeReqDescription
company_idstringyesUnique 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_idyesInvoice 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

NameTypeReqDescription
company_idstringyesUnique 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_idyesInvoice 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.

NameTypeReqDescription
company_idstringyesUnique 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_idyesInvoice 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.

NameTypeReqDescription
company_idstringyesUnique 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}

NameTypeReqDescription
account_idstringyesYour 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_idstringyesMembership 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}

NameTypeReqDescription
company_idstringyesUnique 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_idstringyesIdentifier of the payment event, as returned by the list operation.
providerstringyesPayment 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}

NameTypeReqDescription
company_idstringyesUnique 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_idstringyesProduct 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.

NameTypeReqDescription
company_idstringyesUnique 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_idstringyes

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.

NameTypeReqDescription
company_idstringyesUnique 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…
limitintegerHow many items to return per page. The response echoes it back as `pagination.items_per_page`.
pageintegerPage number, starting at 1. The response echoes it back as `pagination.current_page`.
recurring_invoice_idstringyes

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.

NameTypeReqDescription
company_idstringyesUnique 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_idstringyes

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

NameTypeReqDescription
company_idstringyesUnique 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}

NameTypeReqDescription
account_idstringyesAccount the call is authorized against. It does not widen the result set.
request_idstringyesCorrelation identifier (X-Request-Id).
timestampstringLog 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.

NameTypeReqDescription
company_idstringyesUnique 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_idyesSeries 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.

NameTypeReqDescription
company_idstringOptional: 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.
NameTypeReqDescription
accountobjectyesThe authenticated account, or an error note if identity could not be read.
companiesarrayyes
environmentstringyesWhich BeeL environment this session operates on. `live` means every invoice issued is a real fiscal document.
errorstringWhy the report is incomplete: the company listing failed, a filter matched nothing, or entries were unusable. Present only when something went wrong.
next_actionstringyesSingle 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

NameTypeReqDescription
company_idstringyesUnique 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

NameTypeReqDescription
account_idstringyesYour 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.

NameTypeReqDescription
company_idstringyesUnique 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}

NameTypeReqDescription
account_idstringyesYour 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_idstringyesSubscription 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

NameTypeReqDescription
bodyyes
company_idstringyesUnique 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_keystringOptional 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.

NameTypeReqDescription
attach_source_invoicesbooleanOnly 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_idstringyesUnique 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_keystringOptional 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_idyesInvoice ID
wait_for_pdfbooleanIf `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

NameTypeReqDescription
cursorstringOpaque pagination cursor from a previous response's `next_cursor`.
external_refstringYour own id for the account; returns the 0..1 matching accounts.
limitintegerMaximum 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.

NameTypeReqDescription
account_idstringyesYour 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…
includeInclude derived data. `readiness` adds each company's issuing-readiness status.
limitintegerHow many items to return per page. The response echoes it back as `pagination.items_per_page`.
pageintegerPage number, starting at 1. The response echoes it back as `pagination.current_page`.
searchstringCase-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

NameTypeReqDescription
activebooleanFilter 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.
citystringFilter by city
company_idstringyesUnique 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…
emailstringFilter by email (partial search)
legal_namestringFilter by legal name (partial search case-insensitive)
limitintegerHow many items to return per page. The response echoes it back as `pagination.items_per_page`.
nifstringFilter by NIF (partial search)
pageintegerPage number, starting at 1. The response echoes it back as `pagination.current_page`.
phonestringFilter by phone (partial search)
provincestringFilter by province
searchstringGlobal search by name, NIF or email
sort_byField 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_orderSort 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

NameTypeReqDescription
account_idstringyesYour 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…
limitintegerHow many items to return per page. The response echoes it back as `pagination.items_per_page`.
pageintegerPage number, starting at 1. The response echoes it back as `pagination.current_page`.
recipientstringFilter to emails where any recipient contains the term (case-insensitive)
related_entity_idstringFilter to emails associated with a given related entity (e.g. an invoice id)
sort_byField to sort by
sort_orderSort order direction
statusFilter by delivery status
typestringFilter 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

NameTypeReqDescription
account_idstringyesYour 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…
limitintegerHow many items to return per page. The response echoes it back as `pagination.items_per_page`.
pageintegerPage 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.

NameTypeReqDescription
company_idstringyesUnique 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_idFilter by customer UUID
date_fromstringIssue date from (YYYY-MM-DD)
date_tostringIssue date to (YYYY-MM-DD)
external_refstringFilter by exact external reference (client-supplied order/cart/contract id).
fiscal_onlybooleanWhen `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_numberstringSearch by invoice number (e.g., 2025/0001)
limitintegerHow many items to return per page. The response echoes it back as `pagination.items_per_page`.
metadataobjectFilter 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…
pageintegerPage number, starting at 1. The response echoes it back as `pagination.current_page`.
recipient_namestringFilter by recipient's fiscal name (partial, case-insensitive search)
recipient_nifstringFilter by recipient's NIF (partial search)
rectified_invoice_idstringReturn the corrective invoices that correct this invoice. Accepts the id of an issued invoice; a single invoice can have several partial correctives.
searchstringGlobal search across invoice number, recipient name, recipient NIF, and series code (partial, case-insensitive)
series_codestringFilter by series code (exact match, case-insensitive). Use `search` for partial matching across the invoice number, recipient and series code.
sort_bystringField to sort by (e.g., issue_date, invoice_number, invoice_total)
sort_orderSort direction
statusarrayFilter 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_maxnumberMaximum taxable base
taxable_base_minnumberMinimum taxable base
total_maxnumberMaximum invoice total
total_minnumberMinimum invoice total
typeFilter by invoice type
verifactu_enabledbooleanFilter by whether VeriFactu is enabled for the invoice — the same flag published as `verifactu.enabled`. `false` returns the invoices that never reach AEAT.
verifactu_statusFilter 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

NameTypeReqDescription
account_idstringyesYour 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…
limitintegerHow many items to return per page. The response echoes it back as `pagination.items_per_page`.
member_idstringyesMembership unique UUID.
pageintegerPage 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

NameTypeReqDescription
account_idstringyesYour 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…
limitintegerHow many items to return per page. The response echoes it back as `pagination.items_per_page`.
pageintegerPage 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

NameTypeReqDescription
company_idstringyesUnique 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

NameTypeReqDescription
company_idstringyesUnique 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…
limitintegerHow many items to return per page. The response echoes it back as `pagination.items_per_page`.
pageintegerPage number, starting at 1. The response echoes it back as `pagination.current_page`.
providerstringyesPayment 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

NameTypeReqDescription
activebooleanFilter by active/inactive status
categoryFilter by product category
codestringFilter by code (partial search)
company_idstringyesUnique 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…
limitintegerHow many items to return per page. The response echoes it back as `pagination.items_per_page`.
max_pricenumberMaximum price
min_pricenumberMinimum price
namestringFilter by name (partial search case-insensitive)
pageintegerPage number, starting at 1. The response echoes it back as `pagination.current_page`.
qstringSearch by name, code or description
sort_byField to sort by
sort_orderSort 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.

NameTypeReqDescription
company_idstringyesUnique 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_idstring
limitintegerHow many items to return per page. The response echoes it back as `pagination.items_per_page`.
pageintegerPage number, starting at 1. The response echoes it back as `pagination.current_page`.
sort_byField to sort by. Defaults to `created_at` when omitted.
sort_orderSort 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

NameTypeReqDescription
account_idstringyesAccount the call is authorized against. It does not widen the result set.
api_key_idstringNarrow 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.
cursorstringOpaque cursor returned by a previous response (next_cursor / prev_cursor).
fromstringLower bound of the time range (inclusive). Defaults to 30 days ago.
http_statusintegerFilter by an exact HTTP status code.
limitinteger
methodstringFilter by HTTP method.
only_errorsbooleanIf true, only requests with status >= 400.
path_containsstringFilter by path substring (case-insensitive).
tostringUpper 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.

NameTypeReqDescription
activebooleanFilters by activity: `true` returns only active series, `false` only inactive ones. Omit it and you get **all** the series, active and inactive.
company_idstringyesUnique 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_typeFilter by document type (UNASSIGNED series are always included)
limitintegerItems per page. Omit for the full, unpaginated list.
pageintegerPage 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

NameTypeReqDescription
account_idstringyesYour 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…
limitintegerHow many items to return per page. The response echoes it back as `pagination.items_per_page`.
pageintegerPage number, starting at 1. The response echoes it back as `pagination.current_page`.
searchstringCase-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

NameTypeReqDescription
account_idstringyesYour 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_idstringOnly deliveries of this event. Use it to follow every attempt on one event without paging through the whole history.
event_typestringOnly deliveries of this event type.
limitintegerHow many items to return per page. The response echoes it back as `pagination.items_per_page`.
pageintegerPage number, starting at 1. The response echoes it back as `pagination.current_page`.
webhook_idstringyesSubscription 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

NameTypeReqDescription
account_idstringyesYour 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 `…
limitintegerHow many items to return per page. The response echoes it back as `pagination.items_per_page`.
pageintegerPage 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.

NameTypeReqDescription
bodyyes
company_idstringyesUnique 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}

NameTypeReqDescription
bodyyes
company_idstringyesUnique 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_idyesCustomer 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.

NameTypeReqDescription
bodyyes
company_idstringyesUnique 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_idyesInvoice 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}

NameTypeReqDescription
account_idstringyesYour 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…
bodyyes
member_idstringyesMembership 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}

NameTypeReqDescription
bodyyes
company_idstringyesUnique 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_idstringyesProduct unique UUID

No output schema declared.

No examples provided.

Common questions

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.