Factuarea API

API keys (autoservei)

Llista, crea, rota i revoca les teves API keys des de l'API v1 — el secret es mostra un cop, els environments són live/test i el tier el deriva el teu pla.

Més enllà del dashboard de desenvolupador, Factuarea exposa tot el cicle de vida de les teves API keys des de l'API pública v1, perquè aprovisionis i rotis credencials de manera programàtica. Cinc endpoints sota /v1/account/api-keys cobreixen llistar, crear, recuperar, rotar el secret i revocar — tots limitats a l'empresa autenticada.

OperacióEndpointScope
Llistar keysGET /v1/account/api-keysaccount:read
Crear una keyPOST /v1/account/api-keysaccount:write
Recuperar una keyGET /v1/account/api-keys/{api_key}account:read
Rotar el secretPOST /v1/account/api-keys/{api_key}/rotate_secretaccount:write
Revocar una keyPOST /v1/account/api-keys/{api_key}/revokeaccount:write

{api_key} és l'id de la key — un UUID v7 opac, no el seu prefix ni el seu secret. Mira els esquemes complets a la Referència de l'API.

Llista les teves keys

GET /v1/account/api-keys retorna les teves keys amb paginació per cursor. Cada key exposa el seu prefix, scopes, tier, environment i els timestamps del seu cicle de vida — mai el secret.

curl https://api.factuarea.com/v1/account/api-keys \
  -H "Authorization: Bearer fact_live_8KqW3pXnR2VbY7TcA9eFmN5z"
{
  "data": [
    {
      "object": "api_key",
      "id": "0190f2b1-1c4e-7a3d-9f10-0a1b2c3d4e5f",
      "name": "Production sync",
      "prefix": "fact_live_8KqW3pXn",
      "scopes": ["invoices:read", "invoices:write"],
      "tier": "scale",
      "environment": "live",
      "active": true,
      "revoked": false,
      "last_used_at": "2026-06-23T18:04:11Z",
      "expires_at": null,
      "revoked_at": null
    }
  ],
  "has_more": false,
  "next_cursor": null
}

prefix són els primers caràcters de la key — segur de registrar en logs, no autentica. Fes-lo servir per reconèixer una key als teus propis panells sense desar mai el secret.

Crea una key

POST /v1/account/api-keys emet una nova key i retorna el seu secret en text pla exactament un cop. Desa'l en el moment que el reps — no hi ha cap endpoint per tornar-lo a llegir més tard.

curl -X POST https://api.factuarea.com/v1/account/api-keys \
  -H "Authorization: Bearer fact_live_8KqW3pXnR2VbY7TcA9eFmN5z" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "name": "Reporting export",
    "scopes": ["invoices:read", "pdfs:read"],
    "environment": "test"
  }'

Resposta (201):

{
  "data": {
    "object": "api_key",
    "id": "0190f2c0-77aa-7b21-8c33-1d2e3f405162",
    "name": "Reporting export",
    "prefix": "fact_test_1N0Fnyhh",
    "secret": "fact_test_1N0FnyhhR2VbY7TcA9eFmN5z",
    "scopes": ["invoices:read", "pdfs:read"],
    "tier": "scale",
    "environment": "test"
  }
}

