API Verificare SAF-T
Integrați verificarea automată SAF-T direct în softul dvs. de contabilitate. Trimiteți un fișier XML și primiți în secunde rezultatul analizei + link către raportul PDF de audit.
Autentificare
API-ul se autentifică prin adresa de email a contului dvs., transmisă în headerul X-Email.
Nu este necesară cheie API — serverul verifică automat dacă email-ul are un abonament activ.
| Header | Valoare | Obligatoriu |
|---|---|---|
X-Email | Adresa de email a contului | Da |
Content-Type | application/xml sau text/xml | Da |
Verificare SAF-T
Headers
X-Email: adresa@email.ro Content-Type: application/xml
Body
Conținutul complet al fișierului SAF-T XML (raw body, nu multipart/form-data).
Date firmă (ANAF + ONRC)
Returnează datele publice combinate ale unei firme românești — status fiscal de la ANAF și date de la Registrul Comerțului (ONRC) — printr-o singură interogare după CUI. Ideal pentru verificarea partenerilor direct din softul dvs.
Headers
X-Api-Key: cheia_dvs_api
Parametru
| Parametru | Descriere |
|---|---|
cui (în cale) | CUI-ul firmei, cu sau fără prefixul RO (ex. 9378841 sau RO9378841) |
200 — Date firmă
Răspunsul conține trei blocuri: anaf (status fiscal), onrc (Registrul Comerțului) și financiar (indicatori din bilanțurile publice, când există).
{
"cui": "9378841",
"interogat_la": "2026-07-14",
"anaf": {
"denumire": "MEDIALOGIC SRL",
"adresa": "MUNICIPIUL BUCUREŞTI, SECTOR 4, ...",
"nr_reg_com": "J1997002988401",
"cod_caen": "5829",
"forma_juridica": "SOCIETATE CU RĂSPUNDERE LIMITATĂ",
"platitor_tva": true,
"tva": "DA — din 2019-09-01",
"tva_la_incasare": "NU — Niciodată",
"split_tva": false,
"inactiv": false,
"stare_inactivitate": "NU",
"ro_e_factura": false
},
"onrc": {
"stare_oficiala": "funcţiune",
"activa": true,
"stare_negativa": false,
"nr_inmatriculare": "J1997002988401",
"data_inmatriculare": "18/04/1997",
"adresa": "Str. ..., Sector 1, Bucureşti",
"reprezentanti": [
{ "nume": "ROŞCA LUCIAN", "calitate": "administrator", "domiciliu": "..." }
],
"caen_autorizat": [ { "cod": "5829", "denumire": "Activităţi de editare ..." } ],
"sucursale": [],
"mutari_sediu_intre_judete": 0
},
"financiar": {
"pe_ani": [ { "an": 2024, "cifraAfaceri": ..., "profitNet": ... } ],
"risc": { "scor": ... },
"altman_z": { "scor": ... }
}
}
Blocurile anaf, onrc sau financiar pot fi null dacă sursa respectivă nu are date pentru firma cerută (ex. firmă nou-înființată fără bilanț depus).
404 — Firmă negăsită
{ "error": "Firma cu CUI 12345678 nu a fost găsită la ANAF sau ONRC." }
429 — Prea multe interogări
Limita este de o interogare la 2 secunde per cheie.
{ "error": "Prea multe interogări. Maxim o interogare la 2 secunde." }
Exemplu cURL
curl -H "X-Api-Key: cheia_dvs_api" \
https://analizafiscala.ro/api/v1/firma/9378841
Răspunsuri posibile
200 — Verificare completă
Fișierul a fost procesat cu succes. Primiți sumarul + link-uri.
{
"status": "ok",
"importId": 48,
"links": {
"rezultat": "https://analizafiscala.ro/import/48/verificari",
"raportAudit": "https://analizafiscala.ro/api/public/verify-saft/48/pdf?token=..."
},
"sumar": {
"companie": "EXEMPLU SRL",
"cui": "RO12345678",
"perioada": "1/2025 - 3/2025",
"total": 120,
"erori": 5,
"avertismente": 12,
"ok": 103
}
}
| Câmp | Tip | Descriere |
|---|---|---|
status | string | Întotdeauna "ok" |
importId | number | ID-ul importului creat — folosiți-l pentru referință |
links.rezultat | string | URL direct către pagina de verificări din aplicație (necesită autentificare) |
links.raportAudit | string | URL semnat pentru descărcarea PDF-ului de audit (valid 24h, fără autentificare) |
sumar.total | number | Numărul total de verificări efectuate |
sumar.erori | number | Verificări cu status „eroare" |
sumar.avertismente | number | Verificări cu status „avertisment" |
sumar.ok | number | Verificări trecute cu succes |
202 — Import în lucru
Există deja un import în curs de procesare. Așteptați finalizarea.
{
"status": "in_lucru",
"importId": 47
}
403 — Abonament expirat
Contul nu are un abonament Complet activ.
{
"status": "abonament_expirat"
}
404 — Cont inexistent
Adresa de email nu corespunde niciunui cont activ.
{
"status": "cont_inexistent"
}
400 — Eroare validare
Body XML lipsă sau header X-Email absent.
{
"status": "eroare",
"message": "Headerul X-Email este obligatoriu."
}
Descărcare raport PDF
Link-ul din links.raportAudit este semnat criptografic și nu necesită autentificare.
Este valid 24 de ore de la generare. Returnează un PDF descărcabil.
Exemple complete
cURL
# Trimitere fișier SAF-T pentru verificare
curl -X POST https://analizafiscala.ro/api/public/verify-saft \
-H "X-Email: contabil@firma.ro" \
-H "Content-Type: application/xml" \
--data-binary @fisier-saft.xml
cURL — descărcare PDF
# Descărcați raportul PDF (link din răspunsul anterior)
curl -o raport-audit.pdf \
"https://analizafiscala.ro/api/public/verify-saft/48/pdf?token=..."
PowerShell
# Citire fișier și trimitere $xml = Get-Content -Path "SAF-T_2025.xml" -Raw -Encoding UTF8 $headers = @{ "X-Email" = "contabil@firma.ro" "Content-Type" = "application/xml" } $body = [System.Text.Encoding]::UTF8.GetBytes($xml) $result = Invoke-RestMethod -Uri "https://analizafiscala.ro/api/public/verify-saft" ` -Method POST -Headers $headers -Body $body $result | ConvertTo-Json -Depth 5 # Descărcați PDF-ul Invoke-WebRequest -Uri $result.links.raportAudit -OutFile "raport-audit.pdf"
Python
# pip install requests import requests with open("SAF-T_2025.xml", "rb") as f: xml_data = f.read() response = requests.post( "https://analizafiscala.ro/api/public/verify-saft", headers={ "X-Email": "contabil@firma.ro", "Content-Type": "application/xml", }, data=xml_data, ) result = response.json() print(result) # Descărcați PDF-ul if result["status"] == "ok": pdf = requests.get(result["links"]["raportAudit"]) with open("raport-audit.pdf", "wb") as f: f.write(pdf.content) print("PDF salvat!")
Node.js
// Node.js 18+ (fetch nativ) const fs = require("fs"); const xml = fs.readFileSync("SAF-T_2025.xml"); const res = await fetch("https://analizafiscala.ro/api/public/verify-saft", { method: "POST", headers: { "X-Email": "contabil@firma.ro", "Content-Type": "application/xml", }, body: xml, }); const result = await res.json(); console.log(result); // Descărcați PDF-ul if (result.status === "ok") { const pdf = await fetch(result.links.raportAudit); const buf = Buffer.from(await pdf.arrayBuffer()); fs.writeFileSync("raport-audit.pdf", buf); console.log("PDF salvat!"); }
C# (.NET)
using var client = new HttpClient();
var xml = File.ReadAllBytes("SAF-T_2025.xml");
var request = new HttpRequestMessage(HttpMethod.Post,
"https://analizafiscala.ro/api/public/verify-saft");
request.Headers.Add("X-Email", "contabil@firma.ro");
request.Content = new ByteArrayContent(xml);
request.Content.Headers.ContentType =
new System.Net.Http.Headers.MediaTypeHeaderValue("application/xml");
var response = await client.SendAsync(request);
var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);
API cu cheie (avansat)
Pentru integrări avansate, puteți folosi și API-ul cu cheie API (disponibil în contul dvs., secțiunea Integrare API). Acesta oferă acces la toate endpointurile:
| Endpoint | Descriere |
|---|---|
GET /api/v1/imports | Lista importurilor SAF-T |
GET /api/v1/imports/:id | Detalii import |
GET /api/v1/imports/:id/verificari | Rezultatele verificărilor |
GET /api/v1/imports/:id/balanta | Balanța de verificare |
POST /api/v1/upload/saft | Upload SAF-T (multipart) |
POST /api/v1/upload/d394 | Upload D394/D390 |
GET /api/v1/firme | Lista firmelor gestionate |
GET /api/v1/firma/:cui | Date publice firmă (ANAF + ONRC) — orice plan, inclusiv free |
Autentificare cu X-Api-Key: cheia_dvs. Cheia o găsiți în Contul meu → API.
Limite și restricții
| Parametru | Valoare |
|---|---|
| Rate limit (verify-saft) | 10 request-uri / minut per IP |
| Rate limit (API v1 cu cheie) | 60 request-uri / minut per cheie |
| Rate limit (GET /firma/:cui) | 1 request / 2 secunde per cheie |
| Dimensiune maximă fișier | 100 MB |
| Validitate link PDF | 24 ore |
| Format acceptat | XML (SAF-T conform D.406) |
| Abonament necesar | Complet (lunar sau anual) |