Factuarea API

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_.

Aquesta guia et porta d'una API key acabada de crear a una factura real (en sandbox) en cinc passos. Cada crida de sota és executable copiant i enganxant contra una key fact_test_ — sense emails reals, sense enviament a l'AEAT, sense consumir numeració de producció. Consulta Mode de prova & sandbox per veure què desactiva el mode "test".

Prefereixes un SDK? Si treballes amb TypeScript/Node o PHP, els SDKs oficials embolcallen tot aquest flux amb reintents integrats, idempotència, paginació per cursor i errors tipats — npm install @factuarea/sdk o composer require factuarea/factuarea-php. Els passos HTTP en brut de sota funcionen en qualsevol llenguatge i mostren exactament el que l'SDK envia per dins.

Executa-ho tot primer amb una key fact_test_. La superfície de l'API és idèntica en producció i en test — quan el teu flux funcioni de principi a fi, canvia el prefix a fact_live_ per passar a producció. Aconsegueix una key de test a Settings → Developers → API Keys.

Exporta la teva key un cop perquè cada snippet la reculli:

export FACTUAREA_API_KEY="fact_test_3pXnR2VbY7TcA9eFmN5z8KqW"

La base URL és https://api.factuarea.com/v1. Autentica't amb Authorization: Bearer (o amb el header equivalent X-API-Key). Els identificadors són valors id opacs (UUID v7); els copies d'una resposta a la següent.

Verifica la teva key

GET /v1/account introspecciona la credencial: l'empresa a la qual pertany, el pla, l'estat de l'addon de developer i els scopes i el tier de rate limit de la pròpia key. Necessita el scope account:read.

curl https://api.factuarea.com/v1/account \
  -H "Authorization: Bearer $FACTUAREA_API_KEY"
{
  "data": {
    "object": "account",
    "company": {
      "id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a01",
      "name": "Acme Soluciones SL",
      "tax_id": "B12345678"
    },
    "plan": {
      "slug": "empresario",
      "name": "Empresario"
    },
    "addon": {
      "active": true,
      "in_grace": false,
      "expires_at": null
    },
    "api_key": {
      "id": "01931b3e-7c4a-7f2e-9a8b-4d6e7f8a9b0c",
      "name": "Sandbox integration",
      "prefix": "fact_test_3pXnR2Vb",
      "scopes": [
        "account:read",
        "series:read",
        "taxes:read",
        "clients:write",
        "invoices:write",
        "invoices:send",
        "pdfs:read"
      ],
      "tier": "starter",
      "created_at": "2026-05-01T09:30:00Z",
      "last_used_at": "2026-06-02T08:12:00Z",
      "expires_at": null
    }
  }
}

Un 200 aquí significa que la key és vàlida i pots veure exactament quins scopes porta. Si reps 401 invalid_api_key, revisa el valor; si un pas posterior falla amb 403 insufficient_scope, l'array scopes de dalt et diu què falta.

Aconsegueix els ids que necessitaràs

Una factura referencia una sèrie (la seva numeració) i cada línia referencia un tipus impositiu. Tots dos són recursos existents que llistes un cop i reutilitzes.

Un id de sèrie

GET /v1/series retorna les teves sèries de numeració. Tria'n una el document_type de la qual sigui invoice (la marcada com a is_default és una opció segura). Necessita series:read.