El camp secret apareix només en aquesta resposta 201 (i després d'una rotació). No el retorna mai el llistat, la recuperació ni cap altre endpoint. Si el perds has de rotar la key. Persisteix-lo en un gestor de secrets de seguida — mai en un log ni en un repositori.

Cos de la petició

CampObligatoriNotes
nameEtiqueta llegible (1–120 caràcters).
scopesUn o més scopes del catàleg tancat. Mínim un.
environmentnolive (per defecte) o test. Vegeu a sota.
expires_atnoInstant futur ISO 8601 a partir del qual la key deixa d'autenticar.
allowed_ipsnoLlista opcional d'IPs / CIDR permeses (IPv4, IPv6, /N).

El tier es deriva del pla de la teva empresa (o d'un boost de capacitat actiu quan és superior) — no es fixa des del cos. Si envies un tier, s'ignora. Demanar un scope fora del catàleg tancat, o un scope per sobre del teu pla, retorna 422 amb errors per camp.

El camp environment

Cada key pertany a un dels dos environments, fixat en crear-la i visible a l'objecte de la key:

environmentPrefixOpera sobre
livefact_live_La teva empresa real, amb efectes reals (VeriFactu → AEAT, emails, webhooks).
testfact_test_Una empresa sandbox aïllada amb els efectes externs desactivats.

Passa environment: test en crear una key per emetre una credencial de sandbox; omet-lo per a una key de producció. El prefix reflecteix l'environment, així que els distingeixes sense descodificar la key. Mira Mode de prova i sandbox per saber què es desactiva en test.

Rota el secret

POST /v1/account/api-keys/{api_key}/rotate_secret genera un nou prefix + secret i retorna el nou secret en text pla exactament un cop. El secret anterior continua funcionant durant una finestra de gràcia de 24 hores perquè puguis desplegar el nou sense downtime.

curl -X POST \
  https://api.factuarea.com/v1/account/api-keys/0190f2b1-1c4e-7a3d-9f10-0a1b2c3d4e5f/rotate_secret \
  -H "Authorization: Bearer fact_live_8KqW3pXnR2VbY7TcA9eFmN5z"
{
  "data": {
    "object": "api_key",
    "id": "0190f2b1-1c4e-7a3d-9f10-0a1b2c3d4e5f",
    "prefix": "fact_live_Zq7mP4xV",
    "secret": "fact_live_Zq7mP4xVnR2VbY7TcA9eFmN5z",
    "scopes": ["invoices:read", "invoices:write"],
    "environment": "live"
  }
}

Durant la finestra de gràcia de 24 hores autentiquen tant el nou com el secret anterior; una petició que segueixi usant l'anterior rep un header 199 Warning amb el compte enrere d'hores restants. En expirar la finestra el secret anterior es rebutja i es purga. Desplega el nou secret dins d'aquestes 24 hores. La rotació és irreversible.

Revoca una key

POST /v1/account/api-keys/{api_key}/revoke invalida una key de manera permanent. Les peticions posteriors autenticades amb ella fallen amb 401. Un reason opcional (màx 500 caràcters) queda a l'audit log.

curl -X POST \
  https://api.factuarea.com/v1/account/api-keys/0190f2b1-1c4e-7a3d-9f10-0a1b2c3d4e5f/revoke \
  -H "Authorization: Bearer fact_live_8KqW3pXnR2VbY7TcA9eFmN5z" \
  -H "Content-Type: application/json" \
  -d '{"reason": "Rotated out of the deploy pipeline"}'

La revocació és irreversible i no es limita a altres keys: pots revocar la pròpia key amb què estàs autenticant la petició, tallant el teu propi accés. Assegura't de tenir una altra key vàlida al seu lloc abans si encara necessites accés a l'API.

Després de la revocació, les peticions amb aquesta key retornen 401 amb el codi genèric invalid_api_key — no un codi específic de «revocada»:

{
  "error": {
    "type": "authentication_error",
    "code": "invalid_api_key",
    "message": "La API key proporcionada no es válida.",
    "request_id": "req_01JBVH7K9Y4N3CDQ2EHJB1AGSV"
  }
}

Això és anti-enumeració deliberada: l'API no revela mai si una key va ser revocada, ha caducat o no ha existit mai — tota key inutilitzable es veu igual per a un atacant. Ramifica la teva pròpia lògica segons el resultat 200/401, no segons un codi específic de revocada.

Scopes i aïllament

Els cinc endpoints estan protegits pels scopes d'account:

  • account:read — llistar i recuperar keys.
  • account:write — crear, rotar i revocar keys.

Totes les operacions estan limitades a l'empresa autenticada. Un id de key que pertany a una altra empresa retorna 404 api_key_not_found (de nou, anti-enumeració — no revela mai que la key existeix), mai 403.

Gestionar keys segueix requerint una key existent amb els scopes adequats. Crea la teva primera key al dashboard de desenvolupador (app.factuarea.com/settings/developers/api-keys), i després fes servir aquests endpoints per aprovisionar la resta de manera programàtica. Mira Autenticació per al format de la key i les capçaleres.

En aquesta pàgina