Autenticació
API keys amb prefixos fact_live_ / fact_test_, scopes granulars, els scopes privilegiats accounts:*, què arriba el consentiment OAuth, rotació amb període de gràcia i llista d'accés per IP.
L'API de Factuarea autentica cada request amb una API key. Les claus
són tokens opacs que emet un titular o administrador del compte al dashboard de
desenvolupadors
(app.factuarea.com/settings/developers/api-keys),
o mitjançant els endpoints v1 self-service. Una clau pertany
a un compte, mai a un sol NIF. El seu abast és el seu àmbit: els NIF que
té assignats, que poden ser NIF del compte i NIF d'un altre compte que et deixa
arribar-hi. Cada ruta de NIF anomena al seu propi path aquell sobre el qual
opera (/v1/companies/{company}/…), i cada ruta de compte anomena el teu compte
(/v1/accounts/{account}/…). GET /v1/me enumera l'àmbit —una entrada per NIF,
amb l'id opac que espera el path i el seu tax_id—, de manera que una
credencial mai no ha d'endevinar a quins NIF arriba. Cada request a
https://api.factuarea.com/v1/* ha d'incloure una clau vàlida en un dels dos
formats admesos.
Format de l'API key
fact_live_<24 alphanumeric characters>
fact_test_<24 alphanumeric characters>Exemple:
fact_live_8KqW3pXnR2VbY7TcA9eFmN5z
fact_test_3pXnR2VbY7TcA9eFmN5z8KqW- Prefix: determina l'entorn.
fact_live_opera sobre els teus NIF reals (producció);fact_test_arriba només a l'empresa sandbox aïllada del teu compte, amb els efectes externs (VeriFactu → AEAT, FACe, emails, webhooks) desactivats. El prefix et permet identificar l'entorn sense descodificar la clau. Consulta Mode de prova i sandbox. - Secret: 24 caràcters base62 → ~143 bits d'entropia. Es mostra només una vegada en crear-la, al dashboard o a la resposta de l'API. Si la perds, l'has de rotar.
- Emmagatzematge: el backend només emmagatzema un hash amb clau (HMAC-SHA256) del secret, mai el secret. No hi ha cap manera de recuperar-lo.
Tots els exemples d'aquesta guia usen una clau fact_live_. Una clau
fact_test_ funciona a les mateixes rutes, però només sobre l'empresa sandbox
del teu compte: pren el seu id de GET /v1/me i fes-lo servir com a
{company}. Crea i valida la teva integració primer en test. Consulta
Mode de prova i sandbox.
Enviar la clau a cada request
L'API accepta dos formats equivalents. Tria el que millor encaixi amb el teu client:
Authorization Bearer (recomanat)
curl https://api.factuarea.com/v1/companies/{company}/contacts \
-H "Authorization: Bearer fact_live_8KqW3pXnR2VbY7TcA9eFmN5z"Capçalera X-API-Key
curl https://api.factuarea.com/v1/companies/{company}/contacts \
-H "X-API-Key: fact_live_8KqW3pXnR2VbY7TcA9eFmN5z"Envia només una de les dues capçaleres. Si totes dues hi són presents, la
capçalera Authorization: Bearer té prioritat.
Exemples per llenguatge
$client = new GuzzleHttp\Client([
'base_uri' => 'https://api.factuarea.com/v1/',
'headers' => [
'Authorization' => 'Bearer ' . getenv('FACTUAREA_API_KEY'),
'Accept' => 'application/json',
],
]);
$response = $client->get('companies/{company}/contacts?limit=10');
$body = json_decode((string) $response->getBody(), true);const res = await fetch('https://api.factuarea.com/v1/companies/{company}/contacts?limit=10', {
headers: {
Authorization: `Bearer ${process.env.FACTUAREA_API_KEY}`,
Accept: 'application/json',
},
});
const data = await res.json();import os
import requests
resp = requests.get(
'https://api.factuarea.com/v1/companies/{company}/contacts',
params={'limit': 10},
headers={
'Authorization': f"Bearer {os.environ['FACTUAREA_API_KEY']}",
'Accept': 'application/json',
},
)
resp.raise_for_status()
data = resp.json()OAuth 2.1
Per a integracions d'agent i apps de tercers que actuen en nom d'un
usuari de Factuarea, l'API també admet el flux OAuth 2.1
authorization-code amb PKCE (code_challenge_method=S256) com a
alternativa a una API key estàtica. El catàleg de consentiment OAuth té
73 scopes simples amb punt més les macros factuarea.read,
factuarea.write i factuarea.full; aquests es tradueixen als scopes detallats
amb dos punts que protegeixen cada endpoint i tool MCP. La
política de rotació també s'aplica als secrets de client
OAuth.
El catàleg de consentiment inclou price_lists.read/write,
facturae.read/write i tax_reports.read/write. La pantalla ofereix només els
scopes sol·licitats pel client, mai no preselecciona els sensibles i el token
emès conté exactament el subconjunt aprovat per l'usuari. Un scope del
catàleg, payroll_exports.write, no s'ofereix, perquè cap tool exigeix el
scope al qual es tradueix.
Què arriba el consentiment OAuth
El consentiment concedeix les dades de negoci d'un NIF i mai l'administració del compte. Un scope detallat queda fora d'abast quan el catàleg no té cap scope amb punt que es tradueixi a ell, i aquests estan exclosos a propòsit, perquè l'app d'un tercer no els pugui obtenir encara que l'usuari aprovi el que sigui:
| Tipus | Scopes que el consentiment mai no concedeix | Per què |
|---|---|---|
| Administració del compte | account:write, account:owner, members:read, members:write, invitations:read, invitations:write, nif_transfers:read, nif_transfers:write, companies:read, companies:write, companies:delete, api_keys:read, api_keys:write | Les claus, l'equip, la titularitat, els traspassos de NIF i la cartera de NIF són decisions del titular del compte a la seva pròpia sessió. |
| Privilegi de proveïdor | accounts:read, accounts:write | Aprovisionar, administrar i cobrar els comptes dels teus clients mai no es delega per consentiment. |
| Observabilitat | developers:read, emails:read, integration_events:read, integration_events:write | Exposen l'activitat tècnica de les credencials, l'historial de correu i els esdeveniments de les passarel·les de pagament del compte, i reprocessar un d'aquests esdeveniments pot emetre una factura real. |
| Pagaments i botigues | stripe_autoinvoicing:read, stripe_autoinvoicing:write, payouts:read, stores:read, stores:write, woocommerce_store:write, shopify_store:write | S'ofereixen al canal d'integració del compte mitjançant una API key. |
| Escriptures irreversibles, fiscals i laborals | verifactu:write, delivery_notes:gdpr_forget, automations:delete, absences:write, absences:transition, time_entries:write, work_schedules:write | Canvien registres fiscals, esborren dades o actuen en nom de responsables laborals, així que queden en mans de controls first-party o del titular mitjançant una API key. |
Tot el que la resta del catàleg tradueix és assolible: contactes, catàleg,
documents de venda, compres i factures recurrents, informes fiscals, FacturaE,
lectures de VeriFactu, webhooks, automatitzacions i lectures de jornada, i
account:read mitjançant profile.read. Algunes operacions queden fora d'OAuth
encara que el seu scope sigui assolible, com els webhooks i els registres de
peticions del compte: Tools de MCP mostra el canal de cada tool.
Fes servir una API key per a cada scope exclòs, també amb el servidor MCP.
Scopes de MCP llista el catàleg de consentiment.
Les metadades de discovery (RFC 8414) es publiquen a
/.well-known/oauth-authorization-server, perquè els clients OAuth
resolguin els endpoints d'autorització i token automàticament:
curl https://api.factuarea.com/.well-known/oauth-authorization-serverL'esquema de seguretat OAuth2 — incloses les URL d'autorització i token
i la llista completa de scopes — es descriu a la
Referència de l'API.
Scopes
Cada API key es crea amb un o més scopes que limiten quins
endpoints pot invocar. Els scopes són cadenes amb la forma
<resource>:<action>. El catàleg és tancat: qualsevol scope fora del
conjunt llistat falla la validació amb
422 invalid_param_value en crear la clau.
El catàleg vàlid és només additiu per a credencials existents, mentre que el
subconjunt assignable a una clau nova segueix la superfície API publicada.
Els quatre scopes reservats de GoCardless/MONEI que apareixen a continuació es
continuen reconeixent per compatibilitat històrica, però s'ometen de
CreateApiKeyV1Request i no es poden assignar fins que es publiquin aquests
proveïdors. Després s'apliquen per separat les restriccions de pla i sandbox
mitjançant scope_not_allowed_by_plan i scope_not_allowed_in_sandbox: un scope
es concedeix només si el pla de tots els NIF de l'àmbit de la clau el permet.
Contactes i catàleg
Client i proveïdor són dos rols de la mateixa identitat —el contacte—, de
manera que un sol trio de scopes cobreix tots dos. Els antics clients:* i
suppliers:* estan retirats i ja no es poden assignar.
| Scope | Permet |
|---|---|
contacts:read | Llistar i consultar contactes, en qualsevol dels seus rols. |
contacts:write | Crear i actualitzar contactes, rols i perfils. |
contacts:delete | Arxivar o eliminar contactes i retirar els seus rols. |
products:read | Llistar i consultar productes. |
products:write | Crear i actualitzar productes. |
products:delete | Eliminar productes. |
price_lists:read | Llistar tarifes, els seus ítems i resoldre preus de catàleg. |
price_lists:write | Crear, actualitzar i eliminar tarifes i els seus ítems. |
Documents de venda
| Scope | Permet |
|---|---|
invoices:read | Llistar i consultar factures. |
invoices:write | Crear i actualitzar factures (inclou duplicar i rectificativa). |
invoices:delete | Eliminar esborranys de factura. |
invoices:send | Enviar factura per email al client. |
invoices:void | Anul·lar una factura emesa. |
quotes:read | Llistar i consultar pressupostos. |
quotes:write | Crear i actualitzar pressupostos. |
quotes:delete | Eliminar pressupostos. |
quotes:send | Enviar pressupost per email. |
quotes:transition | Acceptar, rebutjar o convertir pressupostos. |
proformas:read | Llistar i consultar factures proforma. |
proformas:write | Crear i actualitzar factures proforma. |
proformas:delete | Eliminar factures proforma. |
proformas:send | Enviar factura proforma per email. |
proformas:transition | Convertir factura proforma en factura. |
delivery_notes:read | Llistar i consultar albarans. |
delivery_notes:write | Crear i actualitzar albarans. |
delivery_notes:delete | Eliminar albarans. |
delivery_notes:transition | Marcar com a lliurat/cancel·lat, signar, convertir. |
delivery_notes:gdpr_forget | Esborrar la PII d'auditoria de signatura (RGPD Art. 17). |
Compres i recurrents
| Scope | Permet |
|---|---|
purchase_invoices:read | Llistar i consultar despeses. |
purchase_invoices:write | Crear i actualitzar despeses. |
purchase_invoices:delete | Eliminar despeses. |
purchase_invoices:transition | Marcar com a pagada, rebuda, comptabilitzada. |
recurring_invoices:read | Llistar i consultar plantilles recurrents. |
recurring_invoices:write | Crear i actualitzar plantilles recurrents. |
recurring_invoices:delete | Eliminar plantilles recurrents. |
recurring_invoices:transition | Pausar, reprendre i emetre manualment. |
Catàlegs i exportació
| Scope | Permet |
|---|---|
taxes:read | Llegir el catàleg d'impostos de Factuarea i els impostos propis de la teva empresa. |
taxes:write | Crear i actualitzar els impostos propis de la teva empresa i fixar-ne els predeterminats. |
taxes:delete | Eliminar els impostos propis de la teva empresa. |
series:read | Llistar sèries de numeració de factures. |
series:write | Crear i actualitzar sèries de numeració de factures. |
pdfs:read | Descarregar PDFs de qualsevol document amb el scope :read corresponent. |
tax_reports:read | Llegir informes fiscals (Modelo 303/347, etc.). |
tax_reports:write | Generar informes fiscals. |
VeriFactu i FacturaE
| Scope | Permet |
|---|---|
verifactu:read | Llegir registres, esdeveniments, certificats i configuració de VeriFactu. |
verifactu:write | Gestionar certificats, ajustos i reintents de VeriFactu. |
facturae:read | Descarregar l'XML FacturaE d'una factura i llegir els seus enviaments a FACe. |
facturae:write | Enviar factures a FACe i sol·licitar l'anul·lació d'enviaments. |
Webhooks i esdeveniments
| Scope | Permet |
|---|---|
webhooks:read | Llistar i consultar webhook endpoints i els seus lliuraments, d'un NIF i del compte. |
webhooks:write | Crear, actualitzar, rotar, provar i fer ping a webhook endpoints, i rellançar o reintentar els seus lliuraments. |
webhooks:delete | Eliminar webhook endpoints. |
events:read | Llegir el catàleg d'esdeveniments i esdeveniments individuals. |
Integracions i observabilitat
| Scope | Permet |
|---|---|
stripe_autoinvoicing:read | Llegir l'estat, configuració i comptes connectats de l'autofacturació Stripe. |
stripe_autoinvoicing:write | Configurar l'autofacturació Stripe i els seus comptes connectats. |
payouts:read | Llegir payouts de Stripe i el seu estat de conciliació. |
integration_events:read | Inspeccionar esdeveniments de passarel·la rebuts i els seus motius tipats de descart. |
integration_events:write | Reprocessar esdeveniments d'integració aparcats. |
developers:read | Inspeccionar el registre de peticions API d'un NIF i del compte. |
emails:read | Inspeccionar l'estat i l'historial d'emails enviats. |
gocardless_autoinvoicing:read | Reservat per a la integració GoCardless encara no publicada; cap endpoint ni tool el requereix avui. |
gocardless_autoinvoicing:write | Reservat per a la integració GoCardless encara no publicada; cap endpoint ni tool el requereix avui. |
monei_autoinvoicing:read | Reservat per a la integració MONEI encara no publicada; cap endpoint ni tool el requereix avui. |
monei_autoinvoicing:write | Reservat per a la integració MONEI encara no publicada; cap endpoint ni tool el requereix avui. |
Control horari
Aquests scopes requereixen el mòdul de pla control_horario. Alguns scopes de
lectura es poden concedir per OAuth; les escriptures i transicions privilegiades
continuen sent exclusives d'API key.
| Scope | Permet |
|---|---|
employees:read | Llegir empleats i l'estat de les seves invitacions. |
employees:write | Crear, actualitzar i gestionar empleats i places. |
employees:delete | Eliminar empleats permanentment. |
time_entries:read | Llegir fitxatges, balanços i registres mensuals. |
time_entries:write | Fitxar, corregir i tancar/reobrir registres horaris. |
absences:read | Llegir tipus, polítiques, sol·licituds i saldos d'absència. |
absences:write | Crear i actualitzar configuració i sol·licituds d'absència. |
absences:transition | Aprovar, rebutjar i cancel·lar sol·licituds d'absència. |
work_schedules:read | Llegir horaris i assignacions. |
work_schedules:write | Crear, actualitzar, assignar i arxivar horaris. |
presence:read | Llegir la presència en viu i diària. |
holidays:read | Llegir festius d'empresa i regionals. |
payroll_exports:read | Llegir exportacions de nòmina generades. |
payroll_exports:write | Generar exportacions de nòmina. |
Tasques i projectes
projects:* i tasks:* requereixen el mòdul tasks, que inclouen tots els
plans; users:read i notifications:* són transversals. Els scopes projects:delete i tasks:delete
són només d'API key: un consentiment OAuth mai no els concedeix. Facturar les
hores d'un projecte necessita a més invoices:write. Consulta
Projectes i tasques.
| Scope | Permet |
|---|---|
projects:read | Llistar i consultar projectes, columnes i definicions de camps personalitzats; llegir el resum de temps; exportar tasques; previsualitzar factures d'hores. |
projects:write | Crear i actualitzar projectes, columnes i definicions de camps personalitzats; arxivar i desarxivar; importar tasques. |
projects:delete | Esborrar de manera permanent projectes, columnes i definicions de camps personalitzats. |
tasks:read | Cercar i consultar tasques, comentaris, relacions, vincles, adjunts, imputacions de temps, activitat i etiquetes; llegir l'agenda i el temporitzador en marxa. |
tasks:write | Crear i actualitzar tasques, comentaris, relacions, etiquetes, vincles, adjunts i imputacions de temps; canviar l'estat i la persona assignada; arrencar i aturar el temporitzador. |
tasks:delete | Esborrar de manera permanent tasques, comentaris, adjunts, imputacions de temps i etiquetes. |
users:read | Llistar els membres de l'empresa i consultar l'usuari actual. |
notifications:read | Llistar les notificacions de qui té la key. |
notifications:write | Marcar notificacions com a llegides. |
Cartera de NIF
Scopes detallats per als NIF que té el teu compte. Funcionen sobre
/v1/accounts/{account}/companies… i necessiten una API key: el consentiment
mai no els concedeix. Qualsevol compte, en qualsevol pla, llista i consulta els
seus propis NIF, així que companies:* no té gate de pla. El que el pla
controla és afegir un NIF que paga el compte, i ho fa dins de l'operació
(NIF addicionals).
| Scope | Permet |
|---|---|
companies:read | Llistar i consultar els NIF del compte, les seves estadístiques, el seu estat de creació i la seva aptitud per emetre, la vista prèvia del càrrec d'un NIF addicional i el resum consolidat de compliment de jornada. |
companies:write | Donar d'alta, editar, activar i desactivar NIF del compte, i verificar la creació d'un. |
companies:delete | Arxivar un NIF del compte. |
Cartera de NIF descriu les operacions.
Administració del compte
Scopes per al que té el propi compte: les seves claus, el seu equip i la seva
titularitat. Necessiten una API key, tret d'account:read, que el consentiment
OAuth concedeix mitjançant profile.read. No són privilegiats, així que el
super-scope * sí que els cobreix.
| Scope | Permet | Pla |
|---|---|---|
account:read | Llistar i consultar les API keys del compte, i llegir-ne el consum, la facturació, les plantilles de la seva personalització i la verificació censal AEAT d'un NIF. | Qualsevol pla |
account:write | Crear, canviar els NIF de, rotar i revocar les API keys del compte, i actualitzar la personalització. | Qualsevol pla |
account:owner | Transferir la titularitat del compte. La persona que hi ha darrere de la clau ha de ser el titular actual. | Qualsevol pla |
members:read | Llegir els membres del compte, els seus grants i les seves restriccions de mòdul. | Requereix el mòdul user_management |
members:write | Afegir, canviar i eliminar membres, fixar i revocar els seus grants i canviar les seves restriccions de mòdul. | Requereix el mòdul user_management |
invitations:read | Llistar i consultar les invitacions del compte. | Requereix el mòdul user_management |
invitations:write | Enviar, reenviar i revocar invitacions. | Requereix el mòdul user_management |
nif_transfers:read | Llistar els traspassos de NIF que va emetre el compte. | Requereix el mòdul user_management |
nif_transfers:write | Emetre, acceptar i revocar un traspàs de NIF. | Requereix el mòdul user_management |
api_keys:read, api_keys:write, api_keys:delete | Reservats: cap endpoint ni tool els exigeix. | Qualsevol pla |
GET /v1/me no necessita cap scope: qualsevol credencial vàlida es pot
introspeccionar. En un pla sense el mòdul user_management els scopes
members:*, invitations:* i nif_transfers:* no es poden assignar a una
clau, i GET /v1/me llista només els efectius. Els plans empresario i
enterprise inclouen el mòdul.
Les API keys no es gestionen amb api_keys:*. Els sis endpoints de
/v1/accounts/{account}/api-keys els governen account:read (llistar i
consultar) i account:write (crear, canviar els NIF de, rotar el secret i
revocar) — consulta API keys i
claus acotades. Comptes i NIF
descriu l'equip i els traspassos.
Scopes privilegiats
Dos scopes són privilegiats: accounts:read i accounts:write. Permeten que
un compte aprovisioni, administri i cobri comptes per als seus clients, cosa que
descriu comptes gestionats. Es distingeixen de tots
els altres scopes:
| Scope | Permet |
|---|---|
accounts:read | Llistar i consultar els comptes gestionats del teu compte, llegir el seu consum d'aprovisionament i la vista prèvia d'un canvi de pla, i descarregar la plantilla d'una importació massiva. |
accounts:write | Aprovisionar un compte gestionat, canviar-ne el pla i el nivell, reemetre'n el val, acabar-ne la gestió, i previsualitzar i aplicar una importació massiva. |
- Factuarea els concedeix, compte per compte. Només Factuarea pot: l'API no
té cap operació que concedeixi el privilegi.
GET /v1/meet diu si el teu compte el té, aaccount.is_provideriaccount.privileged_scopes. No te'ls pots assignar: crear una clau que els llista sense el privilegi respon403 privileged_scope_requiredi no crea res. - Es comproven a cada petició. La clau ha de llistar el scope, el teu compte
ha de tenir avui el privilegi i la persona que va emetre la clau ha de continuar
sent titular o administrador del teu compte. Si falla qualsevol de les tres, la
resposta és
403 privileged_scope_required, i les dues causes responen igual. Res no surt d'una memòria cau: si retirem el privilegi, o aquesta persona deixa de ser titular o administrador, la mateixa clau deixa de funcionar a la petició següent. - No arriben per OAuth. El consentiment mai no els concedeix: fes servir una API key, també amb el servidor MCP.
- Cap pla els controla. El gate és el privilegi, no el pla.
*no els cobreix. Consulta el super-scope.
Super-scope
| Scope | Permet |
|---|---|
* | Accés total — equivalent a tenir tots els altres scopes anteriors, excepte els privilegiats accounts:read i accounts:write. Reservat per a migracions puntuals. Evita usar-lo en integracions de producció. |
* no cobreix accounts:*. Una clau que només duu * respon
403 insufficient_scope en una operació
privilegiada, per àmplia que sembli. * sí que cobreix la resta del compte: les
claus, l'equip, la titularitat i els traspassos de NIF. Una clau amb *
necessita operate a cada NIF al qual arriba, i amb el privilegi pots llistar
* i accounts:* junts.
Si un request usa un endpoint que requereix un scope no concedit a la
clau, la resposta és 403 amb type: authorization_error i
code: insufficient_scope.
{
"error": {
"type": "authorization_error",
"code": "insufficient_scope",
"message": "Esta operación requiere el scope 'account:write'. Tu API key solo tiene los scopes: ninguno.",
"doc_url": "https://docs.factuarea.com/guides/errors#insufficient_scope",
"request_id": "req_01JBVH7K9Y4N3CDQ2EHJB1AGSV"
}
}Gestió de claus
Les API keys es poden gestionar des del dashboard de desenvolupadors (app.factuarea.com/settings/developers/api-keys) o mitjançant els endpoints v1 self-service. Ambdues superfícies permeten crear, rotar i revocar claus i fixar la llista d'accés per IP en crear-ne una; el dashboard també l'edita després. El dashboard és per als titulars i administradors del compte, i les claus que emets mai no arriben a més que tu: qui pot emetre una key ho explica.
Les metadades de la clau autenticada (id, name, prefix, scopes, tier,
environment, last_used_at, expires_at) es poden llegir via GET /v1/me,
juntament amb els NIF a què arriba la clau — però el secret mai es
retorna.
No hi ha cap endpoint per "veure" el secret. Només es mostra una vegada en crear-lo. Si perds el valor has de rotar la clau al dashboard i tornar a desplegar el nou secret. És deliberat: minimitza la finestra d'exposició.
Política de rotació
Les API keys i els secrets de client OAuth són credencials de llarga vida i s'han de rotar en un calendari i de seguida després de qualsevol sospita de filtració.
- Els prefixos són la font de veritat de l'entorn:
fact_live_(producció) ifact_test_(sandbox). No els barregis mai entre entorns. - Rota des del dashboard (o mitjançant els
endpoints self-service
account:write) per emetre un secret nou. El nou secret es retorna una sola vegada — desa'l de seguida, no es torna a mostrar. - Finestra de gràcia (doble secret). Després d'una rotació el secret
anterior continua funcionant durant una finestra de gràcia de 24
hores, perquè puguis desplegar el nou secret sense temps
d'inactivitat. Durant aquesta finestra s'accepten tant el nou com
l'anterior; en expirar la finestra el secret anterior es rebutja i es
purga. Un request que continuï usant el secret anterior rep un header
199Warningque indica quantes hores queden abans que deixi de funcionar. - Quan rotar: en un calendari regular (p. ex. cada 90 dies), sempre que un membre de l'equip amb accés marxi, i immediatament si un secret queda exposat alguna vegada en logs, control de versions o un client públic. La rotació deixa el secret anterior vàlid durant la finestra de gràcia de 24 hores, així que, per tallar de cop un secret exposat, revoca la clau en lloc seu (la revocació és immediata) i emet-ne una de nova.
- Revoca per invalidar una clau permanentment. Qualsevol request
posterior amb ella falla amb
401. La revocació no té finestra de gràcia — és instantània i irreversible.
Els secrets estan lligats a un sol compte i arriben només als NIF del seu àmbit; no s'han d'incrustar mai en navegadors, apps mòbils ni cap client públic — mantén-los només al servidor.
Llista d'accés per IP
Cada API key es pot restringir a una llista d'IPs o rangs CIDR, des del
dashboard o amb ip_allowlist en crear la clau. Si el request arriba des d'una
IP fora de la llista d'accés, la resposta és 401 amb el codi
ip_not_allowed i l'incident es registra al log
d'auditoria. Deixa la llista d'accés buida per permetre qualsevol IP.
Errors d'autenticació
Les fallades relacionades amb l'API key responen amb HTTP 401 (o 403 quan
la clau autentica però no n'hi ha prou) i l'embolcall d'error estàndard. El camp
code distingeix el cas:
code | HTTP | Causa |
|---|---|---|
missing_api_key | 401 | No s'ha enviat cap capçalera d'autenticació. |
invalid_api_key | 401 | La clau no existeix, té un format incorrecte o el secret no coincideix amb el hash emmagatzemat. |
api_key_revoked | 401 | El secret és correcte, però la clau es va revocar. |
api_key_expired | 401 | El secret és correcte, però la clau ha superat el seu expires_at. |
ip_not_allowed | 401 | El request arriba des d'una IP fora de la llista d'accés de la clau. |
too_many_auth_failures | 429 | Massa intents d'autenticació fallits; espera abans de reintentar. |
insufficient_scope | 403 | La clau no té el scope que requereix l'endpoint. * no cobreix els privilegiats accounts:*. |
privileged_scope_required | 403 | L'operació exigeix un scope privilegiat i el compte no té el privilegi, o la persona que va emetre la clau ja no és titular ni administrador. |
live_credential_required | 403 | Una clau fact_test_ intenta canviar el compte: les seves claus, el seu equip, la seva titularitat, els seus traspassos o la seva cartera de NIF. |
Cada resposta inclou un request_id únic (també a la
capçalera X-Request-Id) que pots facilitar a suport en investigar.
{
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"message": "La API key proporcionada no es válida.",
"request_id": "req_01JBVH7K9Y4N3CDQ2EHJB1AGSV",
"doc_url": "https://docs.factuarea.com/guides/errors#invalid_api_key"
}
}Bones pràctiques
- Mai pugis API keys a repositoris — usa variables d'entorn o un gestor de secrets (AWS Secrets Manager, Doppler, 1Password Service Accounts).
- Crea una clau per integració: facilita rotar i auditar l'accés sense afectar la resta.
- Limita els scopes al mínim necessari. Un script d'exportació només necessita
scopes
:readconcrets, i a una clau que només duu scopes:readli bastaviewals seus NIF. - Dona a cada clau només els NIF que necessita, amb
scoped_company_ids(claus acotades). - Activa la llista d'accés per IP per a integracions servidor a servidor amb IPs estables.
- Configura
expires_atper a claus temporals (p. ex. consultories, demos). - Audita l'ús des del dashboard:
Developers > API Keys > Activitymostra IPs, rutes i errors per clau.
Credencials per a integracions
Les operacions REST i MCP de botigues requereixen una API key amb els scopes de botigues. El consentiment OAuth no concedeix aquests scopes. Autoritza per separat la connexió del proveïdor: una clau de Factuarea no és una credencial de WooCommerce o Shopify. L’autenticació MCP també requereix un client compatible amb la revisió 2026-07-28.