oneapi
Autentificare
Financiar v1 / Validare

Validare EORI

Verifică un număr EORI — identificatorul vamal folosit la declaraţii cu ţări terţe — prin serviciul
Comisiei Europene.

Nu are legătură cu operaţiunile intracomunitare: acolo se foloseşte codul de TVA, verificat prin
VIES. Confuzia e uşoară şi costisitoare.

Nu există listă locală de numere EORI şi nu se poate deduce din CUI: numărul se obţine printr-o
înregistrare separată la vamă, pe care o face doar cine declară vamal. Deci fiecare verificare
necunoscută e un apel extern, protejat de limită de ritm şi întrerupător.

POST
https://oneapi.ro/api/financiar/v1/validare/eori

Corpul cererii

Se trimite ca JSON, în corpul cererii (Content-Type: application/json) — nu în şirul de interogare.

NumeTipDescriereValori acceptate
eoriobligatoriu string Obligatoriu, în corpul cererii. Spaţiile, punctele şi cratimele se ignoră. max 20 car.
Cod EORI românesc Corpul cererii
{
    "eori": "RO14399840"
}
Scris cu spaţiu după prefix Corpul cererii
{
    "eori": "RO 14399840"
}
Cod EORI german Corpul cererii
{
    "eori": "DE123456789012345"
}
Prefix de ţară inexistent Corpul cererii
{
    "eori": "XX1"
}

Parametri de interogare

Ruta nu acceptă parametri de interogare.

Cum se comportă

  • Verifică un număr EORI prin serviciul Comisiei Europene (DDS2/EOS).
  • EORI e identificator VAMAL, pentru declaraţii cu ţări terţe — nu are legătură cu operaţiunile intracomunitare. Acolo se foloseşte codul de TVA, verificat prin VIES. Confuzia e uşoară şi costisitoare: cineva care caută „validare partener european" ajunge aici şi verifică lucrul greşit.
  • Nu există listă locală şi nu se poate deduce din CUI. Numărul se obţine printr-o înregistrare separată la vamă, făcută doar de cine declară vamal — majoritatea firmelor nu o fac niciodată. Deci un CUI valid, activ şi plătitor de TVA nu spune nimic despre existenţa unui EORI. Fiecare verificare necunoscută e un apel extern.
  • Structura pentru România are trei forme, după titular (Norme OPANAF 1886): persoană juridică cu sediul în România → RO + CUI; persoană fizică stabilită în România → RO + CNP; operator cu sediul într-un stat terţ → RO + codul ISO al statului + numărul din acel stat. Partea naţională poate fi alfanumerică, până la 15 caractere.
  • De aceea metoda e POST: un EORI de persoană fizică ESTE un CNP cu prefix, deci numărul poate fi o dată personală şi nu are ce căuta în query-string.
  • Trei stări, nu două. valid şi invalid vin de la Comisie; serviciu_indisponibil înseamnă că nu am primit un verdict, iar valid e null, nu false. Tratarea unei pene ca „număr invalid" ar face un client să refuze un partener perfect legitim.
  • O pană a Comisiei nu e o eroare a rutei. Răspunsul rămâne HTTP 200, cu stare: serviciu_indisponibil şi motiv spune de ce: timeout, conexiune, http_<cod>, raspuns_neinteligibil (un 200 fără verdict — de obicei pagina de mentenanţă), circuit_deschis (după eşecuri repetate nu mai sunăm un timp; meta.reia_dupa_s spune cât). O pană nu intră niciodată în cache, iar un 200 al Comisiei fără plic SOAP nu e citit ca verdict.
  • Denumirea şi adresa se publică numai dacă operatorul economic şi-a dat consimţământul. Un EORI valid fără denumire e normal, nu un răspuns incomplet — răspunsul o spune explicit.
  • provenienta arată dacă răspunsul a venit din cache, din verificarea locală de structură sau de la Comisie.

La ce folosește

  • Verificarea unui partener înainte de a completa o declaraţie vamală.
  • Confirmarea propriului număr EORI.

Structura răspunsului

CâmpTipDescriere
data.eori string
data.valid boolean true/false de la Comisie, sau null când serviciul nu a dat un verdict.
data.stare string valid, invalid, structura_invalida, serviciu_indisponibil.
data.detaliu string
data.denumire null Denumirea operatorului, dacă a consimţit publicarea. Altfel null.
data.adresa null Adresa, în forma publicată de sursă.
data.motiv null De ce n-a existat verdict, doar la serviciu_indisponibil: timeout, conexiune, http_<cod>, raspuns_neinteligibil, circuit_deschis. Altfel null.
data.provenienta string cache, local, extern sau circuit (fără apel: întrerupătorul e deschis).
meta.sursa string Sursa oficială din care vin datele, cu licenţa ei acolo unde e cerută.
meta.temei string Temeiul legal al valorilor sau al modului de calcul.
meta.provenienta string
meta.atentie_denumire string
meta.nota_intracomunitar string Precizare despre cum se citeşte răspunsul: o capcană, o convenţie sau o limită a sursei.

Exemple de răspuns

body: {"eori": "RO14399840"}

POSThttps://oneapi.ro/api/financiar/v1/validare/eori
{
    "data": {
        "eori": "RO14399840",
        "valid": true,
        "stare": "valid",
        "detaliu": "Valid",
        "denumire": null,
        "adresa": null,
        "motiv": null,
        "provenienta": "extern"
    },
    "meta": {
        "sursa": "Comisia Europeană — serviciul de validare EORI (DDS2/EOS).",
        "temei": "Numărul EORI e atribuit de autoritatea vamală; pentru România, de Direcţia Generală a Vămilor din ANAF.",
        "provenienta": "Apel la serviciul Comisiei.",
        "atentie_denumire": "Numărul e valid, dar denumirea şi adresa lipsesc: se publică numai dacă operatorul economic şi-a dat consimţământul. Absenţa lor nu e un răspuns incomplet.",
        "nota_intracomunitar": "EORI e identificator VAMAL, pentru operaţiuni cu ţări terţe. Pentru valabilitatea unui cod de TVA în operaţiuni intracomunitare, verificarea se face la VIES."
    }
}

Coduri de eroare

CodSlugCând apare
401neautentificatToken lipsă, invalid, expirat sau revocat.
403feature_indisponibilPlanul curent nu include funcţia de care ţine ruta.
422validareLipseşte eori sau are o lungime imposibilă. Un număr prezent dar malformat întoarce 200 cu stare: "structura_invalida".
429limita_taAi depăşit ritmul tău de verificări externe; capacitate_serviciu — serviciul e la capacitate, nu e o limită a contului. Ambele cu Retry-After.

Toate erorile au aceeași formă. eroare.cod e stabil și e cel după care trebuie să ramifici în cod — nu după textul din mesaj, care se poate schimba.

{
    "eroare": {
        "cod": "validare",
        "mesaj": "Lipseşte eori sau are o lungime imposibilă. Un număr prezent dar malformat întoarce 200 cu stare: \"structura_invalida\"."
    }
}