curl "https://api.factuarea.com/v1/series?document_type=invoice" \
  -H "Authorization: Bearer $FACTUAREA_API_KEY"
{
  "data": [
    {
      "id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a0e",
      "object": "series",
      "code": "F-2026",
      "name": "Facturas 2026",
      "document_type": "invoice",
      "prefix": "F-2026-",
      "next_number": 46,
      "year_reset": true,
      "is_default": true,
      "is_active": true,
      "created_at": "2026-01-01T00:00:00Z",
      "updated_at": "2026-01-20T11:30:00Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Copia l'id (01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a0e) — aquest és el teu series_id.

Un id de tipus impositiu

GET /v1/taxes retorna el catàleg d'impostos (impostos globals del sistema + els teus personalitzats). Per a una línia de factura espanyola estàndard vols el tipus d'IVA al 21% — busca type: "vat" i rate: 21. Necessita taxes:read.

curl "https://api.factuarea.com/v1/taxes?type=vat" \
  -H "Authorization: Bearer $FACTUAREA_API_KEY"
{
  "data": [
    {
      "id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a0f",
      "object": "tax",
      "name": "IVA general 21%",
      "code": "IVA21",
      "rate": 21,
      "type": "vat",
      "applies_to": "both",
      "country": "ES",
      "is_default": true,
      "is_active": true,
      "is_system": true
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Copia aquest id — en una línia de factura va a tax_rate_id.

tax_rate_id vs tax_rate. En una línia pots referenciar un tipus del catàleg per tax_rate_id, o saltar-te la cerca i passar el percentatge numèric directament com a tax_rate (p. ex. "tax_rate": 21). Fes servir l'un o l'altre per línia — tax_rate_id manté la línia vinculada al teu catàleg, tax_rate és un override inline ràpid.

Crea un client

La factura necessita algú a qui facturar. El body mínim de client és name més tax_id (l'identificador fiscal espanyol — NIF/CIF/NIE). Necessita clients:write.

Això és una escriptura — envia una Idempotency-Key perquè una petició reintentada no creï mai un client duplicat. Consulta Idempotència.

curl -X POST https://api.factuarea.com/v1/clients \
  -H "Authorization: Bearer $FACTUAREA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "name": "Cliente Demo SL",
    "tax_id": "B98765432"
  }'
{
  "data": {
    "id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a01",
    "object": "client",
    "name": "Cliente Demo SL",
    "commercial_name": null,
    "tax_id": "B98765432",
    "vat_id": null,
    "email": null,
    "phone": null,
    "contact_person": null,
    "billing_emails": [],
    "address": {
      "line1": null,
      "postal_code": null,
      "city": null,
      "province": null,
      "country": null
    },
    "coordinates": null,
    "notes": null,
    "metadata": {},
    "is_active": true,
    "created_at": "2026-06-02T10:30:00Z",
    "updated_at": "2026-06-02T10:30:00Z"
  }
}

(Els camps opcionals que no has enviat tornen com a null; address sempre és un objecte les subclaus del qual s'omplen a mesura que les proporciones.) Copia l'id retornat (01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a01) — aquest és el teu client_id.

Crea la factura

Ara combina els tres ids. POST /v1/invoices requereix client_id, series_id, issued_on, due_on i com a mínim una línia. Cada línia necessita description, quantity i unit_price; afegeix tax_rate_id (o tax_rate) per aplicar IVA. Opcionals per línia: discount_percent i product_id. Necessita invoices:write.

curl -X POST https://api.factuarea.com/v1/invoices \
  -H "Authorization: Bearer $FACTUAREA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "client_id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a01",
    "series_id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a0e",
    "issued_on": "2026-06-02",
    "due_on": "2026-07-02",
    "lines": [
      {
        "description": "Consultoría — junio 2026",
        "quantity": 10,
        "unit_price": 100,
        "tax_rate_id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a0f",
        "discount_percent": 0
      }
    ]
  }'

L'API calcula per tu els totals de la línia i del document i retorna l'embolcall de la factura. Una factura acabada de crear comença com a esborrany: encara sense number definitiu (is_number_assigned: false).

{
  "data": {
    "id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a42",
    "object": "invoice",
    "number": null,
    "is_number_assigned": false,
    "type": "F1",
    "series": {
      "id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a0e",
      "code": "F-2026"
    },
    "client": {
      "id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a01",
      "name": "Cliente Demo SL"
    },
    "status": "draft",
    "issued_on": "2026-06-02",
    "due_on": "2026-07-02",
    "subtotal": 1000,
    "taxes_total": 210,
    "total": 1210,
    "currency": "EUR",
    "notes": null,
    "lines": [
      {
        "object": "invoice_line",
        "description": "Consultoría — junio 2026",
        "product": null,
        "quantity": 10,
        "unit_price": 100,
        "tax_rate": 21,
        "discount_percent": 0,
        "subtotal": 1000,
        "taxes": 210,
        "total": 1210
      }
    ],
    "metadata": {},
    "operation_regime": "general",
    "verifactu_status": "not_applicable",
    "is_corrective": false,
    "corrective": null,
    "payment": null,
    "public_link": null,
    "substituted_by": null,
    "recurring": null,
    "paid_at": null,
    "paid_on": null,
    "sent_at": null,
    "voided_at": null,
    "void_reason": null,
    "created_at": "2026-06-02T10:31:00Z",
    "updated_at": "2026-06-02T10:31:00Z"
  }
}

Fixa't en els camps monetaris calculats: el subtotal de la línia (10 × 100 = 1000), els seus taxes (21% de 1000 = 210) i el total (1210), agregats en el subtotal / taxes_total / total de la factura. Copia l'id de la factura (01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a42) per al pas següent.

Obtén el PDF i envia'l

Amb l'id de la factura pots descarregar el seu PDF i enviar-lo per email al client.

GET /v1/invoices/{id}/pdf transmet el PDF binari (application/pdf). Necessita pdfs:read. Desa'l directament a un fitxer amb l'opció -o de curl:

curl https://api.factuarea.com/v1/invoices/01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a42/pdf \
  -H "Authorization: Bearer $FACTUAREA_API_KEY" \
  -o invoice.pdf

POST /v1/invoices/{id}/send envia la factura per email al client. Sense body fa servir l'email del client registrat a la fitxa; pots sobreescriure el destinatari i la còpia amb to, cc, bcc, subject i body. Necessita invoices:send.

Com que estàs amb una key fact_test_, l'email no s'entrega a cap destinatari real (els efectes del sandbox estan desactivats). La crida igualment té èxit i la factura transiciona com ho faria en producció — perfecte per muntar el teu flux sense fer spam a ningú.

curl -X POST https://api.factuarea.com/v1/invoices/01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a42/send \
  -H "Authorization: Bearer $FACTUAREA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "to": "demo@example.com",
    "subject": "Tu factura de Acme Soluciones SL"
  }'

La resposta és l'embolcall actualitzat de la factura (amb la mateixa forma que dalt), ara amb sent_at poblat.

I ja està

Has verificat una key, has descobert els ids que necessita, has creat un client, has emès una factura amb totals calculats al servidor i l'has enviat — tot contra un sandbox aïllat. A partir d'aquí, apunta el mateix codi a una key fact_live_ per operar sobre la teva empresa real.

En aquesta pàgina