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.

Cerință: Cont activ pe AnalizaFiscala.ro cu abonament Complet (lunar sau anual). Puteți crea un cont și activa trial-ul gratuit de 15 zile aici.

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.

HeaderValoareObligatoriu
X-EmailAdresa de email a contuluiDa
Content-Typeapplication/xml sau text/xmlDa

Verificare SAF-T

POST https://analizafiscala.ro/api/public/verify-saft

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âmpTipDescriere
statusstringÎntotdeauna "ok"
importIdnumberID-ul importului creat — folosiți-l pentru referință
links.rezultatstringURL direct către pagina de verificări din aplicație (necesită autentificare)
links.raportAuditstringURL semnat pentru descărcarea PDF-ului de audit (valid 24h, fără autentificare)
sumar.totalnumberNumărul total de verificări efectuate
sumar.erorinumberVerificări cu status „eroare"
sumar.avertismentenumberVerificări cu status „avertisment"
sumar.oknumberVerifică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."
}
GET https://analizafiscala.ro/api/public/verify-saft/{id}/pdf?token=...

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.

Atenție: Link-ul PDF este temporar (24h). Dacă aveți nevoie de acces permanent, salvați PDF-ul local sau accesați rezultatele prin interfața web cu contul dvs.

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:

EndpointDescriere
GET /api/v1/importsLista importurilor SAF-T
GET /api/v1/imports/:idDetalii import
GET /api/v1/imports/:id/verificariRezultatele verificărilor
GET /api/v1/imports/:id/balantaBalanța de verificare
POST /api/v1/upload/saftUpload SAF-T (multipart)
POST /api/v1/upload/d394Upload D394/D390
GET /api/v1/firmeLista firmelor gestionate

Autentificare cu X-Api-Key: cheia_dvs. Cheia o găsiți în Contul meu → API.

Limite și restricții

ParametruValoare
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șier100 MB
Validitate link PDF24 ore
Format acceptatXML (SAF-T conform D.406)
Abonament necesarComplet (lunar sau anual)
Întrebări? Contactați-ne la contact@analizafiscala.ro sau deschideți un ticket din aplicație.