API de Contabilitate la Distanță
Ultima actualizare: 10 mai 2026
Înregistrează intrări din cURL, Scurtături iOS sau scripturi de automatizare folosind un token API personal. Tokenul este doar pentru scriere — poate insera tranzacții și citi listele de categorii / etichete, dar nu poate citi sau șterge date despre tranzacții.
1. Obține un token
Autentifică-te ca admin, deschide Setări → 🔑 API de Contabilitate la Distanță și apasă pe „Generează token".
Tokenul în text simplu este afișat o singură dată — copiază-l imediat. Serverul stochează doar hash-ul SHA-256, deci un token pierdut poate fi înlocuit doar prin rotire (care îl invalidează pe cel vechi).
Format token: bb_<userId>_<secret>. Trimite-l la fiecare cerere ca Authorization: Bearer <token>.
2. POST /api/ingest — inserează o tranzacție
Corpul cererii este un obiect JSON cu aceste câmpuri:
title(string, obligatoriu) — numele tranzacțieiamount(number, obligatoriu) — trebuie să fie pozitivtype(string, opțional, implicitexpense) — unul dintreexpense/income/prepaid_expense/pending_incomecategory(string, opțional) — numele categorieinote(string, opțional) — notă liberăcreated_at(string, opțional) — ISO 8601; implicit acum
curl -X POST https://billbook.me/api/ingest \
-H "Authorization: Bearer bb_<userId>_<secret>" \
-H "Content-Type: application/json" \
-d '{"title":"Coffee","amount":120,"type":"expense","category":"Food"}'
# response: 201
{ "id": "...", "created_at": "..." }3. GET /api/ingest/categories — listează categoriile
Returnează numele categoriilor adminului în ordinea din meniul derulant al panoului. Răspunsul conține doar numele — fără ids, user ids sau date despre tranzacții.
curl https://billbook.me/api/ingest/categories \
-H "Authorization: Bearer bb_<userId>_<secret>"
# response: 200
{ "categories": ["Food", "Rent", "..."] }4. GET /api/ingest/tags — etichete folosite recent
Returnează prefixele de etichetă cel mai recent actualizate (marcajele #XXX încorporate în titluri). Implicit 20; folosește ?limit= pentru a modifica (max. 100).
Returnează un array gol în loc de o eroare dacă tabelul tag_prefixes încă nu există.
curl "https://billbook.me/api/ingest/tags?limit=20" \
-H "Authorization: Bearer bb_<userId>_<secret>"
# response: 200
{ "tags": ["#management-fee", "#travel", "..."] }5. Coduri de eroare
Toate erorile sunt JSON: { "error": "mesaj" }.
401— autorizare lipsă, token malformat, revocat sau nepotrivit402— abonament expirat; reînnoirea este necesară pentru a scrie405— metodă nesuportată (de ex. GET pe/api/ingest)501— serverului îi lipseșteSUPABASE_SERVICE_ROLE_KEY500— altă eroare internă
6. Securitate și limite
Prin design, tokenul poate scrie doar în propria organizație — nu poate impersona alte orgs și nu poate citi date existente:
user_ideste întotdeauna proprietarul tokenului; nu poate fi falsificatorg_ideste întotdeauna org-ul proprietarului; scrierile între orgs sunt imposibile- Tokenurile se emit doar rolului admin (manager / staff primesc 403)
- Răspunsurile nu dezvăluie niciodată alte rânduri — se returnează doar
{ id, created_at } - Revocarea este imediată; rotește oricând din Setări
7. Exemplu de Scurtătură iOS
Adaugă o acțiune „Obține conținutul unui URL", URL https://billbook.me/api/ingest, metodă POST, anteturi Authorization: Bearer bb_... și Content-Type: application/json, iar corpul cererii ca JSON: {"title":"Cafea","amount":120,"type":"expense"}. Conectează title și amount la intrarea Scurtăturii sau la variabile „Întreabă de fiecare dată".
Acest document este o referință rapidă; codul backend este sursa de adevăr pentru comportamentul real.