Autentifică-te în aplicație
Cu contul firmei tale, pe efactura.docuhelp.ro.
Ghid de integrare pentru sisteme externe — WordPress/WooCommerce, OpenCart, ERP-uri proprii. Caută sau creează clienți, creează proforme și facturi cu TVA calculat automat, transformă o proformă în factură, descarcă PDF-ul și trimite-l opțional în SPV.
Format JSON · URL de bază https://efactura.docuhelp.ro/api/v2/ · Autentificare cu cheie API
API v2 e separat de API v1
API v1 (/api/v1/invoice/add) e deja folosit de alte integrări și rămâne neschimbat — cele două nu se afectează reciproc și pot fi folosite în paralel. Pentru integrarea de bază, cu chei de acces și jurnal de trafic, vezi pagina API și integrări.
Fiecare cerere către /api/v2/ trebuie să conțină Authorization: Bearer <cheia_dvs_api>.
Cu contul firmei tale, pe efactura.docuhelp.ro.
Introdu o denumire pentru cheie (ex: „Magazin WordPress”) și apasă Generează cheie nouă.
Cheia completă e afișată o singură dată, imediat după generare. Serverul reține doar un hash SHA-256, nu valoarea în clar — dacă ai pierdut-o, generezi una nouă și o revoci pe cea veche.
Fiecare cheie are un buton Revocă. Revocarea e imediată și ireversibilă: orice integrare care mai folosește acea cheie primește 403 Forbidden de la următoarea cerere.
| Aspect | Detalii |
|---|---|
| Format | Request și response: JSON (Content-Type: application/json), excepție /pdf (răspuns application/pdf). |
| URL de bază | https://efactura.docuhelp.ro/api/v2/ |
| ID-uri | Toate ID-urile (client, proformă, factură) sunt șiruri scurte (ex: a1B2c3D4e5F6), nu numere — folosite exact cum sunt returnate. |
| Sume | Prețurile din linii sunt fără TVA (nete). TVA-ul și totalul se calculează automat pe server. Orice total trimis de client e ignorat. |
| Date | Format YYYY-MM-DD (ex: 2026-08-13). |
| Valute | RON, EUR, USD, HUF. |
| Cod HTTP | Semnificație |
|---|---|
| 400 | Corp cerere JSON invalid/lipsă. |
| 401 | Lipsește header-ul Authorization. |
| 403 | Cheie API invalidă, revocată sau expirată. |
| 404 | Resursa (client/proformă/factură) nu există sau nu aparține firmei cheii folosite. |
| 409 | Conflict — ex: număr de factură/proformă deja folosit (cerere concurentă); proformă deja convertită. |
| 422 | Date invalide (câmp obligatoriu lipsă, valoare greșită). |
| 500 | Eroare internă server. |
Corpul răspunsului de eroare are mereu forma: {"error": "mesaj explicativ"}.
Verifică dacă cheia API e validă.
Seriile de facturare configurate pentru firmă, pentru a alege una la creare (sau lași serverul să aleagă prima serie configurată).
Următorul număr disponibil pentru o serie (informativ — numărul real se alocă automat, atomic, la creare).
Caută clienți după nume sau CIF. Se poate folosi și ?cif=.
Creează un client nou, sau — dacă există deja un client cu același CIF la firma ta — returnează clientul existent (fără duplicat). Singurul câmp obligatoriu pentru un client nou e name.
Dacă ai deja client.id dintr-un apel anterior, îl poți trimite direct: {"client":{"id":"kL9mN2pQ7rS1"}}.
Creează o proformă nouă.
Datele proformei, respectiv PDF-ul ei (generat la prima cerere, apoi servit din cache).
Transformă o proformă existentă în factură (de exemplu după confirmarea plății comenzii). O proformă poate fi convertită o singură dată.
Corpul cererii e opțional ({} e valid); câmpuri acceptate: date, series, payby, send_spv.
Creează direct o factură (fără să treacă prin proformă).
Starea curentă a facturii, inclusiv statusul real al trimiterii în SPV, respectiv PDF-ul ei.
| Câmp | Tip | Oblig. | Descriere |
|---|---|---|---|
name | text | da | Denumire produs/serviciu. |
description | text | nu | Descriere suplimentară (linia a 2-a pe factură). |
unit | text | nu | Unitate de măsură, cod UN/CEFACT (implicit H87 = bucată, dacă lipsește). |
qty | număr | da | Cantitate. Poate fi negativă (linie de corecție/storno). |
price | număr | da | Preț unitar fără TVA. |
vat_rate | număr | nu | Cotă TVA în procente. Ignorată dacă firma nu e plătitoare de TVA. |
vat_category | text | nu | S, Z, E, AE, K, G sau O. Dacă lipsește, se deduce din vat_rate. |
| Câmp | Descriere |
|---|---|
id | ID-ul unui client existent. Dacă e trimis, celelalte câmpuri sunt ignorate. |
name | Singurul câmp obligatoriu pentru un client nou. |
cif | CIF/CUI firmă, fără prefixul RO. Lipsa lui înseamnă persoană fizică. |
cnp | CNP persoană fizică, 13 cifre — opțional. |
address, city, subdivision | Recomandate dacă factura va fi trimisă în SPV. |
currency | Valuta implicită a clientului, implicit RON. |
Un cif care există deja la clienții firmei tale reutilizează clientul existent — nu creează duplicate.
"send_spv": true, restul e asincron.Răspunsul 201 ajunge imediat, cu spv.sent = false. Rezultatul real (acceptat/respins de ANAF) apare câteva secunde mai târziu, la un apel ulterior GET. Verifică statusul după 5–15 secunde — webhook-uri nu sunt disponibile încă, se folosește polling.
Necesită ca firma să aibă deja conectat contul ANAF (OAuth) din interfața web. Fără conectare, trimiterea eșuează silențios — factura în sine nu e afectată.
true dacă există o încercare de trimitere înregistrată.true dacă ANAF a acceptat factura.1. Caută clientul după CIF: GET /clients?cif=...
2. Dacă nu există, creează-l: POST /clients
3. Creează factura direct: POST /invoices, cu "send_spv": true dacă vrei trimitere automată
4. Descarci PDF-ul din pdf_url și îl atașezi la emailul de confirmare.
5. (opțional) După câteva secunde, verifici statusul SPV: GET /invoices/{id}.
1. La plasarea comenzii: POST /proformas.
2. Trimiți clientului PDF-ul proformei (pdf_url) ca instrucțiuni de plată.
3. La confirmarea plății (manual sau prin webhook propriu): POST /proformas/{id}/convert — proforma devine factură, fără să retastezi nimic.
Adu-ne un exemplu de comandă din sistemul tău — ne uităm împreună la ce trimiți și cât de aproape ești de un apel funcțional.
Fără obligații · Răspundem în aceeași zi lucrătoare