Factuarea API

Conciliar amb la metadata de sistema

Les claus de metadata que Factuarea escriu a les factures auto-emeses des d'un cicle de subscripció de Stripe, i com fer servir el filtre de metadata per treure totes les factures d'una subscripció o d'un període de facturació.

Tots els documents de Factuarea porten un objecte metadata de forma lliure on pots escriure el que necessitis. A les factures que Factuarea emet automàticament des d'un cicle de subscripció de Stripe, la plataforma escriu a més un grapat de claus de sistema que lliguen la factura al cobrament del qual va néixer: quina factura de Stripe, quina subscripció, quin període de facturació.

Aquestes claus són el que fa possible la conciliació sense mantenir la teva pròpia taula de correspondències. Fa temps que s'escriuen; aquesta pàgina és on queden documentades.

Abast: cicles de subscripció. Aquestes claus les escriu el flux que auto-emet una factura per un cicle de subscripció cobrat (vegeu cicles de subscripció). Els cobraments solts auto-facturats des de charge.succeeded no les porten avui — per a aquests, correlaciona a través del llistat de cobraments auto-facturats, que exposa els identificadors del costat del cobrament.

Les claus de sistema

ClauQuè identificaFormatPresència
stripe_invoice_idLa factura de Stripe del cicle cobratId de Stripe, in_…Sempre
billing_reasonPer què Stripe va facturar aquell cicleEl billing_reason cru de Stripe — a la pràctica subscription_create (primer cicle) o subscription_cycle (cada renovació), els dos únics que s'auto-facturenSempre
stripe_subscription_idLa subscripció a la qual pertany el cicleId de Stripe, sub_…Opcional — s'omet quan Stripe no envia id de subscripció
period_startPrimer dia del període facturatYYYY-MM-DD, UTCOpcional — s'omet quan falta el timestamp del període
period_endFi del període facturat, literal del period_end d'Stripe — és el límit exclusiu, així que en un cicle mensual és el primer dia del període següent, no l'últim dia d'aquestYYYY-MM-DD, UTCOpcional — s'omet quan falta el timestamp del període

Les claus opcionals no es materialitzen com a nul·les ni buides: quan el valor no aplica, la clau no s'escriu. És deliberat — una clau present amb valor buit semblaria una correlació que existeix però està en blanc, i qualsevol codi que la llegís hauria de distingir «sense subscripció» de «subscripció desconeguda». Comprova la presència de la clau, no el seu valor.

Són claus de sistema. No les escriguis a mà. Són la correlació entre una factura de Factuarea i un objecte de Stripe, i les receptes de conciliació de més avall hi confien. Escriure tu mateix stripe_invoice_id a una factura que no hi ve al cas fa que aquella factura aparegui en una conciliació a la qual no pertany, i res no ho assenyalarà — metadata és de forma lliure per disseny. Fes servir les teves pròpies claus (erp_ref, project_code, …) per a les teves pròpies correlacions.

Les claus es llegeixen allà on sigui la factura: metadata forma part del recurs de factura, i torna com un objecte JSON ({} quan és buit).

Filtrar per metadata

Vuit llistats v1 accepten un filtre metadata:

RecursEndpoint
FacturesGET /v1/invoices
PressupostosGET /v1/quotes
Factures proformaGET /v1/proformas
AlbaransGET /v1/delivery_notes
Factures de compraGET /v1/purchase_invoices
Factures recurrentsGET /v1/recurring_invoices
ProductesGET /v1/products
ProveïdorsGET /v1/suppliers

La sintaxi és deepObject: metadata[clau]=valor, un paràmetre de consulta per parell.

  • Els parells es combinen amb AND. Dos parells retornen els documents que compleixen tots dos.
  • Coincidència exacta al valor; no hi ha coincidència parcial ni per prefix.
  • Fins a 50 parells per petició; a partir d'aquí retorna parameter_invalid_range.
  • Les claus han d'encaixar a [A-Za-z0-9_.-] i mesurar entre 1 i 64 caràcters; qualsevol altra cosa retorna parameter_invalid_enum.
  • El filtre queda fora del contracte {operator, value} dels filtres de columna, així que no existeix la forma metadata[clau][eq]. metadata[clau]=valor és tota la sintaxi.

Deixa que curl codifiqui els claudàtors. [ i ] són caràcters de glob per a curl i caràcters reservats en una URL. Passa els parells amb -G --data-urlencode, com a les receptes de més avall, i curl els codifica correctament. Enganxar un ?metadata[clau]=valor cru en un shell és d'on surt habitualment el «el filtre s'està ignorant».

Recepta: totes les factures d'una subscripció

La conciliació que necessites quan un client et demana totes les factures del seu pla, o quan tanques l'any d'un subscriptor:

curl -G https://api.factuarea.com/v1/invoices \
  -H "Authorization: Bearer $FACTUAREA_API_KEY" \
  --data-urlencode "metadata[stripe_subscription_id]=sub_1QRstuVWXYZabcde" \
  --data-urlencode "limit=100"
{
  "data": [
    {
      "id": "0192f3a4-7b2c-7c1d-9e8f-1a2b3c4d5e6f",
      "object": "invoice",
      "number": "2026/0184",
      "total": "49.90",
      "currency": "EUR",
      "metadata": {
        "stripe_invoice_id": "in_1QRstuVWXYZabcde",
        "billing_reason": "subscription_cycle",
        "stripe_subscription_id": "sub_1QRstuVWXYZabcde",
        "period_start": "2026-07-01",
        "period_end": "2026-08-01"
      }
    }
  ],
  "has_more": false,
  "next_cursor": null
}

El llistat es pagina per cursor com tots els altres: continua llegint mentre has_more valgui true, tornant next_cursor a starting_after. Vegeu Paginació.

Recepta: les factures d'un període de facturació

Dos parells, combinats amb AND: la subscripció i el primer dia del període. És la consulta que respon a «s'ha facturat el cicle de juliol?».

curl -G https://api.factuarea.com/v1/invoices \
  -H "Authorization: Bearer $FACTUAREA_API_KEY" \
  --data-urlencode "metadata[stripe_subscription_id]=sub_1QRstuVWXYZabcde" \
  --data-urlencode "metadata[period_start]=2026-07-01"

Com que period_start i period_end són dates exactes en UTC, filtra pel límit del període en comptes de per un rang — el valor de la metadata és el dia que Stripe reporta per al cicle, no un mes de calendari local. Per escombrar un mes sencer de cicles de totes les subscripcions, treu el parell de la subscripció i consulta metadata[period_start] tot sol.

Filtra per period_start, no per period_end. period_end és el límit superior exclusiu d'Stripe: el cicle de juliol d'una subscripció mensual porta period_start: 2026-07-01 i period_end: 2026-08-01. Consultar metadata[period_end]=2026-07-31 no retorna res, i aquest resultat buit s'assembla exactament a un cicle que no es va facturar mai.

Un array data buit per a un període que esperaves facturat és un senyal real, no un error del filtre. És exactament el cas que explica la safata d'esdeveniments d'integració: obre-la filtrada per provider=stripe i status=skipped i el motiu de descart tipat et dirà si el cicle es va saltar perquè l'auto-facturació estava apagada, perquè el cicle no portava import, o per una altra cosa — i si el pots reprocessar.

En aquesta pàgina