Provar comptes gestionats amb clau fact_test_
Recorre tot el flux d'aprovisionament amb una clau de proves: comptes de proves, importació, lectures i esdeveniments, sense cobrament ni reclamació.
Pots assajar tot l'aprovisionament de comptes de clients amb una clau fact_test_ abans de tocar un client real. No es cobra res, no surt cap val ni cap correu, no hi intervé cap empresa real i res no arriba a VeriFactu. Aquesta guia recorre el camí en cinc passos, des de llegir el teu propi compte fins a llegir els esdeveniments d'un compte de proves, i acaba amb el que el camí no et deixa fer, perquè sàpigues què provar amb una clau de producció.
Dona per fet que aprovisiones comptes per als teus clients com descriu comptes gestionats. Com es comporta una clau de proves a la resta de l'API és a mode de prova i sandbox.
Què és un compte de proves
Un compte de proves és un compte gestionat creat amb una clau fact_test_. És un compte gestionat normal a l'entorn test, amb aquestes diferències:
| Aspecte | Com funciona |
|---|---|
| Entorn | test. És l'entorn de la clau que el va crear, no canvia mai, i un compte de proves mai no passa a ser de producció. |
| Qui hi arriba | Les claus fact_test_ del teu compte i l'aplicació web en Mode de proves. Una clau de producció respon 404 account_not_found, igual que amb un compte que no és teu. |
| NIF | El NIF que li dónes, com a empresa sandbox sense cap empresa real al darrere. |
| Estat | provisioned per sempre. No té titular ni val, i ningú no el reclama. |
| Cost | Cap. No hi ha cap crida al proveïdor de pagament, no es demana mètode de pagament i no compta per al teu topall de comptes gestionats. paid_by_provider val true perquè el teu compte n'és el pagador, però no es cobra res. |
| Efectes | Cap al món real. L'empresa sandbox no envia cap registre a VeriFactu ni cap correu real. |
Abans de començar
Necessites tres coses:
- El privilegi de proveïdor.
accounts:readiaccounts:writesón scopes privilegiats que concedim compte per compte, també per als comptes de proves: consulta scopes privilegiats. Un compte al seu trial pot crear comptes de proves, i només aquests. - Una clau de proves. Crea-la a Configuració → Desenvolupadors → API Keys triant l'entorn de proves, o amb una clau de producció mitjançant
POST /v1/accounts/{account}/api-keysambenvironmentatest. Dona-liaccounts:readiaccounts:write, i a méswebhooks:readper al pas 5: és l'únic scope de webhooks que pot portar una clau de proves. - Una
Idempotency-Keya les escriptures irreversibles. Aprovisionar, aplicar una importació, canviar el pla i acabar la gestió la necessiten també amb una clau de proves, i una crida sense ella respon422 idempotency_key_required.
El camí en una taula
| Pas | Operació | Què obté una clau de proves |
|---|---|---|
| 1. Llegeix el teu compte | GET /v1/me | 200. El teu compte real, la clau amb environment test, i els teus comptes de proves a client_accounts. |
| 2. Aprovisiona un compte de proves | POST /v1/accounts | 201 amb environment test i sense val. |
| 3. Importa un fitxer de prova | POST /v1/accounts/imports/preview i POST /v1/accounts/imports | 200 i 201. Les files managed_account creen comptes de proves i les files own_nif surten ERROR. |
| 4. Opera el compte de proves | GET /v1/accounts/{account}, PATCH …/access-level, PATCH …/plan i DELETE …/management | 200, sense cobrament. |
| 5. Llegeix-ne els esdeveniments | GET …/webhooks i GET …/deliveries | 200. Lliuraments registrats, pending, mai enviats. |
1. Llegeix el teu propi compte
Una clau fact_test_ pertany al teu compte real, així que el llegeix com ho fa una clau de producció. Comença preguntant què és la clau. GET /v1/me no necessita cap scope:
curl https://api.factuarea.com/v1/me \
-H "Authorization: Bearer $FACTUAREA_TEST_KEY"{
"data": {
"object": "me",
"account": {
"id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a00",
"name": "Asesoría Martínez",
"environment": "live",
"is_provider": true,
"privileged_scopes": [
"accounts:read",
"accounts:write"
]
},
"api_key": {
"name": "Pruebas de integración",
"prefix": "fact_test_1OSf9KdP",
"scopes": [
"accounts:read",
"accounts:write",
"webhooks:read"
],
"environment": "test"
},
"client_accounts": [],
"client_accounts_visible": true,
"client_accounts_has_more": false
}
}La resposta està abreujada. Llegeix-la així:
- La clau és de proves, el compte és real.
api_key.environmentéstestiaccount.environmentéslive. Elscopede la resposta, que aquí no es mostra, llista l'empresa sandbox a la qual arriba la clau, i només aquesta. is_provideriprivileged_scopeset diuen si tens el privilegi de proveïdor. Sense ell, l'aprovisionament del pas 2 respon403 privileged_scope_required.client_accountsllista només els teus comptes de proves. Necessitaaccounts:readen vigor a la clau, o torna buit ambclient_accounts_visibleafalse. L'exemple és buit perquè encara no existeix cap compte de proves, i després del pas 2 llista el nou. Els teus comptes de producció no hi surten: els llisten les claus de producció.
Les altres lectures del teu propi compte responen amb una clau de proves com amb una de producció, cadascuna amb l'scope de la seva operació i amb les dades reals del teu compte: provisioning-usage, la cartera de NIF, els membres i el consum. Els webhooks i els registres de peticions del compte responen amb els del teu entorn de proves.
Una clau de proves llegeix les dades reals del teu compte, com els seus membres i els seus NIF, i mai no les canvia. Tota escriptura sobre el teu propi compte respon 403 live_credential_required: consulta el que el camí no permet.
2. Aprovisiona un compte de proves
Aprovisiona amb POST /v1/accounts i una clau de proves. És la mateixa crida que en producció, amb el mateix cos, i l'entorn és el de la clau: mai no va al cos. Necessita accounts:write i una Idempotency-Key.
curl -X POST https://api.factuarea.com/v1/accounts \
-H "Authorization: Bearer $FACTUAREA_TEST_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"external_ref": "test-0001",
"plan": "empresario",
"access_level": "operate",
"tax_id": "B12345674",
"legal_name": "Talleres García SL"
}'{
"data": {
"id": "0199b2a0-3e44-7c31-8d10-4b1a2c3d4e01",
"object": "managed_account",
"external_ref": "test-0001",
"status": "provisioned",
"environment": "test",
"plan": "empresario",
"pending_plan": null,
"billing_interval": "monthly",
"access_level": "operate",
"display_name": "Talleres García SL",
"language": "es",
"companies": [
{
"id": "0199b2a0-3e44-7c31-8d10-4b1a2c3d4e02",
"tax_id": "B12345674",
"name": "Talleres García SL"
}
],
"claimed": false,
"claimed_at": null,
"management": {
"status": "active",
"ended_at": null
},
"paid_by_provider": true,
"created_at": "2026-09-30T10:00:00+00:00",
"claim_token": null,
"claim_url": null,
"claim_expires_at": null
}
}La resposta és 201 Created amb Location: /v1/accounts/{id}. Què esperar, en comparació amb un compte de producció:
- Sense val.
claim_token,claim_urliclaim_expires_atsónnull, i no surt cap correu. No enviïssend_email: un compte de proves no té cap val que lliurar. owner_emailés opcional. Un compte de proves no té titular a qui convidar.- El NIF es valida com en producció. Necessita un NIF, CIF o NIE vàlid amb el seu caràcter de control.
- No compta per al teu topall.
provisioning-usageel compta amanaged_accounts.test, ilimitiremainingno es mouen. Les comprovacions de trial, de topall i de mètode de pagament d'un compte de producció no s'executen, així que un proveïdor al seu trial pot aprovisionar comptes de proves. - La crida és idempotent per
external_ref. Repetir-la respon200amb el mateix compte i no crea res.
L'external_ref pertany al teu compte als dos entorns. Reutilitzar-ne un que té un compte de producció respon 409 managed_account_external_ref_in_other_environment, i a l'inrevés. Mantén les referències de proves separades de les de producció, per exemple amb un prefix test-.
Els errors que hi pots trobar són els d'aprovisionar un compte de producció que no depenen d'un cobrament:
| Codi | Estat | Quan |
|---|---|---|
privileged_scope_required | 403 | El teu compte no té el privilegi de proveïdor, o la persona que va emetre la clau ja no n'és titular ni administradora. |
invalid_param_value | 422 | Un camp no passa la validació, per exemple un tax_id sense caràcter de control vàlid. error.param el nomena. |
managed_account_plan_not_self_serve | 422 | plan és enterprise, que només assignem nosaltres per contracte. |
managed_account_external_ref_in_other_environment | 409 | L'external_ref nomena un compte de producció. |
idempotency_key_required | 422 | La petició no porta Idempotency-Key. |
3. Importa un fitxer de prova
La importació massiva funciona amb una clau de proves en dues crides: una previsualització sense efectes i l'aplicació. L'entorn és, una altra vegada, el de la clau. Prova-la amb un fitxer de tres files, separat per punt i coma i amb les columnes de la plantilla:
mode;external_ref;plan;tax_id;legal_name;owner_email
managed_account;test-0002;emprendedor;A58818501;Bodega Sol SL;
managed_account;test-0003;empresario;B28013829;Horno Mar SL;hugo@hornomar.example
own_nif;;;B76543214;Delegación Este SL;Previsualitza-la primer. La previsualització és un POST perquè puja el fitxer, no escriu res i no necessita Idempotency-Key:
curl -X POST https://api.factuarea.com/v1/accounts/imports/preview \
-H "Authorization: Bearer $FACTUAREA_TEST_KEY" \
-F "accounts_file=@clients.csv"{
"data": {
"object": "managed_account_import_preview",
"rows": [
{
"line": 2,
"mode": "managed_account",
"external_ref": "test-0002",
"tax_id": "A58818501",
"status": "VALID",
"code": null,
"errors": {},
"plan": "emprendedor",
"monthly_amount_cents": 0,
"proration_amount_cents": 0
},
{
"line": 3,
"mode": "managed_account",
"external_ref": "test-0003",
"tax_id": "B28013829",
"status": "VALID",
"code": null,
"errors": {},
"plan": "empresario",
"monthly_amount_cents": 0,
"proration_amount_cents": 0
},
{
"line": 4,
"mode": "own_nif",
"external_ref": null,
"tax_id": "B76543214",
"status": "ERROR",
"code": "live_credential_required",
"errors": {},
"plan": null,
"monthly_amount_cents": 0,
"proration_amount_cents": 0
}
],
"totals": {
"total_rows": 3,
"valid": 2,
"warning": 0,
"already_exists": 0,
"blocked": 0,
"error": 1
},
"cost": {
"currency": "EUR",
"total": {
"monthly_amount_cents": 0,
"proration_amount_cents": 0
}
},
"own_company_customers": null
}
}La resposta està abreujada: les files porten més camps i cost també es desglossa per modalitat. Amb una clau de proves:
- Les files
managed_accountsónVALIDi crearien comptes de proves, sense val. - La fila
own_nifésERRORambcodelive_credential_required: un NIF del teu propi compte es dona d'alta només amb una clau de producció. La fila d'opcions de la importació, la que aplica els clients a la teva pròpia empresa, surt igual. - El cost és
0. El total no compta ni la quota mensual ni el prorrateig, i cap crida no arriba al proveïdor de pagament.
Aplica el mateix fitxer amb POST /v1/accounts/imports. Necessita una Idempotency-Key:
curl -X POST https://api.factuarea.com/v1/accounts/imports \
-H "Authorization: Bearer $FACTUAREA_TEST_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-F "accounts_file=@clients.csv"La resposta és 201 Created amb el resultat de l'execució, abreujat aquí:
{
"data": {
"id": "0199b2a0-5f60-7d40-9e20-6d3c4e5f6a05",
"object": "managed_account_import",
"status": "completed",
"stats": {
"total_rows": 3,
"valid": 2,
"warning": 0,
"already_exists": 0,
"blocked": 0,
"error": 1,
"created": 2,
"reconciled": 0,
"customers_queued": 0,
"monthly_amount_cents": 0,
"proration_amount_cents": 0
},
"rows": [
{
"line": 2,
"mode": "managed_account",
"external_ref": "test-0002",
"status": "VALID",
"account_id": "0199b2a0-5f66-7d42-9e21-5c2b3d4e5f03",
"claim_token": null,
"claim_url": null
}
],
"own_company_customers": null
}
}Es creen dos comptes i la fila own_nif no crea res. Cap fila porta un val. Aplica el mateix fitxer una altra vegada per veure la reconciliació: els dos comptes surten ALREADY_EXISTS i no es crea res dues vegades. Les columnes, els límits i els estats de fila són els de la importació massiva.
4. Opera el compte de proves
Les operacions d'aprovisionament anomenen el compte de proves pel seu id al segment {account}. Amb una clau de proves, el teu compte arriba als comptes de proves que va aprovisionar i a cap altre.
- Llegeix-lo.
GET /v1/accounts/{account}respon200amb el compte com al pas 2, icompanies[]en llista el NIF.GET /v1/accountsllista només comptes de proves amb una clau de proves. Una clau de producció respon404 account_not_foundamb l'idd'un compte de proves. - Canvia el teu nivell.
PATCH /v1/accounts/{account}/access-levelamblevelrespon200amb el nouaccess_level. Un compte de proves no es reclama mai, així que pots pujar i baixar el nivell tantes vegades com vulguis. - Canvia el pla.
GET /v1/accounts/{account}/plan/previewambplanmostra els dos imports a0, iPATCH /v1/accounts/{account}/plancanvia el pla a l'acte i sense cobrament. Les dues demanen el nivelloperate, i el canvi necessita unaIdempotency-Key. El preu dels comptes gestionats explica el flux de producció. - Acaba la gestió.
DELETE /v1/accounts/{account}/managementrespon200ambmanagement.statusaended, i des de la teva propera petició el compte respon404, com un de producció: consulta acaba la gestió.
curl -X PATCH https://api.factuarea.com/v1/accounts/0199b2a0-3e44-7c31-8d10-4b1a2c3d4e01/access-level \
-H "Authorization: Bearer $FACTUAREA_TEST_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{ "level": "view" }'Les dades del NIF d'un compte de proves, com les seves factures i els seus contactes, no són accessibles amb una clau. Una clau fact_test_ arriba només a l'empresa sandbox del teu propi compte, així que /v1/companies/{company}/… amb l'id de companies[] respon 404 profile_not_found. Per treballar amb aquestes dades, passa l'aplicació web a Mode de proves amb l'interruptor de mode de proves de la capçalera: els teus comptes de proves apareixen entre els teus comptes de clients, i en triar-ne un, la seva empresa sandbox passa a ser l'activa.
5. Llegeix-ne els esdeveniments en un endpoint de proves
Els esdeveniments d'un compte de proves no arriben mai a un endpoint de producció, i un endpoint de l'entorn test no rep mai els esdeveniments d'un compte de producció. Per seguir el camí necessites un endpoint de proves del teu compte, i una clau de proves no el pot crear: el crees a l'aplicació web.
- Passa l'aplicació web a Mode de proves amb l'interruptor de mode de proves de la capçalera. Has de ser titular o administrador del compte.
- Obre Configuració → Desenvolupadors → Webhooks i tria Compte al selector Empresa | Compte.
- Tria Nou endpoint de compte. Escriu una URL HTTPS, deixa Comptes dels quals rep esdeveniments a Tots, i tria els esdeveniments que vulguis a Esdeveniments subscrits:
account.managed_account_provisionedper al pas 2,account.import_completedper al pas 3, iaccount.access_level_changediaccount.management_endedper al pas 4. El secret de signatura es mostra una sola vegada.
L'endpoint pren l'entorn de la sessió: és test, no canvia mai i és invisible des de producció. El nombre d'endpoints depèn del pla i es compta per compte i entorn. Quan el pla no en té cap, o arribes al límit, l'aplicació rebutja l'endpoint amb addon_required o account_webhook_endpoint_limit_reached: consulta webhooks de compte.
Ara repeteix els passos 2 a 4 amb la teva clau de proves i llegeix què ha passat. Amb webhooks:read, una clau de proves llegeix els endpoints i els lliuraments de l'entorn de proves:
curl https://api.factuarea.com/v1/accounts/$ACCOUNT_ID/webhooks \
-H "Authorization: Bearer $FACTUAREA_TEST_KEY"La resposta llista els teus endpoints de proves, i només aquests. Agafa l'id del teu i llista'n els lliuraments amb GET /v1/accounts/{account}/webhooks/{webhook}/deliveries, on {account} és el teu propi account.id:
{
"data": [
{
"id": "0199b2a0-3e80-7c55-8d41-8f5e6a7b8c07",
"object": "account_webhook_delivery",
"event_id": "0199b2a0-3e7a-7c50-8d40-9a6f7b8c9d08",
"event_type": "account.managed_account_provisioned",
"event_source": "account",
"company_id": null,
"account_relationship": "own",
"environment": "test",
"status": "pending",
"attempt": 0,
"manual_retry_count": 0,
"next_retry_at": null,
"response_status": null,
"response_body": null,
"duration_ms": null,
"payload": {
"id": "0199b2a0-3e7a-7c50-8d40-9a6f7b8c9d08",
"type": "account.managed_account_provisioned",
"livemode": false,
"account": {
"id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a00"
},
"account_relationship": "own",
"company_id": null,
"data": {
"type": "account.managed_account_provisioned",
"object": {
"object": "account_relation",
"id": "0199b2a0-3e46-7c33-8d12-0b7a8c9dae09",
"origin": "provisioned",
"level": "operate",
"previous_level": null,
"grantor_account_id": "0199b2a0-3e44-7c31-8d10-4b1a2c3d4e01",
"grantee_account_id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a00",
"status": "active",
"managed_account_id": "0199b2a0-3e44-7c31-8d10-4b1a2c3d4e01",
"external_ref": "test-0001"
}
}
},
"created_at": "2026-09-30T10:00:01+00:00"
}
],
"has_more": false,
"next_cursor": null
}El lliurament està abreujat. El seu payload és el sobre que rebria un endpoint de producció, amb livemode a false. Què fa diferent un endpoint de proves:
- No s'envia res a la teva URL. El lliurament d'un endpoint de proves es registra i no surt mai de Factuarea, així que queda
pendingambattempta0. El llegeixes aquí, o al detall de l'endpoint de l'aplicació web, i no hi ha cap petició que verificar. - Només arriben els esdeveniments d'un compte de proves. L'entorn d'un esdeveniment
account.*és el del compte al qual es refereix. Els esdeveniments d'un compte de producció no arriben mai a aquest endpoint, i un endpoint de producció no rep mai els esdeveniments dels teus comptes de proves.
Llegeix un sol lliurament amb GET …/deliveries/{delivery}, que el retorna amb el mateix payload. Les lectures dels webhooks de compte conserven les seves guardes amb una clau de proves: la persona que va emetre la clau ha de ser avui titular o administradora del compte, com explica webhooks de compte.
El que el camí no permet
| El que intentes | Què obté una clau de proves | Què fer |
|---|---|---|
| Una escriptura sobre el teu propi compte de producció: equip, invitacions, titularitat, API keys, cartera de NIF, traspassos de NIF o seients d'empleat | 403 live_credential_required, sense escriure res | Fes servir una clau fact_live_. Les lectures del teu compte funcionen amb la clau de proves. |
| Una escriptura sobre un compte gestionat de producció | 404 account_not_found | Una clau de proves arriba només a comptes de proves, i una de producció només a comptes de producció. |
| Crear, editar, provar o esborrar un endpoint de webhook de compte, rotar-ne el secret o reintentar un lliurament | 403: insufficient_scope perquè una clau de proves no pot portar webhooks:write, o module_not_available_in_sandbox si el porta igualment. L'MCP respon live_credential_required. | Crea l'endpoint de proves a l'aplicació web en Mode de proves, com al pas 5. |
Les files own_nif d'una importació, i la seva fila d'opcions | La fila surt ERROR amb code live_credential_required, no crea res i suma 0 als totals | Importa aquestes files amb una clau de producció. |
| Reemetre el val d'un compte de proves, o reclamar-lo | 422 managed_account_not_claimable. Un compte de proves no té val, ni enllaç de reclamació, ni titular. | Res: es queda provisioned per sempre. |
| Passar un compte de proves a producció | Cap operació ho fa, i un compte de proves no canvia mai d'entorn. | Aprovisiona un compte de producció amb una clau fact_live_ i un altre external_ref. Res no passa d'un entorn a l'altre. |
| Veure un cobrament, un prorrateig o un error de pagament | No es cobra res, no es demana mètode de pagament i la previsualització del pla mostra 0. Les comprovacions del teu trial, del teu topall de comptes gestionats i del teu mètode de pagament no s'executen. | Prova el cobrament amb un compte de producció: consulta preu i pagador. |
| Enviar a VeriFactu, o pujar el certificat del client | L'empresa sandbox no té efectes fiscals i el mòdul VeriFactu no està disponible en mode de prova. Tampoc no surt cap correu real. | Segueix el certificat VeriFactu del client amb un compte de producció. |
| Treballar amb les dades del NIF d'un compte de proves per l'API | 404 profile_not_found a /v1/companies/{company}/… | Fes servir l'aplicació web en Mode de proves, com al pas 4. |
Passar a producció
Un compte de proves i un compte de producció són independents, i res del que has creat amb la clau de proves passa a producció. Per passar a producció:
- Aprovisiona els comptes de producció amb una clau
fact_live_. Un compte de producció necessitaowner_email, un mètode de pagament al teu compte i marge sota el teu topall, i es cobra prorratejat a l'acte: consulta preu i pagador. - Dona a cadascun un
external_refnou. El d'un compte de proves respon409des del costat de producció. - Crea un endpoint de producció per als esdeveniments de producció. L'endpoint de proves no els rep mai. Crea'l amb una clau de producció o a l'aplicació web en mode Producció.
Relacionat
aprovisiona comptes per als teus clients, el val de reclamació, el teu nivell i la fi de la gestió.
el que pagues per cada compte gestionat de producció i com es cobra un canvi de pla.
les columnes, les modalitats, els estats de fila i els límits de la importació.
els endpoints, els esdeveniments i el sobre del teu compte i dels seus NIF.
què fa una clau fact_test_ a la resta de l'API.
tots els codis del model de comptes, amb la seva causa i què fer.