API keys (autoservei)
Emet, llista, acota, rota i revoca les API keys del teu compte des de l'API v1 — qui les pot emetre, els environments live/test, els scopes que pots assignar i el sostre de nivell per NIF.
Més enllà del dashboard de desenvolupador, Factuarea exposa tot el cicle de
vida de les API keys del teu compte des de l'API pública v1, perquè
aprovisionis i rotis credencials de manera programàtica. Una API key pertany al
compte, mai a un dels seus NIF, així que viu a l'eix de compte: sis
endpoints sota /v1/accounts/{account}/api-keys cobreixen llistar, crear,
recuperar, acotar, rotar el secret i revocar.
| Operació | Endpoint | Scope |
|---|---|---|
| Llistar keys | GET /v1/accounts/{account}/api-keys | account:read |
| Crear una key | POST /v1/accounts/{account}/api-keys | account:write |
| Recuperar una key | GET /v1/accounts/{account}/api-keys/{api_key} | account:read |
| Canviar els NIF d'una key | PATCH /v1/accounts/{account}/api-keys/{api_key}/nif-scope | account:write |
| Rotar el secret | POST /v1/accounts/{account}/api-keys/{api_key}/rotate-secret | account:write |
| Revocar una key | POST /v1/accounts/{account}/api-keys/{api_key}/revoke | account:write |
{account} és l'id opac del compte al qual pertany la credencial — el
llegeixes a account.id de GET /v1/me. Ha de ser el teu propi compte:
qualsevol altre valor respon el mateix 404 account_not_found.
{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.
Qui pot emetre una key
Una key l'emet sempre una persona, i el que arriba a fer es mesura contra aquesta persona. Les keys s'emeten en dos llocs:
| On | Qui pot | Què rep la key nova |
|---|---|---|
| L'aplicació web, a Configuració → Desenvolupadors → API Keys | Un titular o administrador del compte propietari del NIF que tens seleccionat. Un membre, un assessor extern (sempre és membre) i una persona que arriba al NIF només per un accés cedit no poden: l'aplicació web demana un administrador del compte. | Els NIF que li assignis, cadascun amb el nivell que et dona el teu rol. |
POST /v1/accounts/{account}/api-keys | Qualsevol key del teu compte que dugui account:write. | NIF dins de l'àmbit de la key que l'emet, i mai més. |
- El nivell surt de la persona. Un
owneri unadminarriben a tots els NIF del compte amboperate. Unmemberarriba només als NIF en què té un grant, amb el nivell d'aquest grant (rols). Una key pren a cada NIF el nivell de la persona que l'ha emesa, i només baixa. - Una key emesa per l'API respon davant de dos límits. El seu àmbit no pot superar el de la key que l'emet, i els seus nivells no poden superar el que té avui la persona que hi ha darrere d'aquesta key.
accounts:readiaccounts:writedemanen més. Són scopes privilegiats: qui emet ha de ser titular o administrador, i el compte ha de tenir un privilegi que només concedeix Factuarea.
Llista les teves keys
GET /v1/accounts/{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.
Les keys revocades continuen a la llista, perquè en vegis l'historial.
curl https://api.factuarea.com/v1/accounts/{account}/api-keys \
-H "Authorization: Bearer fact_live_8KqW3pXnR2VbY7TcA9eFmN5z"{
"data": [
{
"id": "0190f2b1-1c4e-7a3d-9f10-0a1b2c3d4e5f",
"object": "api_key",
"name": "Production sync",
"prefix": "fact_live_8KqW3pXn",
"scopes": ["invoices:read", "invoices:write"],
"tier": "scale",
"environment": "live",
"created_at": "2026-06-01T09:30:00Z",
"last_used_at": "2026-06-23T18:04:11Z",
"expires_at": null,
"revoked_at": null,
"is_active": true,
"is_revoked": false
}
],
"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.
El llistat, la recuperació, la rotació, la revocació i el canvi d'àmbit
treballen sobre les keys l'àmbit complet de les quals cap dins de l'àmbit de la
key amb què t'autentiques. Una key que arriba a un NIF al qual la teva no
arriba no apareix al teu llistat, i demanar-la respon 404 api_key_not_found.
Crea una key
POST /v1/accounts/{account}/api-keys emet una key nova 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/accounts/{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"],
"scoped_company_ids": [
"0193f1a0-5c2e-7b41-8d06-9a1e2f3c4d5e",
"01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a01"
]
}'Resposta (201, amb una capçalera Location que apunta a la key nova):
{
"data": {
"id": "0190f2c0-77aa-7b21-8c33-1d2e3f405162",
"object": "api_key",
"name": "Reporting export",
"prefix": "fact_live_1N0Fnyhh",
"scopes": ["invoices:read", "pdfs:read"],
"tier": "scale",
"environment": "live",
"created_at": "2026-06-24T08:15:00Z",
"last_used_at": null,
"expires_at": null,
"revoked_at": null,
"is_active": true,
"is_revoked": false,
"secret": "fact_live_1N0FnyhhR2VbY7TcA9eFmN5z"
}
}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.
Envia una Idempotency-Key perquè un reintent després d'una fallada de xarxa no
creï una segona key. La repetició respon el mateix 201 amb secret a null,
perquè mai no desem el secret: si no vas rebre la primera resposta, revoca
aquesta key i crea'n una de nova.
Cos de la petició
| Camp | Obligatori | Notes |
|---|---|---|
name | sí | Etiqueta llegible (1–120 caràcters). |
scopes | sí | Un o més scopes del catàleg tancat. Mínim un. Mira els scopes que pots assignar. |
environment | no | live (per defecte) o test. Mira a sota. |
scoped_company_ids | no | Els NIF als quals arriba la key, per id (UUID v7). Si l'omets, la key arriba als mateixos NIF que la key que la crea, i mai a més. No s'admet amb environment: test. Mira els NIF als quals arriba una key. |
expires_at | no | Instant ISO 8601 futur a partir del qual la key deixa d'autenticar. |
ip_allowlist | no | Llista opcional d'IPs / rangs CIDR permesos (IPv4, IPv6, /N). Una petició des d'una altra adreça respon 401 ip_not_allowed. |
El tier es deriva del pla del teu compte: no es fixa des del cos i no
existeix una compra de capacitat independent. Si envies tier, s'ignora.
En crear una key s'apliquen dos topalls, tots dos per tier i tots dos comptats
sobre keys actives. max_api_keys_exceeded
(422) diu que l'empresa que desa la key ja té les keys que permet el seu pla.
portfolio_max_api_keys_exceeded
(422) s'aplica quan el teu compte té dos o més NIF reals i es compta sobre
totes les keys actives del compte, no per NIF, així que donar d'alta un NIF no el
puja. Revocar una key n'allibera la plaça. Límits de peticions
descriu els límits d'una cartera.
El camp environment
Cada key pertany a un dels dos environments, fixat en crear-la i visible a l'objecte de la key:
environment | Prefix | Opera sobre |
|---|---|---|
live | fact_live_ | Els teus NIF reals, amb efectes reals (VeriFactu → AEAT, emails, webhooks). |
test | fact_test_ | L'empresa sandbox del teu compte, aïllada i amb els efectes externs desactivats. |
Passa environment: test en crear una key per emetre una credencial de
sandbox; omet-lo per a una key live. 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.
curl -X POST https://api.factuarea.com/v1/accounts/{account}/api-keys \
-H "Authorization: Bearer fact_live_8KqW3pXnR2VbY7TcA9eFmN5z" \
-H "Content-Type: application/json" \
-d '{"name": "Integration tests", "scopes": ["invoices:read", "invoices:write"], "environment": "test"}'Una key fact_test_ pertany al teu compte real — la seva empresa sandbox viu
dins d'ell — i això decideix el que pot fer amb les keys:
- Arriba només a la seva sandbox. Declarar
scoped_company_idsjuntament ambenvironment: testfalla la validació, perquè una key de proves no té cap altre NIF al qual arribar. Una key live tampoc pot dur la sandbox: barrejar-los respon422 business_rule_violationamb el subcodinif_scope_environment_mismatch. - Llegeix el compte com una key live. Llistar i recuperar keys amb una key de proves respon igual que amb una live.
- Mai no escriu. Crear, rotar, revocar o canviar l'àmbit d'una key amb una
key de proves respon
403 live_credential_requiredi no canvia res. Això inclou demanar una key live, i també demanar una altra key de proves: emet les keys de proves amb una key live o a l'aplicació web.
Provar comptes gestionats explica en quins comptes pot escriure una key de proves.
Els NIF als quals arriba una key
L'àmbit d'una key és la llista de NIF als quals arriba, i GET /v1/me l'enumera
a scope. Es fixa en crear la key, i el pots canviar després.
- Sense
scoped_company_idsla key arriba als mateixos NIF que la key que la crea, mai a més. Es deixen fora els NIF en què la persona que emet no arriba al nivell que demanen els teus scopes. - Amb
scoped_company_idsla key arriba exactament a aquests NIF, i han de cabre a l'àmbit de la key emissora: anomenar-ne un de fora respon422 business_rule_violationamb el subcodinif_scope_exceeds_issueri enumera els NIF que no hi caben, sense crear res. L'àmbit mai no es retalla en silenci. - Quins NIF es poden anomenar. Els del teu compte, i els que el teu compte
assoleix per una relació vigent: un accés cedit o un
compte gestionat. Qualsevol altre, i qualsevol
identificador que no existeixi, respon el mateix
422 invalid_param_valueambparamscoped_company_ids, perquè la resposta no serveixi per fer cens de NIF.
PATCH /v1/accounts/{account}/api-keys/{api_key}/nif-scope
substitueix l'àmbit d'una key que ja vas desplegar. scoped_company_ids és la
llista resultant completa, no un delta, amb almenys un NIF:
curl -X PATCH \
https://api.factuarea.com/v1/accounts/{account}/api-keys/0190f2b1-1c4e-7a3d-9f10-0a1b2c3d4e5f/nif-scope \
-H "Authorization: Bearer fact_live_8KqW3pXnR2VbY7TcA9eFmN5z" \
-H "Content-Type: application/json" \
-d '{"scoped_company_ids": ["0193f1a0-5c2e-7b41-8d06-9a1e2f3c4d5e", "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a01"]}'{
"data": {
"id": "0190f2b1-1c4e-7a3d-9f10-0a1b2c3d4e5f",
"object": "api_key_nif_scope",
"scope": [
{ "id": "0193f1a0-5c2e-7b41-8d06-9a1e2f3c4d5e", "tax_id": "B12345674", "name": "Distribuciones Ejemplo SL" },
{ "id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a01", "tax_id": "B87654323", "name": "Talleres García SL" }
]
}
}- Només dins del teu àmbit. Només pots canviar una key l'àmbit actual de la qual cap dins del teu, i l'àmbit nou mai no pot superar el teu.
- Els scopes de la key es comproven de nou. Cada scope que duu la key ha
d'estar permès pel pla de tots els NIF de la llista nova. Si no, la resposta
és
422 scope_not_allowed_by_plani no canvia res. - Nivells. Un NIF que es queda conserva el nivell desat a la key, així que canviar l'àmbit mai no el puja. Un NIF que entra pren el nivell de la persona que va emetre la key.
- Mateixes respostes que en crear. S'apliquen els mateixos errors
422, i una key revocada respon422 api_key_already_revoked. Una key de proves té un àmbit fix, la seva sandbox: qualsevol altra llista responnif_scope_environment_mismatch.
Claus acotades explica com usar una key que arriba només a una part del compte.
El sostre de nivell per NIF
Cada NIF d'una key té un nivell, view o operate. Es fixa quan el NIF entra a
la key, en emetre-la o en canviar-ne l'àmbit, i només baixa. És el menor de tres:
el nivell de la relació, quan el NIF és d'un altre compte al qual arribes per un
accés cedit o un compte gestionat; el grant de la persona que emet la key; i el
rol d'aquesta persona.
- Escriure exigeix
operate. Una key amb qualsevol scope que no sigui de lectura (:read), inclòs*, necessitaoperatea cada NIF que anomena. A una key que només duu scopes:readli bastaview. - Un NIF que la persona que emet només llegeix. Anomenar-lo juntament amb un
scope d'escriptura respon
422 business_rule_violationamb el subcodinif_access_level_exceeds_emitteri no crea res. Si no declaresscoped_company_ids, es deixen fora els NIF per sota del nivell necessari, i quan no en queda cap la resposta és el mateix422. - Es mesura de nou a cada petició. Compta el menor entre el nivell desat a la
key i el nivell que la persona que emet té en aquell moment. Amb
view, una escriptura respon403 company_read_only, i sense cap nivell, el mateix404 profile_not_foundque un NIF fora de l'àmbit. - Es recalcula a la baixa. Baixar o retirar un grant baixa les keys d'aquella persona, i reduir o acabar un accés entre comptes baixa les keys del compte receptor a la petició següent. Una key que es queda sense cap NIF es revoca. Res no puja per si sol: per obtenir un nivell més alt, emet una key nova.
{
"error": {
"type": "invalid_request_error",
"code": "business_rule_violation",
"subcode": "nif_access_level_exceeds_emitter",
"message": "No puedes dar a la credencial más acceso del que tienes. Sin acceso suficiente en: 01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a01. Una credencial con permisos de escritura solo alcanza NIF en los que operas.",
"param": "scoped_company_ids",
"doc_url": "https://docs.factuarea.com/guides/errors#business_rule_violation",
"request_id": "req_01J8Y3M2Q40000000000000011"
}
}Accés cedit mostra el sostre d'una key en un NIF que un altre compte et deixa assolir, i què passa amb les keys quan aquest accés es redueix o acaba.
Els scopes que pots assignar
scopes pren valors del catàleg tancat d'Autenticació.
Un valor fora d'ell falla la validació amb
422 invalid_param_value.
- El pla decideix, NIF a NIF. Un scope es concedeix només si el pla de tots
els NIF de l'àmbit el permet, i l'excés mai no es retalla en silenci: respon
422 scope_not_allowed_by_plan. Un mòdul bloquejat en mode de prova respon422 scope_not_allowed_in_sandbox. Els scopesmembers:*,invitations:*inif_transfers:*necessiten el mòduluser_management. accounts:readiaccounts:writeno te'ls pots assignar tu. Són scopes privilegiats: una key els duu només mentre el compte tingui un privilegi que només concedeix Factuarea, i només si la persona que emet la key és titular o administrador. Si no, la creació respon403 privileged_scope_requiredi no es crea cap key.*no els cobreix. El super-scope cobreix tots els altres scopes. Amb el privilegi pots llistar*iaccounts:*junts a la mateixa key.
Comptes gestionats explica què obre el privilegi.
Rota el secret
POST /v1/accounts/{account}/api-keys/{api_key}/rotate-secret genera un
prefix + secret nous 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. L'environment
de la key no canvia.
És irreversible, així que la Idempotency-Key és obligatòria: sense ella la
resposta és 422 idempotency_key_required.
curl -X POST \
https://api.factuarea.com/v1/accounts/{account}/api-keys/0190f2b1-1c4e-7a3d-9f10-0a1b2c3d4e5f/rotate-secret \
-H "Authorization: Bearer fact_live_8KqW3pXnR2VbY7TcA9eFmN5z" \
-H "Idempotency-Key: $(uuidgen)"{
"data": {
"id": "0190f2b1-1c4e-7a3d-9f10-0a1b2c3d4e5f",
"object": "api_key",
"name": "Production sync",
"prefix": "fact_live_Zq7mP4xV",
"scopes": ["invoices:read", "invoices:write"],
"tier": "scale",
"environment": "live",
"created_at": "2026-06-01T09:30:00Z",
"last_used_at": "2026-06-23T18:04:11Z",
"expires_at": null,
"revoked_at": null,
"is_active": true,
"is_revoked": false,
"secret": "fact_live_Zq7mP4xVnR2VbY7TcA9eFmN5z"
}
}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 una capçalera
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/accounts/{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. Igual que la
rotació, és irreversible i exigeix una Idempotency-Key.
curl -X POST \
https://api.factuarea.com/v1/accounts/{account}/api-keys/0190f2b1-1c4e-7a3d-9f10-0a1b2c3d4e5f/revoke \
-H "Authorization: Bearer fact_live_8KqW3pXnR2VbY7TcA9eFmN5z" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-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
api_key_revoked:
{
"error": {
"type": "authentication_error",
"code": "api_key_revoked",
"message": "Esta API key ha sido revocada.",
"doc_url": "https://docs.factuarea.com/guides/errors#api_key_revoked",
"request_id": "req_01JBVH7K9Y4N3CDQ2EHJB1AGSV"
}
}El codi és específic perquè el secret encara coincideix: qui l'envia ja té la
key. Un secret que no coincideix amb res respon el genèric
invalid_api_key, i una key caducada respon
api_key_expired.
Scopes i aïllament
Els sis endpoints estan protegits pels scopes d'account:
account:read— llistar i recuperar keys.account:write— crear, canviar l'àmbit de, rotar i revocar keys.
Totes les operacions s'acoten al teu propi compte i, dins d'ell, a l'àmbit de la
key amb què t'autentiques. Les respostes no revelen mai el que existeix, i cap és
un 403:
- Un
{account}que no és teu, no existeix o no és un identificador de compte respon404 account_not_found. - L'
idd'una key que pertany a un altre compte, no existeix o arriba a un NIF fora del teu àmbit respon404 api_key_not_found.
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), com a titular o administrador del compte, 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.
Errors
| Codi | HTTP | Quan |
|---|---|---|
insufficient_scope | 403 | La key no duu ni el scope de l'operació ni *. |
live_credential_required | 403 | Una key fact_test_ intenta crear, rotar, revocar o canviar l'àmbit d'una key. |
privileged_scope_required | 403 | Demanes accounts:read o accounts:write i el compte no té el privilegi, o qui emet ja no és titular ni administrador. |
account_not_found | 404 | {account} no és el teu compte. |
api_key_not_found | 404 | La key no existeix, pertany a un altre compte o arriba a un NIF fora del teu àmbit. |
invalid_param_value | 422 | Un scope és fora del catàleg, o scoped_company_ids anomena un NIF que no existeix o que el teu compte no assoleix. |
business_rule_violation | 422 | Subcodis nif_scope_exceeds_issuer, nif_access_level_exceeds_emitter, nif_scope_environment_mismatch i issuer_company_outside_account. |
scope_not_allowed_by_plan | 422 | Un scope demanat no el permet el pla d'algun NIF de l'àmbit. |
scope_not_allowed_in_sandbox | 422 | Una key de proves demana un scope d'un mòdul bloquejat en mode de prova. |
max_api_keys_exceeded | 422 | L'empresa que desa la key ha assolit les keys que permet el seu pla. |
portfolio_max_api_keys_exceeded | 422 | El compte ha assolit les keys actives que permet una cartera. |
api_key_already_revoked | 422 | Intentes rotar, revocar o canviar l'àmbit d'una key que ja està revocada. |
idempotency_key_required | 422 | Rotes o revoques sense Idempotency-Key. |
Tools MCP
Les mateixes operacions són tools MCP: list_api_keys, get_api_key,
create_api_key, rotate_api_key_secret, revoke_api_key i
update_api_key_nif_scope. Les dues lectures també es poden fer servir per OAuth.
Les quatre escriptures necessiten una API key, perquè el consentiment OAuth mai no
concedeix account:write. Mira Scopes de MCP.
Permisos de botigues
La gestió de botigues fa servir stores:read i stores:write; els scopes del proveïdor són woocommerce_store:read, woocommerce_store:write, shopify_store:read i shopify_store:write. Les proves de connexió requereixen el scope d’escriptura del proveïdor. Aquests scopes s’assignen a API keys i queden fora del consentiment OAuth. Consulta la taula d’operacions de botigues.
Relacionat
keys que arriben només a una part del compte.
el format de la key, el catàleg de scopes, els scopes privilegiats i OAuth.
els rols de l'equip, els grants per NIF i GET /v1/me.
el nivell d'una key en un NIF d'un altre compte i què passa quan l'accés es redueix.
què desactiva una key fact_test_.