Biblioteca de plantilles PDF i factures estructurades
Gestiona plantilles PDF i identitats de marca, tria la presentació de cada document, prepara artefactes PDF exactes i porta calendaris de pagaments, referències i centres DIR3 a les factures. Cinquanta operacions noves, els scopes pdf_templates i un bloc pdf_output_state a cada document.
19 d'octubre de 2026 (provisional: la data definitiva és el dia que es publiqui aquesta release) — L'API exposa ara la biblioteca de plantilles PDF de l'app, la presentació que conserva cada document, els artefactes PDF exactes i les dades de negoci estructurades d'una factura. Quatre guies expliquen el model complet: Biblioteca de plantilles PDF, Presentació de documents, Vistes prèvies i artefactes PDF i Dades de negoci de la factura.
Totes les operacions d'aquesta release pengen de l'eix d'empresa,
/v1/companies/{company}/…, on {company} és l'id (UUID v7) del NIF amb què
operes; arribar a un NIF ho explica. Cap de les operacions
noves no es va publicar mai a l'arrel de /v1: són noves, no s'han mogut, així que no hi
ha cap ruta antiga des de la qual migrar.
Les operacions s'escriuen com METHOD /path. Les taules del final d'aquesta pàgina
enllacen cada operació nova i actualitzada amb la seva pàgina de l'API Reference.
Operacions noves
Cap d'aquestes operacions no està marcada amb x-irreversible. Les 27 escriptures accepten
Idempotency-Key; és obligatòria a la vista prèvia, a la preparació i el
renderitzat d'artefactes i a la pujada d'actius, i opcional a la resta.
- Biblioteca de plantilles (
pdf_templates:read/pdf_templates:write) —GET|POST /v1/companies/{company}/pdf-templates,GET|PATCH /v1/companies/{company}/pdf-templates/{template},POST /v1/companies/{company}/pdf-templates/{template}/revisions,/duplicate,/archivei/restore,GET /v1/companies/{company}/pdf-templates/{template}/impactiGET /v1/companies/{company}/pdf-templates/{template}/revisions/{revision}. Els valors per defecte de l'empresa són aGET|PATCH /v1/companies/{company}/pdf-templates/defaults, els de cada contacte aGET|PATCH /v1/companies/{company}/pdf-templates/contact-defaults/{contact}/{document_type}/{purpose}, i els logotips i imatges aPOST /v1/companies/{company}/pdf-templates/assetsiGET /v1/companies/{company}/pdf-templates/assets/{asset}(16 en total). El llistat usapageiper_pagei respon{ "items", "meta" }. - Identitats comercials (mateixos scopes) —
GET|POST /v1/companies/{company}/pdf-commercial-identities,GET|PATCH /v1/companies/{company}/pdf-commercial-identities/{identity},POST .../{identity}/revisions,/archivei/restore,GET .../{identity}/impactiGET .../{identity}/revisions/{revision}(9 en total). - Vista prèvia (
pdfs:readipdf_templates:read) —POST /v1/companies/{company}/pdf-template-previewsrenderitza una plantilla abans d'usar-la, a partir d'un exemple, un formulari sense desar, un esborrany desat, una revisió de presentació o una substitució de factura (el campsource). Retorna les metadades d'un artefacte de vista prèvia i respon200, o202mentre el renderitzat és a la cua. - Artefactes PDF (
pdfs:read) —POST /v1/companies/{company}/pdf-artifactsprepara el PDF d'una presentació conservada,POST /v1/companies/{company}/pdf-artifacts/{artifact}/renderel renderitza,GET /v1/companies/{company}/pdf-artifacts/{artifact}consulta el seu estat iGET /v1/companies/{company}/pdf-artifacts/{artifact}/downloadretorna els bytes ambETag,304davantIf-None-Matchi503ambRetry-Aftermentre està pendent. - Presentació de cada document — en factures, pressupostos, proformes i
albarans (scope
{document}:read|write):GET|PATCH /v1/companies/{company}/{documents}/{id}/presentation,GET /v1/companies/{company}/{documents}/{id}/presentation-history(paginat ambpageiper_page) iPOST /v1/companies/{company}/{documents}/{id}/presentation-revisions(16 en total). - Plantilla d'una sèrie (
series:read|write) —GET|PATCH /v1/companies/{company}/series/{series}/pdf-template. - Revisions administratives d'una factura (
invoices:read|write) —GET|POST /v1/companies/{company}/invoices/{invoice}/administrative-revisionsrevisen l'encaminament DIR3 d'una factura emesa o vençuda amb una comprovació de versió al cos.
Les nou operacions PATCH d'aquesta llista (plantilles, identitats, valors per defecte de
l'empresa i dels contactes, les quatre presentacions de document i la plantilla de sèrie)
accepten If-Match, i les operacions que retornen un sol recurs responen amb un ETag.
Tools MCP
El servidor MCP publica 51 tools noves: una per cada una d'aquestes operacions i
generate_recurring_invoice per a l'operació de generació ja existent. L'empresa surt
de la sessió MCP, així que les tools no porten argument company. Consulta el
catàleg de tools.
| Grup | Tools | Scope |
|---|---|---|
| Plantilles PDF | 14 d'escriptura (create_pdf_template, update_pdf_template, publish_pdf_template_revision, duplicate_pdf_template, archive_pdf_template, restore_pdf_template, les cinc equivalents de les identitats comercials, set_pdf_template_defaults, set_pdf_template_contact_default i upload_pdf_template_asset) i 11 de lectura (list_pdf_templates, get_pdf_template, la seva revisió, impacte, actiu, preferències i preferència per contacte, i les lectures d'identitats comercials) | pdf_templates:write / pdf_templates:read |
| Presentació de documents | get_*_presentation, list_*_presentations, assign_*_presentation i revise_*_presentation de factures, pressupostos, proformes i albarans (16) | El scope del document, read o write |
| Plantilla de la sèrie | get_series_pdf_template i assign_series_pdf_template | series:read / series:write |
| Revisions administratives | list_invoice_administrative_revisions i revise_invoice_administrative_routing | invoices:read / invoices:write |
| Artefactes PDF | prepare_pdf_artifact i render_pdf_artifact (categoria generate), get_pdf_artifact i read_pdf_artifact, que retorna un enllaç signat curt i mai base64 | pdfs:read |
| Vista prèvia | preview_pdf_template (categoria generate) | pdfs:read i pdf_templates:read |
| Factures recurrents | generate_recurring_invoice | recurring_invoices:transition |
- Reintents. Les 14 escriptures de la biblioteca,
assign_*_presentation,revise_*_presentation,assign_series_pdf_template,prepare_pdf_artifact,render_pdf_artifact,preview_pdf_templateigenerate_recurring_invoiceacceptenidempotency_key: reutilitza la mateixa clau quan reintentis una crida perquè no s'apliqui dues vegades. - Errors. Un rebuig que es produeix mentre s'executa una d'aquestes tools (per
exemple
pdf_presentation_not_ready,pdf_template_version_conflicto un404) arriba com un resultat normal ambisError: true, i_meta["com.factuarea/error"]porta el mateixhttp_status,codeiparamque l'error REST. Decideix percode; Errors MCP en té la forma completa. - Tools existents.
accept_quoteiaccept_proformasegueixen la regla d'acceptació de les operacions REST (expected_presentation_uuidopcional, precondició només a la primera captura), iget_invoice_pdf,get_quote_pdf,get_proforma_pdfiget_delivery_note_pdftornen a reclamar una renderització fallida reintentable en lloc de retornar la fallada anterior.create_invoiceiupdate_invoicedescriuen la regla dedue_onde les factures amb terminis, i tota tool que emet una factura responinvoice_due_date_not_last_instalmentsi no es compleix; tambéschedule_invoiceireschedule_invoice, iduplicate_invoicedesplaça els terminis amb la data d'emissió.
Scopes
Dos scopes nous, pdf_templates:read i pdf_templates:write, cobreixen la biblioteca i
les identitats. Cap macro de scopes no els inclou. La vista prèvia necessita alhora
pdfs:read i pdf_templates:read. La presentació dels documents reutilitza el scope
del seu document. La biblioteca és el mòdul pdf_templates i l'editor avançat
necessita pdf_templates_editor; consulta Accés.
POST /v1/accounts/{account}/api-keys accepta els scopes nous a la seva llista scopes.
Canvis en operacions existents
Canvien de contracte 137 de les operacions existents. Són a les taules del final de la pàgina; aquests són els grups. Les operacions dels documents de control de transport que també canvien són a la seva pròpia publicació.
- Plantilla en escriure — crear i actualitzar de pressupostos, proformes i albarans,
crear, actualitzar i rectificar de factures, i
POST /v1/companies/{company}/invoices/substitute-simplifiedacceptenpdf_template_id, ambexpected_selection_versionallà on hi ha una selecció anterior amb què comparar (no a la rectificativa ni asubstitute-simplified). Les sèries acceptenpdf_template_iden crear i actualitzar, méspdf_template_expected_versionen actualitzar, i ara retornenpdf_template_idipdf_template_version. - Presentació a les respostes — factures, pressupostos, proformes i albarans
porten
presentationipdf_output_statea tota resposta que retorna el document (llistat, consulta, creació, actualització, transicions, cerques i duplicats). - Presentació amb revisions inactiva o activa — amb ella inactiva els camps de
presentació (
presentation_precondition,presentation_preconditions,pdf_template_uuid,expected_presentation_uuid,expected_selection_versioni els altresexpected_*) s'ignoren i el comportament és l'anterior a aquesta release. Amb ella activa es validen, i una plantilla indicada senseexpected_selection_version, o un lliurament sense la seva precondició, respon428. Els clients que no usen plantilles no es veuen afectats. - Precondició de lliurament —
issueisendde factures reben plans els set campsexpected_*,purposeiformat;sendiacceptde pressupostos,sendiacceptde proformes isendd'albarans rebenpresentation_precondition; les operacionsbulk-sendibulk-statusdels quatre documents rebenpresentation_preconditions. Les operacions de conversió declaren aquests camps com a no acceptats. Consulta la precondició de lliurament. - Acceptació de pressupostos i proformes —
POST /v1/companies/{company}/quotes/{quote}/acceptiPOST /v1/companies/{company}/proformas/{proforma}/acceptnomés necessitenpresentation_preconditiona la primera captura: quan el document encara no té captura retinguda o el seu esborrany s'ha editat o ha canviat de plantilla després de capturar-se (sense l'objecte,428 pdf_presentation_precondition_requiredi no s'escriu res). Un document que ja té captura retinguda s'accepta sense l'objecte; el camp opcionalexpected_presentation_uuid(nou als pressupostos) cita aquesta captura i respon409 pdf_presentation_conflictsi ja no és la vigent. Acceptar un esborrany el numera, també una proforma, i captura el que s'ha revisat. Els exemples de la petició sónfirst_captureiretained_capture. pdf_presentation_not_readyés422— és una regla de negoci, no un permís. Decideix percode.- Conflictes (
409) — cap409d'aquesta release no canvia res: torna a llegir, revisa i repeteix. Les escriptures, transicions, conversions, duplicats, signatures i descàrregues de documents declarenpdf_presentation_conflict(la presentació ha canviat des que la vas llegir) ipdf_presentation_context_changed(el que vas revisar ja no coincideix amb el document). Les operacions de factura que lliuren o registren un fet fiscal (crear,issue,send,annul,void,corrective,substitute-simplified,mark-paid,mark-sent, els cobraments i la seva reversió,send-reminder, el ZIP i el correu trimestrals, i la generació d'una factura recurrent) declaren a méspdf_legal_source_changed. A la biblioteca, les escriptures ambexpected_versiondeclarenpdf_template_version_conflict(details.current_versionirecovery: reload_or_keep_local), publicar i arxivar declarenpdf_library_impact_conflict, la pujada d'actiuspdf_template_asset_conflicti crear i duplicarresource_conflict. La plantilla de la sèrie, la política de presentació d'una recurrent i el calendari de pagaments declaren el seu propi conflicte de versió. - Enllaços públics —
PATCH {document}/public-linkacceptaaction: "publish"ambpublication_context(presentation_idiexpected_binding_version), i tantGETcomPATCHretornen un blocpublication. Oberta sense selector de versió, laurlde l'enllaç mostra ara la darrera versió que vas compartir ambpublish, no la vinculada a la presentació vigent;publication.public_urlsempre anomena la seva versió exacta, i un selector desconegut o privat respon404en lloc de recórrer a una altra versió. Consulta Enviament de documents. - Signatura de l'albarà —
signed_ataPOST /v1/companies/{company}/delivery-notes/{id}/signés obsolet i s'ignora: la data la fixa el servidor.signed_byadmet fins a 120 caràcters. L'operació també rep els identificadorsexpected_*de la presentació que va veure qui signa. - Factures — les respostes porten
payment_terms(venciments),business_referencesde capçalera i de línia,legal_literals, el període de facturació i l'encaminamentadministrative_*. Les escriptures els accepten amb la semàntica ometre /null/[]de Dades de negoci de la factura, iexpected_payment_terms_versionprotegeix el calendari d'una factura existent. Amb terminis, la factura venç el dia del seu últim termini: emetre-la amb undue_onabsent o diferent respon422 invoice_due_date_not_last_instalment, un esborrany conserva la data que enviïs i una actualització que substitueixpayment_termssensedue_onel porta a l'últim termini. Una rectificativa sense calendari venç 30 dies després d'emetre's. Programar o reprogramar una factura (POST /v1/companies/{company}/invoices/{invoice}/scheduleiPATCH /v1/companies/{company}/invoices/{invoice}/reschedule) comprova la mateixa regla i respon422 invoice_due_date_not_last_instalment(param: due_on); la factura conserva el seu estat i la seva data. Duplicar una factura emet l'esborrany amb data d'avui: cada termini conserva el seu import i es desplaça els dies que hi ha entre les dues dates d'emissió, idue_onés l'últim termini desplaçat. El422de crear, actualitzar, rectificar i emetre comença pel text general de la validació de factures i al darrere enumera els codis de terminis. La factura ampliada també viatja dins deGET /v1/companies/{company}/events,GET /v1/companies/{company}/events/{event}i els lliuraments de webhook (llistat i consulta), així que canvien els seus payloads. Amb les plantilles revisionades, el blocpdfdePOST /v1/companies/{company}/invoicesés la sortida retinguda de la presentació capturada en emetre, en el paper d'aquesta presentació (una simplificada pot ser un tiquet de 80 mm), i mentre éspendingla sevaurlrespon503 pdf_artifact_not_readyambRetry-After. - Contactes — el perfil de client accepta i retorna el
dir3_proponentopcional (rol 04), així que canvia tota operació que retorna un contacte. - FacturaE i FACe —
GET /v1/companies/{company}/invoices/{id}/facturaeacceptasubmission_id, retornaETagiX-Facturae-Sha256quan l'artefacte està conservat i rebutja amb422una factura en esborrany o programada.POST /v1/companies/{company}/invoices/{id}/face-submissionsacceptasubmission_idi respon201(intent nou),200(continuació o repetició) o409(per exempleface_transmission_uncertain).POST /v1/companies/{company}/invoices/{id}/sendrepattach_facturaeisubmission_id. Consulta Facturació a FACe. - Descàrregues i renderització de PDF —
GET /v1/companies/{company}/{documents}/{id}/pdfiGET /v1/companies/{company}/invoices/{id}/pdf-linkpoden respondre202mentre es prepara el PDF, i409o410quan la font ha canviat o s'ha esborrat. Una renderització que ha fallat però es pot reintentar no es respon mai amb aquella fallada anterior: la descàrrega la torna a reclamar i respon202, així que reintentar avança. Una renderització que ha fallat de manera definitiva respon500amb el seu codi (pdf_engine_profile_unavailable,pdf_payload_resource_unavailable,pdf_image_resource_unavailable) i no s'encua res.POST /v1/companies/{company}/pdf-artifacts/{artifact}/renderiPOST /v1/companies/{company}/pdf-template-previewsnomés responen200amb un artefacte a punt: un que cap renderització no pot completar respon500amb el seu codi. Consulta com responen les descàrregues. Les quatre operacionsbulk-pdfdeclarenX-Bulk-Total,X-Bulk-SuccessfuliX-Bulk-Failed, iPOST /v1/companies/{company}/invoices/quarterly/download-zipdeclara les seves capçaleresX-Quarterly-*. - Recurrents i rectificatives — una factura recurrent porta una política de
presentació (
presentation_policy,presentation_policy_version,presentation_pause_reason) ipayment_terms_template; una factura rectificativa hereta el que llista Factures rectificatives. Consulta també Factures recurrents. - Altres declaracions —
GET /v1/tax-catalogdeclaraIf-None-Match;POST /v1/companies/{company}/employeesiPOST /v1/companies/{company}/employees/{employee}/reactivatedeclaren la capçalera de correlacióX-Request-Idal seu503;POST /v1/companies/{company}/contacts/importi la seva vista prèvia declaren el límit del campmapping;POST /v1/companies/{company}/contactsi el perfil de client declaren409 idempotency_key_in_use(una altra petició amb la mateixa clau encara s'està executant);PATCH /v1/companies/{company}/delivery-notes/{delivery_note}deixa de declararresource_conflict, perquè editar un albarà no el numera.
La marca sobre fons foscos i la mida de la marca
La revisió d'una identitat comercial té quatre claus més, que accepten
POST /v1/companies/{company}/pdf-commercial-identities i
POST /v1/companies/{company}/pdf-commercial-identities/{identity}/revisions i que retorna tota
resposta d'identitat:
logo_dark_asset_idibrand_image_dark_asset_id: versions opcionals del logotip i de la imatge de marca per a fons foscos. Cadascuna necessita la seva imatge base.dark_background_fallback:silhouette(per defecte) oplate.brand_size:small,medium(per defecte) olarge.
Una marca no té adreça: contact_address no forma part de la seva configuració i el
domicili de l'emissor al PDF és sempre el de l'empresa. Tampoc no hi ha un bloc a part de
contacte comercial: quan la plantilla mostra el correu o el telèfon de l'empresa, el
contact_email o el contact_phone de la marca el substitueix a la línia de contacte de
l'emissor, i quan la plantilla l'amaga no en surt cap. Per això la marca sense desar d'una
vista prèvia porta sis claus obligatòries.
Sobre un fons fosc (el marc del preajust corporative, la banda de la capçalera del
document de control), la marca es pinta en aquest ordre: la seva versió per a fons fosc,
si en té; la imatge tal com és, si es llegeix; si no, una silueta blanca, o la placa clara
si la marca prefereix plate. Sobre un fons clar, una imatge que desapareixeria, com un
logotip blanc, es pinta com una silueta negra. A la pràctica, puja el logotip en color com
a base i el blanc com a versió per a fons fosc.
El configuration.branding.size d'una plantilla admet a més inherit, el valor de les
plantilles noves, que pren el brand_size de la seva marca (medium si no en té). La
vista prèvia accepta les quatre claus en una marca sense desar (commercial_identity amb
mode: draft), i també les accepten les tools MCP create_pdf_commercial_identity,
publish_pdf_commercial_identity_revision i preview_pdf_template. Els documents capturats
abans conserven el seu aspecte. Consulta
els fons foscos i
la mida de la marca.
Textos de secció per idioma
footer_text, conditions_text i commercial_register_text del bloc sections de
PdfTemplateConfiguration passen a ser objectes amb un text per idioma:
{ "es": "…", "en": "…", "ca": "…" }. Cada idioma és un text o null, amb els mateixos
límits de sempre per idioma (500, 5.000 i 5.000 caràcters), i un text buit es guarda com
a null.
- Lectura. Totes les respostes retornen sempre l'objecte. Un text guardat en la forma
anterior, un string, es retorna com a
{ "es": text, "en": null, "ca": null }. Les revisions, captures i artefactes ja publicats no es reescriuen, de manera que la seva empremta no canvia. - Escriptura. Crear i publicar accepten un string o l'objecte. Un string substitueix
el text dels tres idiomes per aquest text a
es. Un objecte parcial només canvia els idiomes que enviïs. Una clau desconeguda, comfr, retorna422 invalid_pdf_template_configurationambparamconfiguration.sections.footer_text(o el camp que has enviat). - Pintat. El PDF utilitza el text de l'idioma del document. Si és buit, utilitza el castellà, i si aquest també és buit, el bloc no es pinta. Un string es pinta igual als tres idiomes.
Operacions afectades: POST /v1/companies/{company}/pdf-templates i POST /v1/companies/{company}/pdf-templates/{template}/revisions
(accepten totes dues formes), i GET /v1/companies/{company}/pdf-templates, GET /v1/companies/{company}/pdf-templates/{template},
PATCH /v1/companies/{company}/pdf-templates/{template}, GET /v1/companies/{company}/pdf-templates/{template}/revisions/{revision},
/duplicate, /archive, /restore i POST /v1/companies/{company}/pdf-template-previews (retornen o
reben la configuració de la plantilla). Les tools MCP de la biblioteca segueixen el mateix
contracte.
sections.notes_mode conserva els seus tres valors: auto imprimeix les notes del
document quan en té, no les amaga i yes encara s'accepta i es comporta exactament com
auto.
pdf_output_state a cada document
Les respostes d'Invoice, Quote, Proforma i DeliveryNote inclouen pdf_output_state, un
resum de la sortida PDF conservada que mai no exposa snapshots, justificants ni rutes
d'emmagatzematge. GET /v1/companies/{company}/{documents}/{id}/pdf també respon 202 mentre es prepara el PDF.
| Camp | Contracte |
|---|---|
state | prepared, queued, processing, ready, failed, unavailable, corrupt o null quan el document no té cap estat de sortida conservat. |
presentation_id, artifact_id | UUID o null. |
format | Format PDF capturat per a aquesta sortida, o null quan no està disponible. |
variant | official, alternative o null. |
unavailable_reason | Motiu estable quan la sortida no està disponible, o null; privacy_erased n'és un exemple. |
error | Objecte o null. Si hi és, conté code, retryable i correlation_id; l'identificador de correlació pot ser null. |
retry_after | Temps d'espera suggerit per tornar-ho a provar, en segons (enter ≥ 1), o null quan no hi ha cap reintent programat. |
download_url | Ruta relativa /v1/companies/{company}/pdf-artifacts/{id}/download, o null. Només té valor quan state és ready i mai no és una ruta d'emmagatzematge interna. |
La clau sempre hi és. L'exemple del camp representa l'estat en què tots els valors són
null:
{
"state": null,
"presentation_id": null,
"artifact_id": null,
"format": null,
"variant": null,
"unavailable_reason": null,
"error": null,
"retry_after": null,
"download_url": null
}Consulta com llegir-lo i reintentar.
Codis d'error
61 codis són nous; cap no canvia l'estat d'un codi existent. Els més rellevants:
| Estat | Codi | Significat |
|---|---|---|
404 | pdf_template_not_found, pdf_commercial_identity_not_found, pdf_artifact_not_found | No existeix, o és d'una altra empresa. |
409 | pdf_template_version_conflict, pdf_library_impact_conflict, pdf_presentation_conflict, pdf_presentation_context_changed, pdf_legal_source_changed | Ha canviat una versió, un impacte o un context. Torna a llegir. |
409 | invoice_payment_terms_version_conflict, invoice_administrative_version_conflict, face_transmission_uncertain | Versió del calendari o de l'encaminament obsoleta; resultat de FACe desconegut. |
410 | pdf_signature_personal_data_forgotten | Esborrat de privacitat terminal de l'original. |
412 | pdf_template_precondition_failed, pdf_presentation_etag_mismatch | If-Match no coincideix. |
422 | invalid_pdf_template_configuration, pdf_template_archived, pdf_presentation_invalid, pdf_presentation_not_ready | Camp no vàlid (mira param), plantilla arxivada o sortida amb revisions no activa. |
422 | invalid_invoice_business_data, invalid_invoice_payment_terms, invalid_facturae_structured_data | Dades estructurades no vàlides. |
422 | invoice_due_date_not_last_instalment | La factura té calendari de pagaments i s'emet amb un due_on absent o diferent de la data de l'últim termini. |
428 | pdf_template_precondition_required, pdf_presentation_precondition_required, invoice_payment_terms_precondition_required, invoice_administrative_precondition_required | Falta una versió o precondició obligatòria. |
403 | pdf_template_access_denied, series_template_access_denied, facturae_operation_forbidden | Rol, mòdul o autoritat de l'emissor. |
500 | pdf_original_unavailable, pdf_original_corrupt, pdf_original_layout_unavailable | El PDF original s'ha perdut, no supera la seva suma de comprovació, o és íntegre però aquesta versió ja no en serveix el disseny (en preparar una presentació derivada: signatura, QR legal o dades legals actualitzades). Res no es regenera al seu lloc; contacta amb el suport. |
503 | pdf_artifact_not_ready | Encara no és a punt; espera Retry-After. |
idempotency_key_reused continua sent 422: reutilitzar una Idempotency-Key amb un
altre cos, també a la vista prèvia i a les operacions d'artefactes, que comparen el cos
cru byte a byte. Reenviar un cobrament desatès amb un external_id ja emès amb un altre
tipus o total és un altre error, 409 unattended_replay_mismatch.
Decideix per code, mai per message. El catàleg d'errors
els recull tots. Per MCP els mateixos codis arriben a _meta["com.factuarea/error"]
d'un resultat amb isError: true.