NewStripe: a buyer with a NIF always gets a standard invoice, and the simplified threshold is deprecated
BeeL
Get startedMulti-NIFVeriFactuRulesStripeAPI referenceChangelog

Changelog

Every change to the BeeL. API, newest first — what moved, when the old way stops working, and how to tell whether it affects you.


Most changes are one entry here. A few are big enough to need the old-to-new route table, the retirement calendar and a way to check your own integration against it — those keep their entry in this list and link to the full note.

Every deprecated route also tells you the same thing in its own responses — Deprecation: true, a Sunset date and Link: <successor>; rel="successor-version" — so you never have to trust a page over your own traffic.

Improved

Stripe: a buyer with a NIF always gets a standard invoice, and the simplified threshold is deprecated

Three changes to how a connected Stripe account is invoiced. None of them changes an invoice that already exists, and no request or response changes shape.

  • A buyer with a NIF (or foreign identifier) and a complete address always receives a STANDARD invoice, whatever the amount. Before, a charge below the connection's threshold was issued as SIMPLIFIED, which never carries the buyer's NIF. Without that data the charge still gets a SIMPLIFIED invoice up to 3 000 €.
  • A charge that cannot be invoiced is saved as a draft instead of waiting as a skipped event: a charge above 3 000 € whose buyer has no NIF or address, and a charge whose NIF the AEAT definitively rejects. The draft appears in Needs attention, and on Live connections BeeL. emails the issuer. Complete the recipient and issue it.
  • simplificada_threshold is deprecated. The API still accepts and returns it, with the same validation, but its value no longer affects the invoice type. You can stop sending it.
  • What to do: nothing is required. If you relied on the threshold to keep small sales to identified buyers as simplified invoices, those sales are now standard invoices. To avoid drafts, collect tax IDs and the full billing address in Stripe.
  • GET/v1/companies/{company_id}/payment-connectionssimplificada_threshold is returned but deprecated and ignored
  • PATCH/v1/companies/{company_id}/payment-connections/{connection_id}simplificada_threshold is still accepted but deprecated and ignored
Improved

Stripe: manual 0 % rates and the buyer's country on paid invoices

Two changes to how a connected Stripe account is invoiced. Neither one changes an invoice that already exists.

  • A manual 0 % tax rate in Stripe no longer leaves the charge without an invoice when the buyer is in the peninsula or the Balearic Islands. This is the rate some platforms create by default. BeeL. applies the default exemption reason your company declared, or asks you to declare it. Buyers in the Canary Islands, Ceuta or Melilla, buyers from other countries, and payments with no postal code still wait in Needs attention.
  • invoice.paid now sees the buyer's country. When neither the Stripe invoice nor its customer carries one, BeeL. takes it from the billing address of the payment that paid the invoice, so both events of the same charge see the same buyer.
  • A buyer outside Spain with an incomplete address is no longer invoiced as if the sale were Spanish. If the sale cannot go on a simplified invoice, the charge waits with a draft to complete, as it already did for the payment event.
  • What to do: if you sell exempt with a 0 % rate in Stripe, declare your default exemption reason in BeeL. under Settings > Taxes. If you sell outside Spain, collect the full billing address (street, city, postal code and country) at checkout.
Breaking
Breaking
Breaking
Breaking
Breaking
Breaking
New

Exchange simplified invoices for a full invoice

When a customer who paid with a simplified invoice asks for an invoice with their details, POST /v1/companies/{company_id}/invoices/simplified-exchanges issues a STANDARD invoice with the lines of up to 50 simplified invoices and the recipient you send. It is not a corrective invoice: it documents the same operations again, identifying the customer.

The new invoice lists the ones it replaces in replaced_invoice_ids, and each simplified invoice becomes VOIDED with the new void_cause value EXCHANGED, in the same act. The exchange invoice cannot be voided afterwards; if it is wrong, correct it with a corrective invoice.

When the invoice would be recorded with VeriFactu, the request answered 422 SIMPLIFIED_EXCHANGE_NOT_RECORDABLE and nothing was issued.

Update: with VeriFactu the exchange invoice is now issued and recorded as F3, and SIMPLIFIED_EXCHANGE_NOT_RECORDABLE only names a simplified invoice issued without VeriFactu. An F3 exchange invoice cannot be corrected yet. See Simplified invoice exchanges are recorded with VeriFactu.

  • Rejections: 422 EXCHANGE_REQUIRES_SIMPLIFIED when an id is not a simplified invoice; 422 SIMPLIFIED_NOT_EXCHANGEABLE when it is not issued, or was already voided, exchanged or corrected; voiding the exchange invoice answers 422 EXCHANGE_INVOICE_NOT_VOIDABLE.
  • If you read void_cause with a strict enum, add EXCHANGED; replaced_invoice_ids is a new optional field on every invoice response.
  • POST/v1/companies/{company_id}/invoices/simplified-exchangesNew: a full invoice in exchange for simplified invoices
