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).
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 |
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 |
| 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) |