Ús
L'arbre de comandes de factuarea — list, show, create, accions de domini, plantilles PDF, escriptures condicionals, descàrregues binàries, pujades multipart, l'escape hatch genèric api i el manifest commands --json.
L'arbre de comandes cobreix tots els recursos de l'API
(factuarea <recurs> [<sub-recurs>] <acció>), generat des de l'especificació
OpenAPI perquè mai es desincronitzi de la superfície real.
Llegir dades
# Llistar (amb paginació automàtica per cursor)
factuarea invoices list --json
factuarea contacts list --paginate --json
# Obtenir-ne un
factuarea invoices show <uuid> --json--json emet el cos cru de l'API per stdout. --paginate recorre totes les
pàgines per tu, seguint next_cursor fins que has_more sigui fals. Consulta
Paginació per a la semàntica del cursor subjacent.
Escriure dades
Passa el cos JSON amb -d (en línia) o --data-file (una ruta). L'API calcula
els totals — no els arrodoneixis per endavant.
factuarea invoices create -d '{"client_id":"…","series_id":"…","lines":[…]}'Cada mutació rep un Idempotency-Key automàtic perquè una petició reintentada
mai creï el recurs dues vegades. Consulta Idempotència.
La clau es genera una vegada per invocació i es reutilitza en els reintents que
fa el mateix CLI davant respostes 429 i 5xx, que esperen el que indica
Retry-After. Per repetir una operació des d'una invocació posterior, per
exemple quan el teu script torna a executar-se després d'un timeout, fixa la clau
amb --idempotency-key <clau> i envia el mateix cos. L'enviament i la
cancel·lació a FACe (invoices face-submissions submit i
face-submissions cancel) fan una sola crida i mai es reintenten: si un falla,
consulta l'enviament abans de tornar a enviar.
Accions de domini
Els canvis d'estat són accions discretes, no un flag d'estat genèric — reflectint el disseny propi de l'API:
factuarea invoices send <uuid>
factuarea invoices mark-paid <uuid>Algunes accions són irreversibles (esborrats, void, conversions, emissió
fiscal). El CLI et demana confirmar-les abans de la crida — consulta
Operacions irreversibles i la
guia de scopes i irreversibilitat.
Eixos d'empresa i de compte
Un recurs penja d'un de dos eixos, i el CLI omple el de la seva ruta a partir d'un flag perquè no l'hagis d'escriure a cada comanda:
| Eix | Ruta | Flag | Comandes |
|---|---|---|---|
| Empresa | /v1/companies/{company}/… | --company | invoices, contacts, time-entries, … |
| Compte | /v1/accounts/{account}/… | --account | account (members, invitations, api-keys, nif-transfers, owner, webhooks, request-logs, usage, provisioning-usage), companies, employee-seats, gestoria workforce-summary |
--company omple l'eix d'empresa: passa l'empresa com a primer argument
posicional o amb el flag, o no l'escriguis quan la teva credencial n'abasti una
de sola (factuarea invoices list --company acme_co --json). Mai omple el
buit del compte, i --account mai omple el de l'empresa.
--account omple l'eix de compte, amb aquestes regles:
- Una lectura (
GET) sense compte fa servir el compte propi de la teva credencial: el queGET /v1/mepublica adata.account.id. Es consulta una vegada per invocació i no s'escriu mai a disc.whoamino mostra aquest id;factuarea account show --jsonsí. - Una escriptura no dedueix mai el compte: anomena'l com a argument
posicional o amb
--account. Sense cap dels dos, el CLI acaba amb un error d'ús (codi2) i no envia res; el missatge anomena el compte propi de la teva credencial i les dues maneres de passar-lo. Donar-lo com a posicional i amb el flag també és un error d'ús. - Una operació irreversible l'últim paràmetre de ruta de la qual és el
compte (
account nif-transfers create,account nif-transfers acceptiaccount owner transfer) el pren només com a argument posicional: allà el flag no val. - A
managed-accountsel compte és el gestionat: un recurs obligatori que escrius sempre com a argument posicional i que el flag no omple mai. - Les rutes arrel d'aprovisionament i d'importació (
GETiPOST /v1/accounts,POST /v1/accounts/imports,POST /v1/accounts/imports/previewiGET /v1/accounts/imports/template) no porten compte, encara que passis--account.
# 1) Una lectura resol el compte sola
# (GET /v1/me, després GET /v1/accounts/<el teu compte>/members)
factuarea account members list --json
# 2) Una escriptura l'ha d'anomenar. Sense el compte falla amb codi 2 i no envia
# res; amb --account la petició va a POST /v1/accounts/<account>/webhooks
factuarea account webhooks create --url https://example.com/hooks --enabled-events account.member_added
factuarea account webhooks create --account <account> --url https://example.com/hooks --enabled-events account.member_added
# 3) Un compte gestionat és el recurs: sempre l'argument posicional
# (GET /v1/accounts/<managed_account>); --account no l'omple
factuarea managed-accounts show <managed_account> --json
# 4) Una ruta arrel d'aprovisionament no porta compte (POST /v1/accounts)
factuarea managed-accounts create --external-ref cliente-0042 --plan emprendedor \
--tax-id B12345674 --legal-name "Talleres García SL" --confirm createfactuarea commands --json publica l'argument ometible a optional_args
({"account": "--account"}, o {"company": "--company"} a l'eix d'empresa) a
cada comanda on un flag l'omple; consulta Agents i scripting. Les
comandes de managed-accounts i les irreversibles amb el compte com a últim
paràmetre no el publiquen.
Comptes gestionats
Per a qui aprovisiona comptes per als seus propis clients. El token de
--confirm és el literal create a les operacions arrel i l'id del recurs a
la resta:
factuarea managed-accounts list --json
factuarea managed-accounts show <managed_account>
factuarea managed-accounts plan preview <managed_account> --plan empresario
factuarea managed-accounts plan update <managed_account> --plan empresario --confirm <managed_account>
factuarea managed-accounts access-level update <managed_account> --level view
factuarea managed-accounts claim-tokens create <managed_account> --send-email --confirm <managed_account>
factuarea managed-accounts management end <managed_account> --confirm <managed_account>managed-accounts claim-tokens create reemet el val de reclamació d'un compte
gestionat. El compte propi ja no té val de reclamació: el va substituir el
traspàs de NIF (factuarea account nif-transfers create, accept, list i
revoke).
Webhooks i registres de peticions del compte
Els endpoints de webhook del compte (account webhooks, amb les seves entregues
a account webhooks deliveries) i els seus registres de peticions
(account request-logs) fan servir l'eix de compte d'amunt: una lectura dedueix
el compte, una escriptura el demana. Consulta Webhooks de compte
per saber què rep un endpoint de compte.
factuarea account webhooks list --json
factuarea account webhooks create --account <account> --url https://example.com/hooks \
--enabled-events account.member_added --account-relationship own
factuarea account webhooks deliveries list <webhook> --status failed --json
factuarea account webhooks deliveries retry --account <account> <webhook> <delivery>
factuarea account request-logs list --only_errors true --json
factuarea account request-logs show <request_id> --jsonControl horari (fitxatges i absències)
L'add-on de control horari afegeix els recursos de jornada — empleats, horaris,
fitxatges, absències, presència, festius, tancaments mensuals i el resum consolidat de
personal del compte (gestoria workforce-summary). Cada comanda es genera des de l'especificació i queda protegida pel seu
scope fi (employees:*, time_entries:*, absences:*, work_schedules:*,
presence:read, holidays:read, payroll_exports:*).
# Fitxar entrada i sortida (cada assentament encadena la seva empremta — RD-llei 8/2019)
factuarea time-entries clock-in -d '{"employee_id":"…","source":"web"}'
factuarea time-entries clock-out -d '{"employee_id":"…","source":"web"}'
# Sol·licitar una absència i aprovar-la
factuarea absence-requests create \
-d '{"employee_id":"…","absence_type_id":"…","start_date":"2026-08-01","end_date":"2026-08-05"}'
factuarea absence-requests approve <uuid>
# Presència de l'equip en viu
factuarea presence live --json
# Tancar el registre mensual inalterable i exportar-lo (ITSS RD-llei 8/2019)
factuarea monthly-time-record-closes create -d '{"year":2026,"month":7}'
factuarea monthly-time-record-closes export <uuid> --format rdley_8_2019 --jsonAutomatitzacions
L'add-on d'automations exposa el motor de regles: una regla escolta un
esdeveniment, una condició decideix si actuar, i s'executa una llista ordenada
d'accions. El mòdul protegeix tot el grup, i cada comanda porta el seu scope fi —
automations:read (8 comandes), automations:write (6),
automation_runs:read (3) i automations:delete (1). Quatre subgrups emmirallen
l'API: catalog, rules (amb rules versions), runs (amb runs steps) i
usage. Consulta la guia d'automatitzacions per al model.
Comença pel catàleg. Els camps avaluables d'un activador són una segona crida, una per activador — no viatgen dins del catàleg:
# Què es pot automatitzar: activadors, operadors i accions registrades.
factuarea automations catalog show --json
# Els camps avaluables d'un activador concret.
factuarea automations catalog trigger-fields invoice.paid --jsonL'alta d'una regla va pel cos JSON complet. actions és una llista
d'objectes, així que no es genera cap opció tipada per a ella, i el binari es
nega a barrejar opcions de camp amb -d/--data-file — tria'n una.
--skeleton imprimeix la plantilla del cos sense cridar l'API:
factuarea automations rules create --skeleton{
"actions": [],
"conditions": {
"<key>": "<string>"
},
"description": "<string>",
"name": "<string>",
"scope": "<empresa|cartera>",
"trigger_type": "<string>"
}# Omple-la i envia-la sencera. L'`scope` es tria aquí i després no es pot canviar.
factuarea automations rules create --json -d '{
"name": "Warn me on a large payment",
"scope": "empresa",
"trigger_type": "invoice.paid",
"conditions": {"field": "total", "operator": "gte", "value": 1000},
"actions": [
{"type": "notify_in_app", "order": 0, "parameters": {
"recipient_type": "role", "role": "admin", "category": "invoice",
"title": "Large payment", "message": "An invoice over 1000 EUR has been paid"
}}
]
}'
# Assaja-la contra un esdeveniment d'exemple: torna la traça per pas i no materialitza res.
factuarea automations rules dry-run <rule_id> --json \
-d '{"event_type":"invoice.paid","event_payload":{"total":1200,"status":"paid"}}'
# Una regla neix en draft i no dispara res fins que l'actives.
factuarea automations rules activate <rule_id>
factuarea automations rules pause <rule_id>
# Llegeix-la i edita-la — cada edició segella una versió nova.
factuarea automations rules show <rule_id> --json
factuarea automations rules update <rule_id> --json -d '{"name":"Warn me on a payment over 2000"}'
# Llista-les amb filtres, recorrent el cursor per tu.
factuarea automations rules list --paginate --json
factuarea automations rules list --status active --trigger_type invoice.paid --json
# Només les regles de cartera: les que vigilen els altres NIF del compte.
factuarea automations rules list --scope cartera --json
# Les versions segellades de la definició.
factuarea automations rules versions list <rule_id> --json
factuarea automations rules versions show <rule_id> 2 --json
# Què ha disparat, i què va fer cada pas.
factuarea automations runs list --paginate --json
factuarea automations runs list --automation_rule_id <rule_id> --status failed --json
# Què va fer una regla de cartera sobre un dels NIF que vigila.
factuarea automations runs list --subject_company_id <company_id> --json
factuarea automations runs show <run_id> --json
factuarea automations runs steps list <run_id> --json
# Consum davant del pressupost del pla per al període.
factuarea automations usage show --jsonUna regla de cartera només la crea la titular del compte, i només quan el
compte té concedit el mòdul gestoria. Vigila els altres NIF del compte (un
d'addicional, un traspassat al compte) i els que un altre compte li cedeix amb el
nivell d'accés operate, mai el NIF propi de la titular. En aquest abast una
regla només avisa: notify_in_app, notify_channel, emit_webhook i
create_calendar_event. Es desa a nom de la titular, que en rep els avisos, i
cada execució porta el NIF subjecte sobre el qual va actuar.
Quatre llistats paginen per cursor —rules list, rules versions list,
runs list i runs steps list— i --paginate recorre totes les pàgines per tu.
L'historial de versions és l'únic el cursor del qual és una cadena numèrica
opaca en comptes d'un UUID, perquè pagina per posició; torna el next_cursor que
et van donar i no en construeixis cap a mà.
Tres comandes d'aquest grup són irreversibles i es neguen a endevinar:
# Rellançar torna a executar DE DEBÒ la feina aparcada: envia correu i entrega webhooks.
factuarea automations runs replay <run_id> --confirm <run_id>
factuarea automations runs steps replay <run_id> 0 --confirm 0
# Esborrar una regla la deixa sense disparar per sempre; les seves versions i execucions segueixen auditables.
factuarea automations rules delete <rule_id> --confirm <rule_id>--confirm pren l'últim argument posicional de la comanda: l'id de la
regla a rules delete, l'id de l'execució a runs replay i l'índex del pas
a runs steps replay. Sense terminal interactiu (o amb --no-input) i sense
--confirm, la comanda surt amb 2 en comptes d'endevinar. A més, tota
mutació feta amb una clau fact_live_ necessita el flag explícit --live —
consulta Mode de prova i
Operacions irreversibles.
Tasques
El mòdul tasks —inclòs en tots els plans— afegeix a l'arbre 80 comandes en set
grups, cadascuna protegida pel seu propi scope fi (projects:read|write|delete,
tasks:read|write|delete, users:read i notifications:read|write), i
projects time-invoices create necessita a més invoices:write, perquè crea una
factura. Els grups surten dels operationId de l'spec:
| Grup | Què cobreix |
|---|---|
projects | Projectes, les seves columnes (projects columns), camps personalitzats, exportació i importació de tasques (projects tasks), el resum de temps i la factura de les hores imputades |
tasks | Tasques i els seus subrecursos: comentaris, adjunts, imputacions de temps (tasks time-entries), temporitzador, etiquetes, relacions, vincles amb documents i contactes, activitat |
task-labels | El catàleg d'etiquetes de tasca de l'empresa |
task-timers | El temporitzador en marxa de qui té la key |
users | Els membres de l'empresa als quals es pot assignar una tasca |
notifications | Les notificacions de qui té la key |
agenda | L'agenda combinada: tasques amb venciment, venciments de documents, terminis fiscals i absències |
# Un projecte: la seva clau (una lletra més fins a nou lletres o dígits) prefixa les claus de les seves tasques (WEB-1, WEB-2…)
factuarea projects list --json
factuarea projects create --name "Web redesign" --key WEB --json
factuarea projects columns list <project_id> --json
# Crear una tasca. Amb el cos complet també pots vincular-la a un document o a un
# contacte a la mateixa crida amb `entity_link` (invoice, quote, contact, product…).
factuarea tasks create --json -d '{
"project_id": "<project_id>",
"title": "Prepare the quote",
"priority": "high",
"due_on": "2026-10-15",
"entity_link": {"type": "quote", "id": "<quote_id>"}
}'
# Amb flags, cada camp personalitzat és `<id del camp>=<valor>` i tots els valors viatgen com a text.
factuarea tasks create --project-id <project_id> --title "Call the customer" \
--custom-fields <field_id>=42 --custom-fields <other_field_id>=high
# Les comandes demanen l'UUID; resol abans una clau com WEB-1.
factuarea tasks find-by-key WEB-1 --json
# Canviar-ne l'estat: a una columna del projecte o a un estat virtual (`planned` és el backlog).
factuarea tasks status <task_id> --column-id <column_id>
factuarea tasks status <task_id> --status planned
# Cercar, recorrent el cursor per tu.
factuarea tasks search --project_id <project_id> --status active --paginate --json
# Les etiquetes de tasca de l'empresa.
factuarea task-labels list --json
# Imputar temps: un període tancat (ISO 8601 amb zona horària)…
factuarea tasks time-entries list <task_id> --paginate --json
factuarea tasks time-entries create <task_id> \
--started-at 2026-09-28T09:00:00+02:00 --ended-at 2026-09-28T10:30:00+02:00 \
--description "Quote review"
# …o amb el temporitzador de qui té la key, que en pot tenir només un en marxa.
factuarea tasks timer start <task_id>
factuarea task-timers current --json # `{"data": null}` si no n'hi ha cap en marxa
factuarea task-timers stop --json
# Previsualitzar i després crear l'esborrany de factura de les hores facturables d'un mes.
factuarea projects time-invoices preview <project_id> \
-d '{"period":{"from":"2026-09-01","to":"2026-09-30"},"grouping":"per_task"}' --json
# Esborrar una columna amb tasques exigeix una destinació per a elles. És irreversible: sense
# terminal interactiu cal confirmar amb --confirm, i el que es confirma és l'ÚLTIM argument
# posicional (aquí, la columna esborrada).
factuarea projects columns delete <project_id> <column_id> \
--move_to_column_id <other_column_id> --confirm <column_id>Esborrar projectes, columnes, camps personalitzats, etiquetes, tasques (també
tasks bulk-delete), comentaris, adjunts i imputacions de temps és irreversible i
demana confirmació. Consulta la guia de projectes i tasques per al
model.
task-timers no és el fitxatge de jornada. El temporitzador i les comandes
tasks time-entries registren el temps dedicat a una tasca, per mesurar-lo i
facturar-lo. No són el registre del mòdul de control horari
(factuarea time-entries clock-in, més amunt), que té el seu propi scope i el
seu propi registre inalterable. Consulta Temps imputat a tasques.
Plantilles PDF i presentació de documents
La biblioteca de plantilles PDF i la presentació de cada document tenen les seves pròpies comandes, generades des de l'spec com la resta de l'arbre:
| Grup | Comandes |
|---|---|
pdf-templates | list, create, find, update, duplicate, archive, restore, impact, publish-revision, revision, defaults-get, defaults-set, contact-default-get, contact-default-set, asset-upload, asset-get |
pdf-commercial-identities | list, create, find, update, archive, restore, impact, publish-revision, revision |
pdf-template-previews | create |
pdf-artifacts | prepare, render, show, download |
invoices, quotes, proformas, delivery-notes | get-presentation, assign-presentation, list-presentations, revise-presentation |
series | get-pdf-template, assign-pdf-template |
Totes pengen de l'eix d'empresa (/v1/companies/{company}/pdf-templates,
/v1/companies/{company}/pdf-artifacts,
/v1/companies/{company}/invoices/{invoice}/presentation…), així que reben
l'empresa com qualsevol altra comanda d'empresa: com a primer argument
posicional, amb --company o sense indicar-la quan la teva credencial arriba a
una sola empresa. Consulta Eixos d'empresa i de compte i
el segment d'empresa. Els binaris anteriors no tenen
aquestes comandes: comprova que factuarea commands --json les inclou.
# Create a template in the company library: only --name is required.
factuarea pdf-templates create --company "$COMPANY_ID" \
--name "Factura clásica" --base-preset classic --json
# Template lists paginate by page: one request per call, without --paginate.
factuarea pdf-templates list --company "$COMPANY_ID" --page 1 --per_page 20 --json
# Rename it, with the ETag of the last read as the If-Match precondition.
ETAG=$(factuarea pdf-templates find --company "$COMPANY_ID" "$TEMPLATE_ID" \
--show-etag --json 2>&1 >/dev/null | sed -n 's/^etag: //p')
factuarea pdf-templates update --company "$COMPANY_ID" "$TEMPLATE_ID" \
--name "Factura clásica 2026" --if-match "$ETAG" --json
# Pin that template on an invoice: expected_version is the selection_version
# of get-presentation…
factuarea invoices get-presentation --company "$COMPANY_ID" "$INVOICE_ID" --json
factuarea invoices assign-presentation --company "$COMPANY_ID" "$INVOICE_ID" \
--template-id "$TEMPLATE_ID" --expected-version 1 --json
# …or hand the choice back to the defaults: template_id is required and accepts null.
factuarea invoices assign-presentation --company "$COMPANY_ID" "$INVOICE_ID" \
--null-template-id --expected-version 2 --json
# Exact PDF of the invoice: prepare it from the id of its presentation, render it
# and download it.
factuarea pdf-artifacts prepare --company "$COMPANY_ID" --document-type invoice \
--document-id "$INVOICE_ID" --presentation-id "$PRESENTATION_ID" \
--purpose complete --format a4 --variant official --json
factuarea pdf-artifacts render --company "$COMPANY_ID" "$ARTIFACT_ID" --mode async --json
factuarea pdf-artifacts download --company "$COMPANY_ID" "$ARTIFACT_ID" -o invoice.pdf --show-etagConsulta la biblioteca de plantilles PDF, Presentació de documents i Vistes prèvies i artefactes PDF per al model.
Escriptures condicionals i null explícit
Quan l'spec declara una capçalera condicional en una operació, la seva comanda
rep un flag amb el mateix nom: --if-match a les escriptures que l'accepten
(pdf-templates update, defaults-set i contact-default-set,
pdf-commercial-identities update, series assign-pdf-template i
assign-presentation de cada document) i --if-none-match a les lectures que
poden respondre 304, com les descàrregues de PDF. El valor viatja tal qual,
cometes incloses; un valor buit és un error d'ús (sortida 2).
--show-etag, a les comandes la resposta de les quals porta un ETag, escriu
etag: <valor> a stderr i deixa stdout intacte, així que el pots capturar
al costat de --json, com a l'exemple anterior. El CLI mai omple un ETag ni
una versió per tu:
| Envies | Quan ja no es compleix |
|---|---|
--if-match amb un ETag antic | 412 |
--expected-version amb una versió antiga | 409 |
| Cap de les dues, en una escriptura que exigeix precondició | 428 |
Consulta Concurrència per als codis d'error i com recuperar-te'n.
Null explícit. El cos distingeix un camp omès de null, d'un valor buit, de
0 i de false. Un flag de camp que no passes no s'envia, i un valor que passes
viatja tal qual, fins i tot --description "". Per enviar null, fes servir
--null-<camp>, que només existeix als camps que admeten null, o escriu null a
-d/--data-file. Passar --<camp> i --null-<camp> alhora és un error d'ús.
# Clear the description (null). --name is not passed, so the name is kept.
factuarea pdf-templates update --company "$COMPANY_ID" "$TEMPLATE_ID" \
--null-description --if-match "$ETAG" --jsonUn camp obligatori que admet null, com template_id d'assign-presentation, se
satisfà amb el seu flag --null-<camp> (--null-template-id).
Descàrregues binàries i pujades
Els endpoints de PDF, ZIP i XML transmeten un binari que deses amb -o. Les
pujades multipart prenen el fitxer amb un flag --file-<camp>:
# Descarregar un PDF
factuarea invoices pdf <uuid> -o invoice.pdf
# Pujar un certificat (multipart)
factuarea verifactu certificates upload \
-d '{"certificate_password":"…"}' --file-certificate_file cert.p12
# Importar comptes gestionats en bloc (multipart). Cada fitxer va amb --file-<camp>:
# `accounts_file` és obligatori, `customers_file` opcional. Les opcions viatgen a -d
# com un objecte JSON pla les claus del qual són els noms de camp del formulari: només
# s'accepten `options[send_email]`, `options[apply_customers_to_own_company]` i
# `options[confirm_plan_changes]` (booleanes, `false` per defecte).
factuarea managed-accounts imports template -o plantilla.csv
factuarea managed-accounts imports preview \
--file-accounts_file comptes.csv --file-customers_file clients.csv # no escriu
factuarea managed-accounts imports create \
--file-accounts_file comptes.csv --file-customers_file clients.csv \
-d '{"options[send_email]":true}' --confirm create # irreversibleQuan un PDF no està llest o no ha canviat
Una comanda binària escriu els bytes exactes a -o, o a stdout quan stdout no és
un terminal. Les altres respostes d'una descàrrega de PDF mai deixen un fitxer a
mitges:
| Estat | Què fa el CLI |
|---|---|
200 | Escriu els bytes. |
202 | El PDF del document (invoices pdf, quotes pdf, proformas pdf, delivery-notes pdf) encara s'està generant. Imprimeix el JSON d'estat a stdout i retry-after: <segons> a stderr, no crea cap fitxer i surt amb 0. Torna a llançar la mateixa comanda passat aquest temps. |
304 | Has passat --if-none-match amb l'ETag vigent. Surt amb 0 sense res a stdout i deixa el teu fitxer com estava. |
503 | pdf-artifacts download d'un artefacte que encara no està llest (pdf_artifact_not_ready). El CLI el reintenta, esperant el que indica Retry-After; si continua sense estar llest, l'error a stderr inclou el valor de Retry-After. |
# Keep the ETag of the copy you download…
factuarea invoices pdf --company "$COMPANY_ID" "$INVOICE_ID" -o invoice.pdf --show-etag
# …and download it again only if it changed: a 304 leaves invoice.pdf untouched.
factuarea invoices pdf --company "$COMPANY_ID" "$INVOICE_ID" -o invoice.pdf \
--if-none-match "$PDF_ETAG"Un codi de sortida 0 per si sol no demostra que s'hagi escrit un fitxer: cerca
la línia retry-after: a stderr, o el mateix fitxer. Consulta
Com responen les descàrregues.
L'escape hatch api
Qualsevol endpoint és accessible directament amb factuarea api <mètode> <ruta>,
fins i tot els que encara no tenen una comanda dedicada:
factuarea api get /v1/me --json
factuarea api post /v1/companies/acme_co/invoices -d '{…}'El manifest de comandes
factuarea commands --json aboca el manifest complet de comandes en una sola
crida — path, args, flags, si cadascuna muta, si és binària o paginada, el seu
scope requerit, si és irreversible, i un exemple. Un agent descobreix tota la
superfície en una sola crida:
factuarea commands --jsonConsulta Agents i scripting per als camps del manifest i el contracte JSON.
Referència de l'API incrustada
Una referència ràpida de l'API viatja amb el binari — les cerques no surten de la teva màquina:
factuarea docs search invoicedocs search consulta l'especificació OpenAPI incrustada al binari i respon
a «quina comanda crido?». Retorna operacions — comanda, resum, mètode i ruta —
i no toca mai la xarxa.
Cercar a la documentació publicada
docs list, docs grep i docs get consulten la documentació publicada
—el corpus llms-full de docs.factuarea.com— i
responen a «què diu la documentació sobre això?». Retornen pàgines i seccions,
de les guies, la referència de l'API i el catàleg d'errors:
factuarea docs list # totes les pàgines: <ruta> — <títol>
factuarea docs list /guides # només les que pengen d'aquest prefix
factuarea docs grep "idempotency-key" # seccions de documentació que coincideixen
factuarea docs get /guides/idempotency # la pàgina sencera, en MarkdownEl corpus es descarrega sencer i una sola vegada, es desa al directori de
memòria cau del sistema (~/Library/Caches/factuarea/docs/ a macOS,
~/.cache/factuarea/docs/ a Linux) i es filtra en local. Mentre la còpia tingui
menys de 15 minuts, no hi ha cap petició de xarxa, així que una sessió que
encadeni list, grep i get descarrega una vegada.
El teu terme de cerca no surt mai de la màquina. La URL que es demana és
fixa i no depèn del que teclegis — no hi ha cap servidor de cerca a l'altre
costat. Cap de les quatre subcomandes de docs llegeix ni envia una API key.
| Opció | Què fa |
|---|---|
--refresh | Torna a descarregar, ignorant una còpia encara vigent |
--lang | Idioma de les guies: en, es o ca (per defecte en, l'idioma font). La referència de l'API no es tradueix i surt sempre |
--json | Sortida estable per stdout: path/title a list, path/title/section/snippet a grep, path/title/markdown a get |
Si la descàrrega falla i hi ha una còpia a la memòria cau —encara que hagi
caducat—, es fa servir aquesta còpia, l'avís va a stderr perquè el JSON de
stdout continuï essent parsejable, i l'exit code és 0. Sense cap còpia, l'exit
code és 10 (xarxa). Apunta FACTUAREA_DOCS_URL a un altre origen per
descarregar el corpus des d'allà.
Alternativa mitjançant REST
El catàleg de comandes del CLI prové del seu spec integrat. A la referència de setembre de 2026 està disponible la versió v0.2.0 i el spec de la branca principal conté 414 entrades; falten 38 endpoints REST a les comandes generades. Consulta factuarea commands --json per a la versió instal·lada. Fes servir la comanda HTTP genèrica per a un endpoint REST disponible que falti en aquest catàleg:
factuarea api get /v1/companies/acme_co/stores