← Înapoi la Billbook

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ției
  • amount (number, obligatoriu) — trebuie să fie pozitiv
  • type (string, opțional, implicit expense) — unul dintre expense / income / prepaid_expense / pending_income
  • category (string, opțional) — numele categoriei
  • note (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 nepotrivit
  • 402 — abonament expirat; reînnoirea este necesară pentru a scrie
  • 405 — metodă nesuportată (de ex. GET pe /api/ingest)
  • 501 — serverului îi lipsește SUPABASE_SERVICE_ROLE_KEY
  • 500 — 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_id este întotdeauna proprietarul tokenului; nu poate fi falsificat
  • org_id este î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.