Breaking
Breaking
Breaking
Breaking
Breaking
New

Member grants carry the company's name

Each grant in a member's response and in the grants list now carries company_name next to company_id, so you can name the company without resolving every id against the account's companies. It is optional and may be null for a company that has no name yet. It never falls back to the id.

  • GET/v1/accounts/{account_id}/members/{member_id}/grantsEach grant carries company_name
Breaking
Breaking
Breaking
Breaking
Breaking
Breaking

Two never-documented payment-connection operations are gone today; on 11 December 2026 charges_only defaults to true and three counts fields and four schema aliases retire.

Retired today: GET …/payment-connections/{connection_id} (now 405) and POST …/payment-connections/{connection_id}/reactivations (now 404)No operation is deprecated: listing, opening an authorization and reading a single event stay documented and servedOn 11 December 2026 omitting charges_only on the event listing reads as charges_only=true; until then a request that omits it answers with Deprecation, Sunset and Linkcounts.ignored, counts.needs_action, counts.by_failure_reason and the four *ManagedPaymentEventResponse aliases retire the same day

Breaking
Breaking
Breaking
Breaking
Breaking
Improved

VeriFactu is always on in sandbox

Creating a company in sandbox is asking for a VeriFactu test bench, so the configuration is now born enabled and the NIF is registered with the provider on the first submission — no explicit step. In Live nothing changes: enabling VeriFactu there is still a deliberate act by the taxpayer.

No existing configuration was touched.

Breaking
Breaking
Breaking
Breaking
Breaking
Breaking
Breaking

Lists answer data.<plural>, deletes answer 204 unless the body informs, and every create returns Location. DELETE products/bulk takes ?ids= instead of a body.

Lists: data is never a bare array anymore. Six lists that answered data: [...] + root pagination (companies of an account, series, recurring invoices, payment events, request logs, sent emails) now answer data.<plural> + data.pagination — deprecated flat aliases included, since they share the schema. Five unpaginated lists (company stats, email indicators, payment connections, recurring history, series defaults) are wrapped in data.{plural} with no pagination block.Deletes: DELETE .../customers/{id} and DELETE .../representation now answer 204 with no body — their old 200 bodies carried nothing you could not already know. Bulk deletes and DELETE .../activations keep their 200 body (partial results and the computed effective_at are only knowable from the response).DELETE /v1/companies/{company_id}/products/bulk no longer takes a request body — a body on DELETE has no defined semantics and intermediaries may drop it. Send ?ids= (comma-separated, max 100 per request), same as customers/bulk.Every single-resource 201 now carries a Location header pointing at the created resource's canonical GET — including actions that produce a resource (corrective, convert, derivations, generate, payment-event draft). Claim tokens point at their claim_url. Bulk creations carry none: there is no single URI to point at.PUT /v1/configuration/series/{series_id} is now deprecated like the rest of the flat series routes. It has no drop-in successor: the canonical PATCH /v1/companies/{company_id}/series/{series_id} behaves the same for every body except an explicit description: null, which the old PUT ignored and the PATCH honours by clearing the field.Declarative sweep: every live operation now documents 429 and 500, every tag is declared, and the account companies operations moved from the PublicCompanies tag to AccountCompanies.These changes ship without a grace window: measured traffic on the affected shapes was test-mode only. If your integration reads any of the old list shapes, adapt the paths above — everything else about each operation is unchanged.

Improved

A webhook URL on a private network is rejected when you register it

Registering or changing a subscription URL that points to a private or internal network address now answers 422 URL_TARGET_NOT_ALLOWED, instead of creating a subscription that would never receive a delivery. A host that does not resolve yet is still accepted, so you can register before your DNS is live.

Breaking

The invoice field first announced as external_reference is now called external_ref. Responses already emit the new name; the old one is still accepted when you write, as a deprecated alias.

Responses emit external_ref — the old name is no longer returnedWrites still accept external_reference, as a deprecated aliasAffects the request body of the create-invoice routes and the GET /v1/invoices query filterNothing has stopped working, and no removal date is announced yet

Breaking

New: an account can hold several NIFs, each addressed in the path. As a result the old flat routes are deprecated — 82 operations gain a Sunset date, and all but three a successor route, and keep answering until then.

82 operations are deprecated, each with a Sunset date and, for all but three, a successor routeNothing is removed — every deprecated route keeps answering until its Sunset dateDeprecated routes carry Deprecation: true, Sunset and, where a successor is declared, Link: <successor>; rel="successor-version"The three replacing PUTs (customer, product, recurring invoice) declare no successor: the canonical PATCH merges instead of replacing, so it is not a drop-in

Breaking
Breaking
Breaking
Breaking
Breaking