Biblioteca de plantilles PDF
Gestiona les plantilles PDF, les identitats de marca i els valors per defecte de la teva empresa — revisions, impacte, valors per defecte per contacte, pujada d’actius, precedència, concurrència amb ETag i idempotència.
La biblioteca de plantilles PDF és on la teva empresa guarda els dissenys i les marques que donen forma al PDF de cada document que genera l’API. Crees una plantilla (maquetació, preajust, columnes, textos), li assignes una identitat comercial (logotip i marca) i decideixes on s’aplica: com a valor per defecte de l’empresa, per tipus de document, per sèrie o per contacte.
Tot el que hi ha a la biblioteca està versionat. Una plantilla o una identitat és una capçalera
(nom, estat, version) que apunta a la seva revisió actual; una revisió és una instantània
immutable del disseny o de la marca. Publicar mai no edita una revisió: n’afegeix la següent. Un
document conserva el PDF amb què es va capturar: canviar, arxivar o restaurar recursos de la
biblioteca només afecta els documents que creïs o revisis després.
| Recurs | Què és | Ruta |
|---|---|---|
| Plantilla | Disseny del PDF: preajust base, columnes, títols, seccions, pàgina. | /v1/companies/{company}/pdf-templates |
| Revisió de plantilla | Instantània immutable d’una plantilla, numerada des de 1. | /v1/companies/{company}/pdf-templates/{template}/revisions/{revision} |
| Identitat comercial | Marca: nom comercial, logotip, imatge de marca, mode de marca, correu i telèfon. | /v1/companies/{company}/pdf-commercial-identities |
| Actiu | Logotip o imatge de marca que puges; privat i immutable. | /v1/companies/{company}/pdf-templates/assets |
| Valors per defecte de l’empresa | Plantilla i identitat que s’usen quan no n’hi ha cap de més específica. | /v1/companies/{company}/pdf-templates/defaults |
| Valors per defecte per contacte | Plantilla preferida per un contacte per a un tipus de document i un propòsit. | /v1/companies/{company}/pdf-templates/contact-defaults/{contact}/{document_type}/{purpose} |
Totes les rutes d’aquesta guia pengen de /v1/companies/{company}/…: {company} és l’id (UUID v7)
del NIF amb què operes, i als exemples curl és $COMPANY_ID.
Arribar a un NIF explica com resoldre’l.
Una identitat comercial no substitueix mai la identitat fiscal de l’emissor. La raó social, el
NIF, les dades d’impostos i els comptes bancaris surten de la teva empresa i de cada document; la
biblioteca només guarda l’aspecte. Una plantilla o una identitat que intenti portar dades fiscals
o bancàries, HTML, CSS, scripts o URL es rebutja amb 422.
Els recursos de la biblioteca es retornen com a objecte pla (sense l’embolcall data) i els
llistats com { "items": [...], "meta": { "page", "per_page", "total" } }. Tots els
identificadors són UUID v7 i s’exposen com a id.
Accés: mòdul, pla, scopes i rols
| Operació | Scope |
|---|---|
| Llegir plantilles, identitats, revisions, actius, impacte i valors per defecte | pdf_templates:read |
| Crear, canviar el nom, publicar, duplicar, arxivar, restaurar, pujar i canviar valors per defecte | pdf_templates:write |
| Previsualitzar una plantilla (vegeu Vistes prèvies i artefactes PDF) | pdfs:read i pdf_templates:read |
- Rols. Les lectures estan obertes als rols
adminiuserde l’empresa; les escriptures i la lectura de l’impacte exigeixenadmin. Unemployeerep403 pdf_template_access_denied. Una API key actua amb el rol de l’usuari al qual pertany, i el rol i les restriccions de mòdul es tornen a comprovar a cada petició. - Mòdul i pla. La biblioteca és el mòdul
pdf_templates, disponible a Esencial, Profesional, Avanzado i Enterprise. L’editor avançat (tipografia, colors, columnes, maquetació de pàgina i els preajustscorporativeipremium) és el mòdulpdf_templates_editor, inclòs des de Profesional. Sense ell pots continuar gestionant plantilles que només canvien la marca sobre els preajustsclassic,moderniminimal; qualsevol altre canvi retorna403 feature_not_available_in_plan. Llegeixpdf_capabilitiesa la personalització del compte per saber-ho per endavant. Un downgrade conserva el que ja havies desat; només els canvis avançats nous necessiten l’editor. - Mode de prova. La biblioteca funciona igual amb claus
fact_test_ifact_live_.
Plantilles
Crear una plantilla
POST /v1/companies/{company}/pdf-templates crea una plantilla amb la seva primera revisió. Només name és
obligatori; la resta té valors per defecte.
| Camp | Significat |
|---|---|
name | D’1 a 120 caràcters. |
description | Opcional, fins a 500 caràcters. |
base_preset | classic, modern (per defecte), minimal, corporative o premium. |
supported_types | Tipus de document que pot generar: invoice, quote, proforma, delivery-note. Per defecte, els quatre. |
supported_purposes | Propòsits per tipus. Factures: complete, simplified, corrective, simplified_corrective; els altres tipus només complete. Per defecte, tots. |
supported_formats | a4 (per defecte), ticket_80, ticket_58. Els formats de tiquet només serveixen per a plantilles exclusives de factura. |
commercial_identity_id | Marca que fa servir per defecte, o null per heretar la identitat per defecte de l’empresa. |
configuration | Disseny parcial, combinat sobre els valors del preajust (vegeu a sota). |
id, revision_id | UUID v7 opcionals si vols triar tu els identificadors. |
configuration és un objecte tancat amb els grups branding (mode: logo, imago o none;
size: small, medium, large o inherit, consulta la mida de la marca), typography, colors, page, watermark, titles, columns, company_fields,
client_fields, custom_field_definitions i sections. Una clau desconeguda, un tipus incorrecte
o un valor fora de rang es rebutja amb 422 invalid_pdf_template_configuration i el param
assenyala la ruta exacta, per exemple configuration.typography.font_size. Quan branding.mode
és logo o imago, la plantilla necessita una marca efectiva: el seu propi
commercial_identity_id o una identitat per defecte de l’empresa que estigui activa. Si no n’hi ha, la petició retorna 422 pdf_commercial_identity_required.
curl -X POST https://api.factuarea.com/v1/companies/$COMPANY_ID/pdf-templates \
-H "Authorization: Bearer fact_test_3pXnR2VbY7TcA9eFmN5z8KqW" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"name": "Invoices with logo",
"base_preset": "modern",
"supported_types": ["invoice"],
"commercial_identity_id": "0199f39e-1a20-7f6b-a2c8-3d5e9b0c4a71",
"configuration": { "branding": { "mode": "logo", "size": "medium" } }
}'La resposta és 201 amb la plantilla i una capçalera ETag (abreujada aquí):
{
"id": "0199f3a2-7c4e-7b1a-9d3e-5a2c8f1b6e40",
"name": "Invoices with logo",
"description": null,
"state": "active",
"version": 1,
"availability": { "selectable": true, "reason": null },
"supported_types": ["invoice"],
"supported_purposes": { "invoice": ["complete", "simplified", "corrective", "simplified_corrective"] },
"supported_formats": ["a4"],
"commercial_identity_id": "0199f39e-1a20-7f6b-a2c8-3d5e9b0c4a71",
"current_revision": {
"id": "0199f3a2-7c52-7d03-8a41-6b9e0c2d7f15",
"template_id": "0199f3a2-7c4e-7b1a-9d3e-5a2c8f1b6e40",
"number": 1,
"base_preset": "modern",
"layout_version": "1",
"schema_version": 1,
"configuration": { "...": "complete normalized configuration" }
},
"created_at": "2026-10-14T09:12:41.000000Z",
"updated_at": "2026-10-14T09:12:41.000000Z"
}Llistar i llegir
GET /v1/companies/{company}/pdf-templatesacceptaq(cerca per nom),state(activeper defecte,archivedoall),document_type,purpose,format,pageiper_page(d’1 a 100, per defecte 25). Els resultats surten ordenats per nom. Un filtre no vàlid retorna422amb el filtre aparam; mai s’ignora en silenci.GET /v1/companies/{company}/pdf-templates/{template}retorna la plantilla amb la seva revisió actual i l’ETagque necessites per al següentPATCH.GET /v1/companies/{company}/pdf-templates/{template}/revisions/{revision}retorna una revisió exacta, també les arxivades.
Canviar el nom: només metadades
PATCH /v1/companies/{company}/pdf-templates/{template} canvia únicament name i description (description: null
l’esborra). Mai no toca el disseny: enviar configuration aquí és un 422. Una petició que no
canvia res no crea cap versió nova. La precondició és obligatòria, vegeu
concurrència.
curl -X PATCH https://api.factuarea.com/v1/companies/$COMPANY_ID/pdf-templates/0199f3a2-7c4e-7b1a-9d3e-5a2c8f1b6e40 \
-H "Authorization: Bearer fact_test_3pXnR2VbY7TcA9eFmN5z8KqW" \
-H "Content-Type: application/json" \
-H 'If-Match: "00295d3c3bb1b0b0ce5187e46fc6af39f41f507558608c8d14312fba4a710dc6"' \
-d '{ "name": "Invoices with logo (2026)" }'Publicar una revisió
Canviar el disseny vol dir publicar una revisió nova, en dos passos.
- Demana l’impacte:
GET /v1/companies/{company}/pdf-templates/{template}/impact?action=publish. La resposta enumera les associacions que apunten a la plantilla (company_default,type_default,contact_default,seriesirecurring), elsretained_countsde presentacions, sortides preparades i ancoratges que queden intactes, elswarningssi n’hi ha, i unimpact_fingerprint. - Publica amb
POST /v1/companies/{company}/pdf-templates/{template}/revisions, enviant l’expected_versionde la plantilla, aquestexpected_impact_fingerprinti almenys un canvi entrebase_preset,commercial_identity_id,supported_types,supported_purposes,supported_formatsiconfiguration.
Els objectes de configuration es combinen en profunditat sobre la revisió actual; les llistes com
columns o custom_field_definitions se substitueixen per complet. La resposta és 201 amb la
revisió nova, i la version de la plantilla puja una unitat. Si les associacions han canviat entre
les dues crides, l’empremta ja no coincideix i reps 409 pdf_library_impact_conflict: torna a
llegir l’impacte i decideix.
curl -X POST https://api.factuarea.com/v1/companies/$COMPANY_ID/pdf-templates/0199f3a2-7c4e-7b1a-9d3e-5a2c8f1b6e40/revisions \
-H "Authorization: Bearer fact_test_3pXnR2VbY7TcA9eFmN5z8KqW" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"expected_version": 2,
"expected_impact_fingerprint": "b8a9f15005a46cf651f5652419b2edba941b3090090a1934a96f37c9cd0b973f",
"configuration": { "page": { "show_page_numbers": true }, "sections": { "footer_text": "Thank you for your business" } }
}'Els documents nous es resolen amb la revisió nova. Els documents ja capturats, les sortides preparades i els ancoratges de les factures recurrents conserven la revisió que tenien.
Duplicar
POST /v1/companies/{company}/pdf-templates/{template}/duplicate amb name i l’expected_version de l’origen crea una
plantilla nova (version 1, revisió 1, active) amb la configuració actual de l’origen. L’origen
pot estar arxivat; la còpia sempre neix activa. La còpia no hereta valors per defecte,
assignacions de sèries ni preferències de contacte, i necessita la marca que l’origen necessitaria
avui (les capacitats del pla es comproven en el moment de copiar).
Arxivar i restaurar
Una plantilla arxivada continua sent llegible i conserva les seves revisions i actius, però ja no
es pot seleccionar (availability.selectable és false).
-
GET /v1/companies/{company}/pdf-templates/{template}/impact?action=archiveretorna les associacions que en depenen i una empremta. -
POST /v1/companies/{company}/pdf-templates/{template}/archiveambexpected_version,expected_impact_fingerprintireplacements, una llista (pot anar buida) amb una decisió per cada associació l’actionde la qual siguireplace_or_clearopause:Decisió Camps Substituir per una altra plantilla { "key", "expected_version", "action": "replace", "replacement_id" }Treure el vincle { "key", "expected_version", "action": "clear", "replacement_id": null }Posar en pausa (factures recurrents que segueixen l’última plantilla) { "key", "expected_version", "action": "pause", "replacement_id": null }Copia
keyiversionde l’associació tal com els va retornar l’impacte;keyés opaca. Les associacions marcadesretainedno necessiten decisió.
Cada decisió i cada associació es validen abans de canviar res, i l’arxivament s’aplica com un
únic canvi atòmic. Si falta una decisió es retorna
422 pdf_template_default_replacement_required. POST /v1/companies/{company}/pdf-templates/{template}/restore
(només expected_version) torna a activar la plantilla; no reinstal·la els valors per defecte, els
vincles de sèrie ni les preferències de contacte que l’arxivament va substituir o treure.
Identitats comercials
Una identitat comercial és la marca que mostra una plantilla. Té el mateix cicle de vida que una
plantilla, amb les mateixes operacions sota /v1/companies/{company}/pdf-commercial-identities: GET (llistat, amb
q, state, page, per_page), POST (crear), GET /{identity}, PATCH /{identity} (nom i
descripció), GET /{identity}/impact, POST /{identity}/revisions, POST /{identity}/archive,
POST /{identity}/restore i GET /{identity}/revisions/{revision}.
La marca viu a configuration, que accepta exactament aquestes claus:
| Clau | Notes |
|---|---|
commercial_name | Fins a 120 caràcters. |
logo_asset_id | Un actiu que vas pujar amb kind: logo. |
brand_image_asset_id | Un actiu que vas pujar amb kind: imago. |
brand_mode | logo, imago o none. |
contact_email, contact_phone | Fins a 254 i 50 caràcters. Quan la plantilla mostra el correu o el telèfon de l’empresa, el de la marca el substitueix a la línia de contacte de l’emissor; quan la plantilla l’amaga, no en surt cap. No hi ha un bloc a part de contacte comercial. |
logo_dark_asset_id | Opcional. Versió del logotip per a fons foscos, un actiu amb kind: logo. Necessita logo_asset_id: en treure logo_asset_id, envia també null aquí o la petició respon 422 invalid_pdf_template_configuration. |
brand_image_dark_asset_id | Opcional. Versió de la imatge de marca per a fons foscos, un actiu amb kind: imago. Necessita brand_image_asset_id. |
dark_background_fallback | silhouette (per defecte) o plate. Consulta els fons foscos. |
brand_size | small, medium (per defecte) o large. Consulta la mida de la marca. |
Totes les claus admeten null excepte dark_background_fallback i brand_size. Una marca no té adreça: el domicili de l’emissor al PDF és sempre el de l’empresa, una dada legal que la marca no pot substituir.
Els actius han de ser de la teva empresa i del tipus correcte; si no, la petició falla
(404 pdf_template_asset_not_found o 422). Publicar una revisió demana expected_version,
expected_impact_fingerprint i una configuration parcial amb almenys una clau. L’impacte d’una
marca també enumera les plantilles que la fan servir (associacions template), i arxivar-la demana
una decisió per associació, exactament igual que arxivar una plantilla (la decisió sobre una associació template també pot dur revision_id).
curl -X POST https://api.factuarea.com/v1/companies/$COMPANY_ID/pdf-commercial-identities \
-H "Authorization: Bearer fact_test_3pXnR2VbY7TcA9eFmN5z8KqW" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"name": "Main brand",
"configuration": {
"commercial_name": "Acme Studio",
"logo_asset_id": "0199f39d-52b1-7e34-9c07-1f6a8d3b2e90",
"logo_dark_asset_id": "0199f39d-6a14-7c52-8e31-2b7c9e4d1f05",
"brand_mode": "logo",
"contact_email": "hello@acme.example"
}
}'La marca sobre fons foscos
Alguns dissenys posen la marca sobre un fons fosc, com el marc del preajust corporative
o la banda de la capçalera del document de control. A cada captura nova, la imatge que
mostra la plantilla (la de brand_mode) es pinta en aquest ordre:
- La versió per a fons fosc, si la marca en té. Sobre un fons fosc,
logo_dark_asset_id(obrand_image_dark_asset_idper a la imatge de marca) es pinta tal com és. Sobre el paper no s’utilitza. - La imatge tal com és, si es llegeix. Una imatge amb fons propi (un JPEG, o un PNG sense transparència) es pinta tal com és, i també una amb una tinta que contrasta amb el fons.
- Si no, una silueta o la placa. Sobre un fons fosc decideix
dark_background_fallback:silhouette(per defecte) pinta la forma de la marca en blanc, iplatela posa sobre una placa clara, sempre que s’hi llegeixi (si no, la silueta blanca). - Sobre un fons clar, com el paper, una imatge que desapareixeria (un logotip blanc, per exemple) es pinta com una silueta negra.
La silueta conserva la forma i la transparència de la imatge; només canvia el color de la
seva tinta. A la pràctica: puja el teu logotip en color com a logo_asset_id i la seva
versió blanca com a logo_dark_asset_id. Els documents capturats abans d’aquesta regla
conserven l’aspecte amb què es van capturar.
La mida de la marca
brand_size és la mida per defecte de la marca: small, medium (per defecte) o
large. Una plantilla fixa la seva a configuration.branding.size, o fa servir inherit,
el valor de les plantilles noves, per prendre la mida de la seva marca; sense marca,
medium. Les plantilles que ja guardaven una mida la conserven. Cada mida és una superfície
òptica de la tinta, no una caixa màxima: un logotip apaïsat baixa d’alçada i guanya
amplada, un de vertical creix una mica d’alçada, i el marge transparent que envolta la
imatge no compta. La mateixa mida s’aplica a tots els dissenys, al tiquet i al document de
control.
Pujar actius
POST /v1/companies/{company}/pdf-templates/assets puja un logotip o una imatge de marca com a multipart/form-data.
Idempotency-Key és obligatòria en aquesta operació.
| Part | Regles |
|---|---|
kind | logo o imago. |
file | JPEG, PNG o WebP, fins a 2 MiB, fins a 6000 px per costat i 24 megapíxels. El tipus i la mida reals es comproven sobre els bytes, no sobre l’extensió. |
id | UUID v7 opcional. |
curl -X POST https://api.factuarea.com/v1/companies/$COMPANY_ID/pdf-templates/assets \
-H "Authorization: Bearer fact_test_3pXnR2VbY7TcA9eFmN5z8KqW" \
-H "Idempotency-Key: $(uuidgen)" \
-F kind=logo \
-F file=@logo.png{
"id": "0199f39d-52b1-7e34-9c07-1f6a8d3b2e90",
"kind": "logo",
"mime": "image/png",
"sha256": "7a265f5f003866f84e23c7e237301879b7d4a4ecc0ab80d2041a3c980b12310a",
"size_bytes": 18342,
"created_at": "2026-10-14T09:05:12.000000Z"
}Els actius són privats i immutables; GET /v1/companies/{company}/pdf-templates/assets/{asset} retorna aquestes metadades en JSON, mai una ruta d’emmagatzematge. Amb una capçalera Accept image/* retorna els bytes desats en línia, amb Cache-Control: private, no-store. En JPEG i PNG s’eliminen les metadades EXIF,
GPS i de text. Arxivar una plantilla o una marca no n’esborra els actius, i cada actiu compta una
sola vegada per a l’espai d’emmagatzematge encara que el comparteixin diverses marques.
Per MCP, upload_pdf_template_asset rep la imatge com a image_base64 (fins a 2048 KiB ja
descodificada), el mime declarat (image/jpeg, image/png o image/webp) i un filename.
Valors per defecte de l’empresa
GET /v1/companies/{company}/pdf-templates/defaults retorna el registre únic de la teva empresa:
{
"id": "0199e0aa-4b10-7c33-9a52-6d8e1f3b7a24",
"version": 1,
"company_template_id": null,
"company_commercial_identity_id": null,
"type_defaults": [],
"render_activation": "legacy"
}| Camp | Significat |
|---|---|
company_template_id | Plantilla que s’usa quan no n’hi ha cap de més específica. Ha de poder generar tots els tipus de document i propòsits. |
company_commercial_identity_id | Marca que fan servir les plantilles que no en tenen una de pròpia. |
type_defaults | Llista de { "document_type", "purpose", "template_id" }: la plantilla per a un tipus de document i un propòsit. |
render_activation | Només lectura. legacy o revisioned: indica si la sortida revisionada que es basa en aquesta biblioteca està efectivament activa per a la teva empresa. |
Mentre no escriguis res, la lectura és virtual: id és l’UUID de la teva empresa, version és 1
i no hi ha res desat. El primer PATCH /v1/companies/{company}/pdf-templates/defaults el desa a version 2.
- Un camp omès conserva el seu valor i
nulll’esborra. type_defaultssubstitueix la llista sencera: envia totes les entrades que vulguis conservar. El format de paper no forma part de la clau.render_activationno s’accepta mai: enviar-lo, fins i tot com anull, és un422. Forma part de la representació, així que quan canvia també canvia l’ETagi unIf-Matchcaducat respon412com toca.
curl -X PATCH https://api.factuarea.com/v1/companies/$COMPANY_ID/pdf-templates/defaults \
-H "Authorization: Bearer fact_test_3pXnR2VbY7TcA9eFmN5z8KqW" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"expected_version": 1,
"company_template_id": "0199f3a2-7c4e-7b1a-9d3e-5a2c8f1b6e40",
"type_defaults": [
{ "document_type": "quote", "purpose": "complete", "template_id": "0199f3b0-2a41-7c88-9e02-d4f6a8b1c3e5" }
]
}'Una plantilla arxivada no pot ser valor per defecte (422 pdf_template_archived), i una plantilla
que no admet el tipus de document o el propòsit es rebutja amb 422.
L’ajust clàssic pdf_template de la personalització del compte
és una altra capa, anterior. Aquests valors per defecte no la substitueixen: vegeu
quina plantilla fa servir un document.
Valors per defecte per contacte
Un contacte pot preferir una plantilla per a cada tipus de document i propòsit:
GET /v1/companies/{company}/pdf-templates/contact-defaults/{contact}/{document_type}/{purpose}PATCH /v1/companies/{company}/pdf-templates/contact-defaults/{contact}/{document_type}/{purpose}
document_type és invoice, quote, proforma o delivery-note, i purpose ha de pertànyer a
aquest tipus (en factures complete, simplified, corrective o simplified_corrective; en els
altres tipus complete).
{
"id": "0199f2c1-8d10-7a55-8b3e-4c7d2e9f1a06",
"document_type": "invoice",
"purpose": "complete",
"template_id": null,
"version": 1,
"persisted": false
}id és el contacte. Si el contacte es va fusionar amb un altre, configura el contacte resultant: la
preferència del fusionat no s’hereta. El contacte ha de ser un client de la teva empresa. Sense
preferència desada la lectura és virtual (version 1, persisted: false); la primera escriptura
la desa a version 2. PATCH rep template_id (null l’esborra) i la precondició. Un contacte
desconegut o d’una altra empresa retorna 404, idèntic al d’un contacte inexistent.
Quina plantilla fa servir un document
Quan es crea, s’emet o s’envia un document, Factuarea tria la seva plantilla amb aquest ordre, i guanya el primer nivell que tingui una plantilla disponible per al tipus de document, el propòsit i el format de paper:
- Selecció manual al document (
selection_mode: manual). És exclusiva: si aquesta plantilla ja no està disponible l’operació falla, mai no recorre al nivell següent. - Valor per defecte de la sèrie, amb
GETiPATCH /v1/companies/{company}/series/{series}/pdf-template. - Valor per defecte del contacte canònic.
- Valor per defecte de l’empresa per al tipus de document i el propòsit (
type_defaults). - Plantilla per defecte de l’empresa (
company_template_id). - Legacy: la personalització del compte (
pdf_template,accent_color, logotip) i el renderitzador clàssic.
Si un nivell heretat apunta a una plantilla arxivada o incompatible, es passa al nivell següent i el
document informa d’un avís a presentation.warnings: pdf_series_template_unavailable quan era la
sèrie i pdf_inherited_candidate_unavailable per a qualsevol altre nivell heretat. La marca es
resol a part: el commercial_identity_id propi de la plantilla i, si no en té, la identitat per
defecte de l’empresa. Com llegeix i canvia un document concret la seva selecció és a
Presentacions de document.
Concurrència: versions, ETag i If-Match
Tot recurs mutable de la biblioteca té una version, i tota representació que després pots canviar
porta un ETag fort: el SHA-256 del seu JSON complet, de manera que també canvia quan canvien
availability o render_activation. Les mateixes regles valen per a plantilles, identitats,
valors per defecte de l’empresa i valors per defecte per contacte.
| Operació | Precondició |
|---|---|
PATCH sobre un recurs | If-Match amb l’ETag, o expected_version al cos. Almenys una és obligatòria. |
Accions POST (revisions, duplicate, archive, restore) | expected_version al cos. If-Match no s’accepta com a substitut. |
Si envies les dues en un PATCH, primer s’avalua l’etiqueta i després la versió. If-Match accepta
una o diverses etiquetes d’entitat, les febles (W/"...") i *.
| Estat | Codi | Significat i recuperació |
|---|---|---|
412 | pdf_template_precondition_failed | L’ETag no coincideix amb la representació actual. Torna a llegir el recurs i reintenta amb l’etiqueta nova. |
409 | pdf_template_version_conflict | expected_version és antiga. error.details porta current_version i recovery: reload_or_keep_local: recarrega i torna a aplicar el teu canvi, o conserva la teva còpia local i decideix. |
428 | pdf_template_precondition_required | No n’has enviat cap. Afegeix If-Match o expected_version. |
409 | pdf_library_impact_conflict | L’empremta de l’impacte ha caducat. Torna a llegir l’impacte. |
Un conflicte mai no canvia el recurs, i current_version només surt del recurs de la teva pròpia
empresa. Les sèries fan servir el mateix patró amb els seus propis codis:
series_template_precondition_failed, series_template_version_conflict i
series_template_precondition_required.
Idempotència
Idempotency-Key és obligatòria a POST /v1/companies/{company}/pdf-templates/assets i opcional, però
recomanada, a la resta d’escriptures de la biblioteca. Una repetició amb la mateixa clau i el
mateix cos retorna la resposta desada amb Idempotent-Replayed: true abans de la comprovació de
versió, de manera que un reintent després d’un timeout no falla amb 409 perquè el teu propi
primer intent ja va avançar la versió. L’autorització es comprova de nou abans de repetir: si has
perdut el rol o l’accés, reps l’error d’autorització, no la resposta desada. Reutilitzar una clau
amb un altre cos retorna 422 idempotency_key_reused. Consulta Idempotència
per a la finestra i el format.
Errors
| Estat | Codi | Quan |
|---|---|---|
403 | pdf_template_access_denied | El rol, el mòdul o una restricció de l’usuari no ho permeten. |
403 | feature_not_available_in_plan | El canvi necessita l’editor avançat. |
404 | pdf_template_not_found, pdf_commercial_identity_not_found, pdf_template_asset_not_found | No existeix o és d’una altra empresa, amb la mateixa resposta. |
409 | pdf_template_version_conflict, pdf_library_impact_conflict | Vegeu concurrència. |
409 | pdf_template_asset_conflict | L’id que vas triar per a la pujada de l’actiu ja existeix. |
409 | resource_conflict | En crear o duplicar una plantilla, una altra petició estava reservant identificadors en aquell moment. No s’ha escrit res; torna-la a enviar al cap d’uns segons. |
412 / 428 | pdf_template_precondition_failed, pdf_template_precondition_required | Vegeu concurrència. |
422 | invalid_pdf_template_configuration | Clau desconeguda, tipus incorrecte, fora de rang, filtre no vàlid, contingut prohibit o render_activation al cos. param porta la ruta. |
422 | pdf_commercial_identity_required | La plantilla necessita una marca (branding.mode logo o imago) i ni ella ni l’empresa en tenen una d’activa per defecte. |
422 | pdf_template_archived, pdf_commercial_identity_unavailable | La plantilla o la marca està arxivada o no es pot seleccionar. |
422 | pdf_template_default_replacement_required | A l’arxivament li falta una decisió per a una associació. |
422 | idempotency_key_required | Falta Idempotency-Key a la pujada de l’actiu. |
500 | pdf_library_association_coverage_incomplete | El servidor no ha pogut inspeccionar totes les associacions; no s’ha canviat res. Reintenta més tard. |
Ramifica segons code, mai segons message. Consulta el model d’errors.
MCP
La biblioteca té una tool MCP per operació: list_pdf_templates, get_pdf_template,
create_pdf_template, update_pdf_template, publish_pdf_template_revision,
duplicate_pdf_template, archive_pdf_template, restore_pdf_template,
get_pdf_template_impact, get_pdf_template_revision, els equivalents de les marques sense
duplicació (list_pdf_commercial_identities, get_pdf_commercial_identity,
create_pdf_commercial_identity, update_pdf_commercial_identity,
publish_pdf_commercial_identity_revision, archive_pdf_commercial_identity,
restore_pdf_commercial_identity, get_pdf_commercial_identity_impact i
get_pdf_commercial_identity_revision), get_pdf_template_defaults,
set_pdf_template_defaults, get_pdf_template_contact_default,
set_pdf_template_contact_default, upload_pdf_template_asset i get_pdf_template_asset.
Necessiten els mateixos scopes i rols, reben la versió com a expected_version als arguments (a
MCP no hi ha capçaleres) i accepten idempotency_key. Consulta les tools MCP.