Emesa no vol dir enviada: versió de l’API 2026-10-01
Les factures separen l’emissió del lliurament. La versió opcional 2026-10-01 publica l’estat issued amb issued_at, is_sent i sent_via; nou POST /v1/invoices/{invoice}/issue; mark-sent registra un lliurament manual des d’aquesta versió; nous esdeveniments invoice.issued, invoice.marked_sent i invoice.unsent, amb invoice.sent com a àlies deprecat; payloads de webhook versionats per endpoint; les factures recurrents guanyen generation_mode. La versió predeterminada no canvia.
Fins ara l’API anomenava «enviar» l’acte fiscal d’emetre una factura:
draft → sent assignava el número de sèrie, congelava les dades de l’emissor i
del client, donava d’alta el registre VeriFactu i descomptava stock, però no
enviava cap correu. I l’enviament real per email no deixava rastre a la factura.
Aquesta publicació separa els dos fets. Emetre és un estat; lliurar la factura
al client és una marca pròpia, independent de l’estat i del cobrament.
El vocabulari nou viu darrere la versió per data 2026-10-01. La versió
predeterminada continua sent 2026-06-01: una integració que no envia la
capçalera Factuarea-Version i no té la clau fixada continua rebent exactament
el contracte anterior.
Dos eixos: emesa i enviada
Camp (des de 2026-10-01) | Significat |
|---|---|
status: "issued" | La factura està emesa: número definitiu, registre VeriFactu, moviments d’stock. Substitueix sent com a estat emès. overdue, paid i partially_paid conserven el seu significat. |
issued_at | Quan es va emetre la factura. null mentre és un esborrany o està programada. |
sent_at | Quan es va lliurar per primer cop al client, o null. Un reenviament mai no el mou. |
sent_via | Canal d’aquest primer lliurament: email o manual. null mentre no s’ha lliurat. |
is_sent | true si i només si sent_at no és null. |
Una factura issued o overdue pot estar enviada o no, i cobrar-la no la marca
com a enviada. La marca només es posa de dues maneres:
- Email: quan el servidor de correu accepta un email de lliurament de la
factura (
POST /v1/invoices/{invoice}/send,bulk-send, execucions recurrents i programades, automatitzacions, l’app i el MCP). Un correu en cua o fallit i un recordatori de pagament mai no la posen. Tampoc no es marca un esborrany enviat per correu abans d’emetre’l. - Manual: amb
POST /v1/invoices/{invoice}/mark-senta2026-10-01, per a factures que vas lliurar per un canal propi (WhatsApp, paper, un portal).
Què canvia amb 2026-10-01
Envia Factuarea-Version: 2026-10-01 a cada petició o fixa aquesta versió a
l’API key. Tot objecte factura de qualsevol resposta v1 segueix la versió
efectiva, també dins de les conversions de pressupostos, factures proforma i
albarans, les execucions de factures recurrents, GET /v1/events i els
lliuraments de webhook que llista
GET /v1/webhook_endpoints/{webhook_endpoint}/deliveries.
| Element | Versió predeterminada (2026-06-01) i 2026-09-01 | 2026-10-01 |
|---|---|---|
status d’una factura emesa | sent | issued |
sent_at | Instant d’emissió | Primer lliurament, o null |
issued_at, is_sent, sent_via | No hi apareixen | Hi apareixen |
scheduled_action | draft per a «emetre sense enviar» | issue |
GET /v1/invoices/statuses | Llista sent (etiqueta «Enviado») | Llista issued, a la mateixa posició |
by_status a GET /v1/invoices/stats | Clau sent | Clau issued |
POST /v1/invoices/{invoice}/mark-sent | Emet un esborrany | Registra un lliurament manual |
Dos canvis del costat de la petició són additius i s’apliquen a totes les
versions: el filtre is_sent de GET /v1/invoices i la nova operació issue.
Nou: emetre una factura
POST /v1/invoices/{invoice}/issue emet un draft sense enviar-lo. Necessita
l’scope invoices:write i, com que emetre consumeix un número de sèrie i no es
pot desfer, accepta un Idempotency-Key. Qualsevol estat diferent de draft
respon 422 invalid_status_transition.
curl -X POST "https://api.factuarea.com/v1/invoices/$INVOICE_ID/issue" \
-H "Authorization: Bearer $FACTUAREA_API_KEY" \
-H "Factuarea-Version: 2026-10-01" \
-H "Idempotency-Key: issue-fac-2026-00042"{
"data": {
"number": "FAC-2026-00042",
"status": "issued",
"issued_at": "2026-03-15T11:45:00Z",
"sent_at": null,
"sent_via": null,
"is_sent": false
}
}L’extracte mostra només els camps d’aquesta publicació. Sense la capçalera, la
mateixa crida respon amb status: "sent" i sent_at igual a l’instant
d’emissió.
mark-sent depèn de la versió
POST /v1/invoices/{invoice}/mark-sent conserva el seu significat anterior a
les versions prèvies: emet un esborrany sense enviar-lo per correu. Des de
2026-10-01 només registra un lliurament manual: is_sent: true,
sent_via: "manual" i sent_at, sense tocar l’estat, el número ni el registre
VeriFactu.
A 2026-10-01 admet factures issued i overdue i és idempotent: una factura
ja enviada conserva la data i el canal originals. Sobre un esborrany respon:
{
"error": {
"type": "invalid_request_error",
"code": "business_rule_violation",
"subcode": "invoice_cannot_be_marked_as_sent",
"message": "La factura FAC-2026-BORRADOR es un borrador y todavía no puede marcarse como enviada: emítela antes.",
"doc_url": "https://docs.factuarea.com/guides/errors#business_rule_violation",
"request_id": "req_5e99aabe287e78db589da44c56"
}
}Ramifica segons error.subcode. Emet abans la factura amb
POST /v1/invoices/{invoice}/issue o envia-la per correu amb
POST /v1/invoices/{invoice}/send.
Les factures programades s’emeten amb la seva programació
Canvi de comportament a totes les versions. Només es pot emetre un
draft. Una factura scheduled ja no s’emet pels camins genèrics:
POST /v1/invoices/{invoice}/mark-sent en versions anteriors a 2026-10-01
i POST /v1/invoices/{invoice}/issue responen 422
invalid_status_transition, sigui quina sigui la versió que enviïs. Abans
d’aquesta publicació, mark-sent l’emetia com si fos un esborrany.
Per emetre una factura programada abans de la seva data, desprograma-la primer
amb POST /v1/invoices/{invoice}/unschedule i després emet-la. Si no, deixa
que s’executi la programació: emet la factura a scheduled_for.
send, unsend i bulk-status
POST /v1/invoices/{invoice}/sendemet un esborrany i l’envia per correu, com abans. La resposta encara pot mostraris_sent: false: la marca apareix quan el servidor de correu accepta el missatge, juntament amb l’esdevenimentinvoice.marked_sent.POST /v1/invoices/{invoice}/unsendesborra la marca d’enviament (sent_atisent_viatornen anull) d’una facturaissuedooverduei emetinvoice.unsent. L’estat, el número, el registre VeriFactu i l’stock no es mouen mai. Una factura amb cobraments vigents respon422, i una segona crida no té efecte. Canvi observable a les versions anteriors: en aquestessent_atporta l’instant d’emissió, de manera que ja no passa anulldesprés d’unsend. Llegeixis_sentamb2026-10-01per saber si la marca hi és.POST /v1/invoices/bulk-statusacceptanew_status: "issued"per emetre esborranys sense enviar-los per correu.sentencara s’accepta com a àlies i mai no marca una factura com a lliurada.
Àlies d’entrada a totes les versions
Les teves peticions actuals continuen funcionant, facis servir la versió que facis servir:
| Entrada | S’accepta com a |
|---|---|
status=sent a GET /v1/invoices i a POST /v1/invoices/export/excel | status=issued |
new_status: "sent" a POST /v1/invoices/bulk-status | issued |
scheduled_action: "draft" a POST /v1/invoices/{invoice}/schedule | issue |
Un valor fora del catàleg continua rebutjant-se amb 422 i la llista de valors
admesos. scheduled_action accepta ara issue (emetre sense enviar) o
issue_and_send (emetre i enviar per correu).
Factures recurrents: generation_mode
Les factures recurrents guanyen generation_mode, disponible a totes les
versions a POST /v1/recurring_invoices,
PUT /v1/recurring_invoices/{recurring_invoice},
POST /v1/invoices/{invoice}/create-recurring i a totes les respostes de
factures recurrents:
generation_mode | Cada execució |
|---|---|
draft | Deixa la factura en esborrany. |
issue | L’emet sense enviar-la per correu (is_sent: false). Fins ara no es podia emetre sense enviar. |
issue_and_send | L’emet i l’envia per correu als destinataris d’auto_delivery. Es marca com a enviada quan el servidor de correu accepta l’email; si el lliurament falla, queda emesa i sense enviar. |
send_automatically es conserva com a camp de compatibilitat derivat: true
només amb issue_and_send. Sense generation_mode, send_automatically: true
continua seleccionant issue_and_send i false selecciona draft; enviar tots
dos amb valors contradictoris respon 422. Les factures recurrents existents
conserven el seu comportament: les que enviaven les factures per correu passen a
issue_and_send i la resta a draft. Consulta
Factures recurrents.
Esdeveniments i webhooks
| Esdeveniment | Quan |
|---|---|
invoice.issued | S’emet la factura: issue, send o mark-sent sobre un esborrany (abans de 2026-10-01), bulk-status, creació ja emesa, execucions programades o recurrents. |
invoice.marked_sent | La factura passa a enviada: email acceptat pel servidor de correu o marca manual. |
invoice.unsent | S’esborra la marca d’enviament amb unsend. |
invoice.sent | Àlies deprecat d’invoice.issued: mateix instant, mateix data.object. |
Un endpoint subscrit a invoice.sent el continua rebent i es pot continuar
editant amb aquesta subscripció. Subscriu les integracions noves a
invoice.issued; la retirada de l’àlies s’anunciarà amb una data Sunset. Les
regles d’automatització ja no accepten invoice.sent com a activador: crear o
actualitzar una regla amb ell respon 422 automation_trigger_type_invalid
indicant invoice.issued.
Els payloads de webhook es versionen per endpoint amb el seu
api_version. Les versions de payload admeses són 2026-05-22 i 2026-10-01:
- Els endpoints que ja existien abans d’aquesta publicació van quedar fixats a
2026-05-22: els seus snapshots de factura conserven el vocabulari anterior (status: "sent",sent_atigual a l’instant d’emissió, senseissued_at,is_sentnisent_via). - Un endpoint creat sense
api_versionqueda fixat en crear-se: rep la versió de payload més recent que no sigui posterior a la versió REST efectiva de la petició que el crea. Sense capçaleraFactuarea-Versionni versió fixada a la clau, o des de l’aplicació, aquesta és la versió per defecte, de manera que l’endpoint queda fixat a2026-05-22. Per rebre el vocabulari nou, crea’l ambFactuarea-Version: 2026-10-01o amb"api_version": "2026-10-01". - L’
api_versiondel sobre lliurat és la versió d’aquell lliurament. L’esdeveniment desat no es reescriu mai: la projecció es fa en lliurar.
Canvia la versió d’un endpoint amb
PUT /v1/webhook_endpoints/{webhook_endpoint} quan el teu receptor entengui el
vocabulari nou. Consulta Webhooks.
MCP
El servidor MCP no té versions i sempre parla el contracte més recent:
- Nova tool
issue_invoice(invoices:write), el mirall dePOST /v1/invoices/{invoice}/issue. mark_invoice_as_sentregistra ara un lliurament manual. Sobre un esborrany retornainvoice_cannot_be_marked_as_senti remet aissue_invoiceosend_invoice.search_invoicesacceptaissued(isentcom a àlies) i el filtreis_sent;bulk_change_invoice_statusischedule_invoiceaccepten els valors nous.create_recurring_invoice,update_recurring_invoiceicreate_recurring_invoice_from_invoiceacceptengeneration_mode.- Tota tool que retorna una factura fa servir el vocabulari nou.
Si un agent feia servir mark_invoice_as_sent per emetre factures, canvia’l a
issue_invoice.
Com adoptar-la
- Accepta
issuedallà on llegeixis l’statusd’una factura, i llegeix l’enviament d’is_sent,sent_atisent_via. - Substitueix l’emissió mitjançant
mark-sentperPOST /v1/invoices/{invoice}/issue, que funciona a totes les versions. - Envia
Factuarea-Version: 2026-10-01, o fixa-la a la clau, i executa les teves proves contra el sandbox. - Subscriu els teus endpoints de webhook a
invoice.issuedi, quan et convingui, ainvoice.marked_sentiinvoice.unsent; després passa cada endpoint a la versió de payload2026-10-01.
Nous endpoints1
| Endpoint | Descripció |
|---|---|
POST/v1/invoices/{invoice}/issue | Emet una factura |
Endpoints actualitzats20
| Endpoint | Descripció |
|---|---|
POST/v1/invoices/{invoice}/mark-sent | Marca una factura com a enviada |
POST/v1/invoices/{invoice}/unsend | Anul·lar l'enviament d'una factura |
POST/v1/invoices/{invoice}/send | Envia la factura per email |
GET/v1/invoices | Llistar totes les factures |
GET/v1/invoices/{invoice} | Recupera una factura |
GET/v1/invoices/statuses | Llistar estats de factura |
GET/v1/invoices/stats | Obtenir estadístiques de factures |
POST/v1/invoices/{invoice}/schedule | Programar una factura |
POST/v1/invoices/bulk-status | Canviar en bloc l'estat de factures |
POST/v1/invoices/export/excel | Exportar factures a un full de càlcul |
POST/v1/invoices/{invoice}/create-recurring | Crear una factura recurrent a partir d'una factura |
POST/v1/recurring_invoices | Crea una factura recurrent |
PUT/v1/recurring_invoices/{recurring_invoice} | Actualitzar una factura recurrent |
GET/v1/recurring_invoices/{recurring_invoice} | Obtenir una factura recurrent |
GET/v1/recurring_invoices | Llistar totes les factures recurrents |
POST/v1/webhook_endpoints | Crea un webhook endpoint |
PUT/v1/webhook_endpoints/{webhook_endpoint} | Actualitzar un webhook endpoint |
POST/v1/webhook_endpoints/{webhook_endpoint}/test_event | Enviar un esdeveniment de prova |
GET/v1/events | Llistar tots els esdeveniments |
GET/v1/events/{event} | Obtenir un esdeveniment |