Proforma
How the proforma flow works in the BeeL API.
A proforma is a non-fiscal commercial document, a formal quote you send a customer
before invoicing. It lives on the same /invoices resource as any other document,
so you work with it through the invoice endpoints using type=PROFORMA. There is no
separate proforma resource.
What makes it non-fiscal
A proforma never enters VeriFactu, so it carries no QR and is never submitted to the
AEAT. It also consumes no invoice quota. It gets its own numbering from a dedicated
non-fiscal series, so its number always looks like PRO-2026-0001.
The flow
A proforma has a single working state, ACTIVE. It does not go through the fiscal
draft and issue cycle.
- Create. You create it with
type=PROFORMAand it is bornACTIVE, already numbered. You can edit or delete it freely, and there is no separate "issue" step. - Review. The proforma stays
ACTIVEwhile the customer looks at the offer. - Convert. When the customer accepts, you convert the proforma into a real
STANDARDinvoice. The proforma stays on record as proof of what was accepted, and the new invoice keeps a link back to it.
If the customer never accepts, you have two choices. You can void the proforma, which cancels the offer but keeps it in your records, or you can delete it if it was never sent and you just want it gone. Voiding a proforma is a plain status change, with no corrective invoice and nothing sent to the AEAT.
Offer validity
You can set an optional valid_until date. Once that date passes, the API reports the
proforma as EXPIRED. This is only a signal. The proforma is still ACTIVE
underneath, so you can convert or edit it as usual, and giving it a new future date
shows it as ACTIVE again.
Finding proformas
Proformas appear in the normal invoice list. Pass type=PROFORMA to see only
proformas, or fiscal_only=true to hide them and list just your fiscal invoices.
Void invoice POST
Voids an invoice by changing its status to `VOIDED`. **Status change:** `ISSUED`, `SENT`, `OVERDUE`, `PAID` or `RECTIFIED` → `VOIDED` **Use when:** The operation never took place (invoice issued by mistake, duplicate, etc.) For invoices already submitted to VeriFactu, the cancellation is sent to AEAT automatically. **Note:** If the operation did take place but with errors, use the corrective invoice endpoint instead.
Create customer POST
Creates a new customer. **Idempotency:** Supports `Idempotency-Key` header to prevent duplicates when a request is retried (network timeout, double-click, etc.).