Autenticació
API keys amb prefixos fact_live_ / fact_test_, scopes granulars, 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 generats al dashboard de desenvolupadors
(app.factuarea.com/settings/developers/api-keys)
i vinculats a una empresa concreta. 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 la teva empresa real (producció);fact_test_opera sobre una empresa sandbox aïllada 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. Si la perds, l'has de rotar.
- Hash a la BD: el backend només emmagatzema el hash bcrypt cost-12 del secret. No hi ha cap manera de recuperar-lo.
Tots els exemples d'aquesta guia usen una clau fact_live_, però el mateix
request funciona amb una clau fact_test_ — només cal canviar el prefix per operar
sobre dades de sandbox. 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/clients \
-H "Authorization: Bearer fact_live_8KqW3pXnR2VbY7TcA9eFmN5z"Capçalera X-API-Key
curl https://api.factuarea.com/v1/clients \
-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('clients?limit=10');
$body = json_decode((string) $response->getBody(), true);const res = await fetch('https://api.factuarea.com/v1/clients?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/clients',
params={'limit': 10},
headers={
'Authorization': f"Bearer {os.environ['FACTUAREA_API_KEY']}",
'Accept': 'application/json',
},
)
resp.raise_for_status()
data = resp.json()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 provoca invalid_scope en crear la clau.
Clients i catàleg
| Scope | Permet |
|---|---|
clients:read | Llistar i consultar clients. |
clients:write | Crear i actualitzar clients. |
clients:delete | Eliminar clients. |
products:read | Llistar i consultar productes. |
products:write | Crear i actualitzar productes. |
products:delete | Eliminar productes. |
suppliers:read | Llistar i consultar proveïdors. |
suppliers:write | Crear i actualitzar proveïdors. |
suppliers:delete | Eliminar proveïdors. |
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 factures de compra. |
purchase_invoices:write | Crear i actualitzar factures de compra. |
purchase_invoices:delete | Eliminar factures de compra. |
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 (global) de tipus impositius. |
taxes:write | Crear i actualitzar tipus impositius. |
taxes:delete | Eliminar tipus impositius. |
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. |
account:read | Llegir el compte autenticat (GET /v1/account). |
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 webhook endpoints i lliuraments. |
webhooks:write | Crear, actualitzar, rotar i fer ping a webhook endpoints. |
webhooks:delete | Eliminar webhook endpoints. |
events:read | Llegir el catàleg d'esdeveniments i esdeveniments individuals. |
Super-scope
| Scope | Permet |
|---|---|
* | Accés total — equivalent a tenir tots els altres scopes anteriors. Reservat per a claus d'owner / migracions puntuals. Evita usar-lo en integracions de producció. |
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": "La API key no tiene el scope requerido para esta operación.",
"request_id": "req_01JBVH7..."
}
}Gestió de claus
Les API keys es gestionen des del dashboard de desenvolupadors
(app.factuarea.com/settings/developers/api-keys),
no a través de l'API pública. Des d'allà pots crear claus, rotar el seu
secret, revocar-les, configurar scopes, un expires_at opcional i una
llista d'accés per IP.
Les metadades de la clau autenticada (id, name, prefix, scopes, tier,
last_used_at, expires_at) es poden llegir via GET /v1/account — 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ó.
Rotació i revocació
- Rota des del dashboard per emetre un secret nou. Tant el secret antic com el nou continuen sent vàlids durant un període de gràcia perquè puguis desplegar el nou sense temps d'inactivitat.
- Revoca per invalidar una clau a l'instant. Qualsevol request posterior amb
ella falla amb
401 api_key_revoked. Útil quan sospites d'una filtració.
Llista d'accés per IP
Cada API key es pot restringir a una llista d'IPs o rangs CIDR des del
dashboard. Si el request arriba des d'una IP fora de la llista d'accés, la
resposta és 401 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 per a
insufficient_scope) 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 | La clau va ser revocada o ha caducat. Crea'n una de nova al dashboard. |
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. |
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. - 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.
Inici ràpid
La teva primera factura en 5 minuts — verifica la teva key, aconsegueix una sèrie i un impost, crea un client, emet una factura i envia-la. Una sola seqüència de copiar i enganxar contra una key fact_test_.
Mode de prova i sandbox
Crea la teva integració de forma segura amb claus fact_test_ — dades de sandbox aïllades i AEAT, email i webhooks desactivats.