Fint Developer DocsDocumentație Fint pentru dezvoltatori
Fint APIAPI Fint

WelcomeBun venit

Fint exposes a JSON API that lets developers integrate Romanian financial services into their app: open-banking statements, e-invoicing, company lookups and official exchange rates.

Fint expune un API JSON care permite dezvoltatorilor să integreze servicii financiare românești în aplicația lor: extrase bancare open banking, facturare electronică, căutări de companii și cursuri oficiale de schimb.

Versiunea în limba română este oferită pentru comoditate și este tradusă automat. Versiunea în limba engleză este cea de referință - pentru numele câmpurilor, exemplele de cod și detaliile de integrare îți recomandăm să urmezi documentația în engleză (comută la EN din colțul de sus).

Fint account required. API access requires a pre-registered and active Fint account. If you do not have one yet, sign up and complete onboarding at https://fint.ro/.

Cont Fint necesar. Accesul la API necesită un cont Fint preînregistrat și activ. Dacă nu ai încă unul, înregistrează-te și finalizează onboarding-ul la https://fint.ro/.

Production API. These docs describe the live production API at https://api.fint.ro. To build and test without touching real providers or data, use the Sandbox.

API de producție. Această documentație descrie API-ul live de producție de la https://api.fint.ro. Pentru a dezvolta și testa fără a afecta furnizori sau date reale, folosește Sandbox.

ServicesServicii

Fint exposes multiple independent services, each activated separately on a company license. You can use any service on its own or combine them: for example, use eFactura alone to handle Romanian e-invoicing, pair it with Extrase to reconcile bank transactions against invoices, or use Info CUI and Schimb valutar as utility services in any financial workflow. Each company API key you create specifies exactly which services it is allowed to call.

Fint expune mai multe servicii independente, fiecare activat separat pe licența unei companii. Poți folosi orice serviciu individual sau le poți combina: de exemplu, folosește eFactura singur pentru facturarea electronică românească, asociază-l cu Extrase pentru reconcilierea tranzacțiilor bancare cu facturile, sau folosește Info CUI și Schimb valutar ca servicii utilitare în orice flux financiar. Fiecare cheie API de companie pe care o creezi specifică exact ce servicii are voie să apeleze.

Base URLURL de bază

All API requests are made to the base URL:

Toate cererile API se fac către URL-ul de bază:

https://api.fint.ro

Every request must be authenticated with two API keys. See Authentication to get started, or jump to the Quick Start for your first call. Shared response and error conventions are documented under Conventions.

Fiecare cerere trebuie autentificată cu două chei API. Consultă Autentificare pentru a începe, sau treci la Start rapid pentru primul apel. Convențiile comune pentru răspunsuri și erori sunt documentate la Convenții.

Get startedÎncepe aici

Account modelModel de cont

Fint structures access around three entities: an organization, the companies it owns, and the users who belong to it. Understanding this hierarchy is the foundation for working with API keys and services.

Fint structurează accesul în jurul a trei entități: o organizație, companiile pe care le deține și utilizatorii care aparțin organizației. Înțelegerea acestei ierarhii este baza pentru lucrul cu cheile API și serviciile.

OrganizationOrganizație

An organization is the top-level entity registered on Fint. It is the billing unit and owns everything beneath it: companies, API keys, and team members. Every API request must be authenticated with the organization key (X-Org-Key), which you create under User menu → API → Chei API in the Fint UI.

Organizația este entitatea de nivel superior înregistrată pe Fint. Este unitatea de facturare și deține tot ce se află sub ea: companii, chei API și membri ai echipei. Fiecare cerere API trebuie autentificată cu cheia de organizație (X-Org-Key), pe care o creezi în Meniu utilizator → API → Chei API în interfața Fint.

An organization can own multiple companies, each representing a distinct legal entity or operational scope. This makes Fint suitable not only for businesses integrating their own financial operations, but also for software companies and SaaS platforms that embed Fint as a third-party provider for their clients: each client company can be managed as a separate company under the same organization.

O organizație poate deține mai multe companii, fiecare reprezentând o entitate juridică sau un domeniu operațional distinct. Asta face Fint potrivit nu doar pentru afaceri care își integrează propriile operațiuni financiare, ci și pentru companii de software și platforme SaaS care integrează Fint ca furnizor terț pentru clienții lor: fiecare companie client poate fi gestionată ca o companie separată sub aceeași organizație.

Company (license)Companie (licență)

A company, also called a license, is the operational unit within an organization. Each company typically corresponds to a Romanian legal entity with its own CUI. Companies activate services independently: a company may have Extrase and eFactura enabled while another in the same organization has only Info CUI.

O companie, numită și licență, este unitatea operațională din cadrul unei organizații. Fiecare companie corespunde de obicei unei entități juridice românești cu propriul CUI. Companiile activează serviciile independent: o companie poate avea Extrase și eFactura activate, iar alta din aceeași organizație poate avea doar Info CUI.

Each company holds one or more company-level API keys (X-Api-Key), created under Configurare → Chei API in the Fint UI sidebar for the active company. Every company key is scoped to exactly one company and to a chosen subset of that company's active services. A request made with a company key always acts on that specific company.

Fiecare companie deține una sau mai multe chei API de nivel companie (X-Api-Key), create în Configurare → Chei API din bara laterală Fint, pentru compania activă. Fiecare cheie de companie este limitată la exact o companie și la un subset ales din serviciile active ale companiei. O cerere făcută cu o cheie de companie acționează întotdeauna asupra acelei companii.

Companies, services and company API keys can be managed in the Fint UI or programmatically via the Organization API (Enterprise plan). See Self-service API for what can be done through the UI versus the API.

Companiile, serviciile și cheile API de companie pot fi gestionate în interfața Fint sau programatic prin API-ul Organizație (planul Enterprise). Vezi API self-service pentru ce se poate face prin interfață față de API.

Users and rolesUtilizatori și roluri

Users are team members invited to an organization. Each user has one of two roles:

Utilizatorii sunt membri ai echipei invitați într-o organizație. Fiecare utilizator are unul din două roluri:

  • Admin: full control over the organization, including managing companies, inviting and removing users, creating and deleting API keys, billing, and configuring service consents.
  • Admin: control complet asupra organizației, inclusiv gestionarea companiilor, invitarea și eliminarea utilizatorilor, crearea și ștergerea cheilor API, facturare și configurarea consimțămintelor pentru servicii.
  • User: operational access to the platform with limited administrative capabilities. Admins define which actions a user may perform.
  • User: acces operațional la platformă cu capabilități administrative limitate. Adminii definesc ce acțiuni poate efectua un utilizator.

User roles are managed entirely in the Fint UI and do not affect API key permissions directly. API access is controlled by the key's own service scope, regardless of the role of the person who created the key.

Rolurile utilizatorilor sunt gestionate integral în interfața Fint și nu afectează direct permisiunile cheilor API. Accesul la API este controlat de domeniul de servicii al cheii, indiferent de rolul persoanei care a creat cheia.

How it maps to the APICum se reflectă în API

Every API request carries both keys: X-Org-Key identifies the organization; X-Api-Key identifies the company and enforces its service scope. You never pass a company ID or CUI as an authorization parameter; Fint resolves both from the keys and validates that the company key belongs to the organization key's organization.

Fiecare cerere API poartă ambele chei: X-Org-Key identifică organizația; X-Api-Key identifică compania și aplică domeniul ei de servicii. Nu trimiți niciodată un ID de companie sau CUI ca parametru de autorizare; Fint le rezolvă pe ambele din chei și validează că cheia de companie aparține organizației cheii de organizație.

ConceptConceptAPI representationReprezentare APIWhere to createUnde se creează
OrganizationOrganizațieX-Org-Key headerUser menu → API → Chei APIMeniu utilizator → API → Chei API
CompanyCompanieX-Api-Key headerConfigurare → Chei API
User roleRol utilizatorNot sent in API requestsNu se trimite în cererile APITeam management in the Fint UIGestionarea echipei în interfața Fint

See Authentication for the full list of header requirements and error codes.

Consultă Autentificare pentru lista completă a cerințelor de header și codurilor de eroare.

Get startedÎncepe aici

Quick StartStart rapid

Make your first authenticated request in a few minutes.

Fă prima cerere autentificată în câteva minute.

StepsPași

  1. Make sure you have an active company with the service activated Fint requires at least one active company (license) before the API can be used. A first company is created automatically when you sign up; you can add more from the dashboard billing / subscription page or, on the Enterprise plan, via the Organization API. The company must also have the service you intend to call (eFactura, Extrase, Info CUI, Schimb valutar) activated. See the Account model for the organization → company hierarchy.
  2. Asigură-te că ai o companie activă cu serviciul activat Fint necesită cel puțin o companie activă (licență) înainte de a putea folosi API-ul. O primă companie este creată automat la înregistrare; poți adăuga altele din pagina de facturare / abonament a panoului sau, pe planul Enterprise, prin API-ul Organizație. Compania trebuie să aibă și serviciul pe care vrei să-l apelezi (eFactura, Extrase, Info CUI, Schimb valutar) activat. Vezi Modelul de cont pentru ierarhia organizație → companie.
  3. Get your organization key In the Fint dashboard, open the user menu → API → Chei API and create an organization key. This identifies your organization.
  4. Obține cheia de organizație În panoul Fint, deschide meniul utilizator → API → Chei API și creează o cheie de organizație. Aceasta identifică organizația ta.
  5. Get a company key Switch to the company you want to act on, then go to Configurare → Chei API in the sidebar and create a company key. Choose which services the key may call - each must be active on the company (eFactura, Extrase, Info CUI, Schimb valutar).
  6. Obține o cheie de companie Comută la compania asupra căreia vrei să acționezi, apoi mergi la Configurare → Chei API din bara laterală și creează o cheie de companie. Alege ce servicii poate apela cheia - fiecare trebuie să fie activ pe companie (eFactura, Extrase, Info CUI, Schimb valutar).
  7. Send both keys on every request Pass the org key as X-Org-Key and the company key as X-Api-Key.
  8. Trimite ambele chei la fiecare cerere Trimite cheia de organizație ca X-Org-Key și cheia de companie ca X-Api-Key.

Your first callPrimul apel

Look up a Romanian company by its CUI:

Caută o companie românească după CUI:

bash
curl -sS 'https://api.fint.ro/v1/infocui?cui=12345678' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'X-Api-Key: YOUR_COMPANY_KEY'

A successful response returns the company data envelope:

Un răspuns reușit returnează envelopa cu datele companiei:

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": {
    "cui": "12345678",
    "name": "Exemplu SRL",
    "registrationNumber": "J40/1234/2010",
    "vatRegistered": true
  }
}

Path note. On the API host api.fint.ro, endpoints are reachable at /v1/.... Unauthenticated GET https://api.fint.ro/ lists the available API versions, and GET https://api.fint.ro/v1 lists every endpoint of v1 - see API root and version discovery.

Notă despre cale. Pe hostul API api.fint.ro, endpoint-urile sunt accesibile la /v1/.... GET https://api.fint.ro/ (fără autentificare) listează versiunile API disponibile, iar GET https://api.fint.ro/v1 listează toate endpoint-urile v1 - vezi Rădăcina API și descoperirea versiunilor.

Next: read Authentication for key scoping and error codes, then explore the service references.

Urmează: citește Autentificare pentru domeniul cheilor și codurile de eroare, apoi explorează referințele serviciilor.

Get startedÎncepe aici

AuthenticationAutentificare

Fint uses dual-key authentication: an organization key plus a company key, sent on every request.

Fint folosește autentificare cu două chei: o cheie de organizație plus o cheie de companie, trimise la fiecare cerere.

Required headersHeader-e obligatorii

HeaderHeaderValueValoare
X-Org-KeyOrganization key (identifies your organization)Cheie de organizație (identifică organizația ta)
X-Api-KeyCompany key (selects the company and its allowed services)Cheie de companie (selectează compania și serviciile permise)

Alternatively, the company key may be sent as Authorization: Bearer <company_key>; the org key must still be sent as X-Org-Key.

Alternativ, cheia de companie poate fi trimisă ca Authorization: Bearer <company_key>; cheia de organizație trebuie trimisă tot ca X-Org-Key.

bash
curl -sS 'https://api.fint.ro/v1/extrase/accounts' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'X-Api-Key: YOUR_COMPANY_KEY'

Key scopingDomeniul cheilor

Two key types work together:

Două tipuri de chei lucrează împreună:

  • Organization key: one per organization, created under User menu → API → Chei API. Identifies the organization; it has no per-service scope.
  • Cheie de organizație: una per organizație, creată în Meniu utilizator → API → Chei API. Identifică organizația; nu are domeniu per serviciu.
  • Company key: one per company, created under Configurare → Chei API in the sidebar for the active company. Selects which company the request acts on and which services the key may call.
  • Cheie de companie: una per companie, creată în Configurare → Chei API din bara laterală, pentru compania activă. Selectează compania asupra căreia acționează cererea și serviciile pe care cheia le poate apela.

Company keys carry a services set (efactura, extrase, infocui, schimbvalutar) enforced at runtime. In addition, the company’s license must have the called service activated.

Cheile de companie poartă un set services (efactura, extrase, infocui, schimbvalutar) aplicat la runtime. În plus, licența companiei trebuie să aibă serviciul apelat activat.

No cui for authorization. eFactura, Extrase and Schimb valutar resolve the company from the company key; do not send cui for authorization. The only exception is Info CUI, where cui in the query string is the lookup target, not an auth parameter.

Fără cui pentru autorizare. eFactura, Extrase și Schimb valutar rezolvă compania din cheia de companie; nu trimite cui pentru autorizare. Singura excepție este Info CUI, unde cui din query string este ținta căutării, nu un parametru de autentificare.

Authentication errorsErori de autentificare

All errors use status: "error" with a human-readable msg and a stable reason. Branch on reason.

Toate erorile folosesc status: "error" cu un msg lizibil și un reason stabil. Ramifică pe reason.

HTTPreasonWhenCând
401missing_org_api_keyNo X-Org-Key headerLipsește header-ul X-Org-Key
401missing_api_keyNo company key / Bearer tokenLipsește cheia de companie / token Bearer
401invalid_org_api_keyUnknown or deleted org keyCheie de organizație necunoscută sau ștearsă
401invalid_api_keyUnknown or deleted company keyCheie de companie necunoscută sau ștearsă
403org_api_key_disabledOrg key exists but disabledCheia de organizație există dar este dezactivată
403organization_disabledOrganization is not enabledOrganizația nu este activă
403organization_suspendedOrganization is suspendedOrganizația este suspendată
403api_key_disabledCompany key exists but disabledCheia de companie există dar este dezactivată
403license_disabledLinked license is not enabledLicența asociată nu este activă
403api_key_service_deniedCompany key’s services don’t include the called serviceServiciile cheii de companie nu includ serviciul apelat
403license_service_deniedService not activated on the companyServiciul nu este activat pe companie
403org_mismatchCompany key’s license is not in the org key’s organizationLicența cheii de companie nu aparține organizației cheii de organizație
405method_not_allowedWrong HTTP method for the endpointMetodă HTTP greșită pentru endpoint
429limit_exceededUsage at/over plan limit with extra charges offUtilizare la/peste limita planului, fără taxe suplimentare activate
API referenceReferință API

Extrase

PSD2 open-banking accounts and transactions, already synchronized from connected banks. Reads return stored Fint data only.

Conturi și tranzacții PSD2 open banking, deja sincronizate din băncile conectate. Citirile returnează doar datele stocate în Fint.

Service access. The extrase service must be allowed on your company key and activated on that company’s license. Fint identifies the company from the company key, so you do not send it yourself.

Acces serviciu. Serviciul extrase trebuie permis pe cheia de companie și activat pe licența companiei. Fint identifică compania din cheia de companie, deci nu o trimiți tu.

An Extrase consent is a PSD2 authorization for Fint to read a company’s bank accounts and transactions at a specific bank. It is established when an authorized person completes the bank’s OAuth flow in Fint’s open-banking onboarding. The consent is recorded with status and a validUntil date on your company license, and Fint keeps accounts, balances, and transactions synchronized for you to read. Each connected bank requires its own consent.

Un consimțământ Extrase este o autorizare PSD2 pentru ca Fint să citească conturile bancare și tranzacțiile unei companii la o anumită bancă. Se stabilește când o persoană autorizată finalizează fluxul OAuth al băncii în onboarding-ul open banking Fint. Consimțământul este înregistrat cu status și o dată validUntil pe licența companiei tale, iar Fint menține conturile, soldurile și tranzacțiile sincronizate pentru a fi citite. Fiecare bancă conectată necesită propriul consimțământ.

You can obtain consent in three ways:

Poți obține consimțământul în trei moduri:

  • Fint UI: sign in to Fint, go to Extrase → Conturi, pick a bank, and complete the bank authorization flow.
  • Interfața Fint: autentifică-te în Fint, mergi la Extrase → Conturi, alege o bancă și finalizează fluxul de autorizare bancară.
  • Share link (delegated): from the Fint UI, generate a 7-day onboarding link and send it to someone who can authorize at the bank; they complete the browser flow for your company license.
  • Link de partajare (delegat): din interfața Fint, generează un link de onboarding valabil 7 zile și trimite-l cuiva care poate autoriza la bancă; acea persoană finalizează fluxul în browser pentru licența companiei tale.
  • API (self-service): call /onboarding to generate a share link, have the authorized person open it in a browser and complete bank authorization, then poll /consents until the target bank shows consentStatus: enabled. See Onboarding & consentOnboarding și consimțământ below.
  • API (self-service): apelează /onboarding pentru a genera un link de partajare, lasă persoana autorizată să-l deschidă în browser și să finalizeze autorizarea bancară, apoi interoghează /consents până când banca țintă afișează consentStatus: enabled. Vezi Onboarding & consentOnboarding și consimțământ mai jos.

The bank authorization step can be completed only by a person who can authenticate with that bank as the PSU (payment service user) for the accounts being connected. Steps vary by bank: OAuth redirect, internet banking app approval, or manual confirmation after PSU ID or IBAN collection where required. Fint does not collect or store internet banking passwords, PINs, or OTP/token codes.

Pasul de autorizare bancară poate fi finalizat doar de o persoană care se poate autentifica la banca respectivă ca PSU (utilizator de servicii de plată) pentru conturile conectate. Pașii variază în funcție de bancă: redirect OAuth, aprobare în aplicația de internet banking sau confirmare manuală după colectarea ID-ului PSU sau IBAN-ului, unde este necesar. Fint nu colectează și nu stochează parole de internet banking, PIN-uri sau coduri OTP/token.

The public API reads stored data only; it does not create consents or call the bank. /accounts returns stored accounts even from disabled consents (see consentStatus and consentValidUntil on each account). /transactions and /transaction/{uid} include data from enabled consents only. Without enabled consents, API calls succeed but return empty transaction data.

API-ul public citește doar date stocate; nu creează consimțăminte și nu apelează banca. /accounts returnează conturi stocate chiar și din consimțăminte dezactivate (vezi consentStatus și consentValidUntil pe fiecare cont). /transactions și /transaction/{uid} includ date doar din consimțăminte activate. Fără consimțăminte activate, apelurile API reușesc dar returnează date de tranzacții goale.

Set up bank consents in Fint before expecting account and transaction data via the API.

Configurează consimțămintele bancare în Fint înainte de a aștepta date de cont și tranzacții prin API.

Onboarding & consentOnboarding și consimțământ

API-only flow for delegated bank authorization: generate a share link with /onboarding, have the authorized person complete the bank’s OAuth flow, then poll /consents until the target bank’s entry shows consentStatus: enabled.

Flux doar prin API pentru autorizare bancară delegată: generează un link de partajare cu /onboarding, lasă persoana autorizată să finalizeze fluxul OAuth al băncii, apoi interoghează /consents până când înregistrarea băncii țintă afișează consentStatus: enabled.

Create onboarding linkCreează link de onboarding

POST/v1/extrase/onboarding

Creates a 7-day share link the end-user opens in a browser to connect a bank account. The link opens Fint’s bank-selection and OAuth consent flow.

Creează un link de partajare valabil 7 zile pe care utilizatorul final îl deschide în browser pentru a conecta un cont bancar. Link-ul deschide fluxul de selecție a băncii și consimțământul OAuth Fint.

Example requestExemplu de cerere

bash
curl -sS -X POST 'https://api.fint.ro/v1/extrase/onboarding' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'X-Api-Key: YOUR_COMPANY_KEY' \
  -H 'Content-Type: application/json' \
  -d '{}'

ResponseRăspuns

json
{
  "status": "success",
  "data": {
    "authLink": "https://app.fint.ro/onboarding/extrase?token=...",
    "expiresOn": "2026-07-04 08:00:00"
  }
}

Response fieldsCâmpuri de răspuns

FieldCâmpDescriptionDescriere
authLinkBrowser link the authorized person opens to select a bank and complete the OAuth consent flow.Link de browser pe care persoana autorizată îl deschide pentru a alege o bancă și a finaliza fluxul de consimțământ OAuth.
expiresOnWhen the link expires (7 days after creation), YYYY-MM-DD HH:MM:SS.Când expiră link-ul (7 zile după creare), YYYY-MM-DD HH:MM:SS.

ErrorsErori

HTTPreasonWhenCând
405method_not_allowedWrong HTTP method (must be POST)Metodă HTTP greșită (trebuie POST)
400invalid_jsonRequest body is not valid JSONCorpul cererii nu este JSON valid
429limit_exceededUsage at/over plan limit for the extrase serviceUtilizare la/peste limita planului pentru serviciul extrase
500token_creation_failedCould not create the onboarding tokenNu s-a putut crea token-ul de onboarding

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

Check consentsVerifică consimțămintele

GET/v1/extrase/consents

Returns all bank consents for the company key’s license - one entry per bank (de-duplicated, latest first). Returns an empty list when no consents exist. This is a GET endpoint and takes no request body.

Returnează toate consimțămintele bancare pentru licența cheii de companie - o intrare per bancă (deduplicat, cel mai recent primul). Returnează o listă goală când nu există consimțăminte. Este un endpoint GET și nu primește corp de cerere.

Example requestExemplu de cerere

bash
curl -sS 'https://api.fint.ro/v1/extrase/consents' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'X-Api-Key: YOUR_COMPANY_KEY'

Response (consents present)Răspuns (consimțăminte prezente)

json
{
  "status": "success",
  "data": {
    "consents": [
      {
        "bankCode": "BCR",
        "bankName": "BCR Bank",
        "consentStatus": "enabled",
        "validUntil": "2026-09-01 00:00:00",
        "updatedOn": "2026-06-01 12:00:00"
      }
    ],
    "total": 1
  }
}

Response (no consents)Răspuns (fără consimțăminte)

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": {
    "consents": [],
    "total": 0
  }
}

Response fieldsCâmpuri de răspuns

FieldCâmpDescriptionDescriere
consents[]Bank consents for the license, one entry per bank (latest first). Empty when none exist.Consimțămintele bancare ale licenței, o intrare per bancă (cel mai recent primul). Gol când nu există niciunul.
consents[].bankCodeBank code, e.g. BCR.Codul băncii, ex. BCR.
consents[].bankNameBank display name.Numele afișat al băncii.
consents[].consentStatusConsent state: enabled or disabled. Only enabled consents return transaction data.Starea consimțământului: enabled sau disabled. Doar consimțămintele activate returnează date de tranzacții.
consents[].validUntilDate the consent is valid until, YYYY-MM-DD HH:MM:SS.Data până la care este valabil consimțământul, YYYY-MM-DD HH:MM:SS.
consents[].updatedOnTimestamp of the most recent change to the consent.Marcaj temporal al celei mai recente modificări a consimțământului.
totalNumber of consents returned.Numărul de consimțăminte returnate.

ErrorsErori

HTTPreasonWhenCând
405method_not_allowed_getWrong HTTP method (must be GET)Metodă HTTP greșită (trebuie GET)

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

List accountsListează conturi

GET/v1/extrase/accounts

Returns all stored accounts for the company key’s license, including accounts from disabled consents. The account uid is the public identifier. This is a GET endpoint and takes no request body.

Returnează toate conturile stocate pentru licența cheii de companie, inclusiv conturi din consimțăminte dezactivate. uid contului este identificatorul public. Este un endpoint GET și nu primește corp de cerere.

Example requestExemplu de cerere

bash
curl -sS 'https://api.fint.ro/v1/extrase/accounts' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'X-Api-Key: YOUR_COMPANY_KEY'

ResponseRăspuns

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": {
    "accounts": [
      {
        "uid": "a1b2c3d4e5f64789a0123456789abcde",
        "status": "enabled",
        "iban": "RO49RNCB0000000000000001",
        "currency": "RON",
        "balance": "123.45",
        "name": "Cont curent",
        "ownerName": "Exemplu SRL",
        "product": "Current Account",
        "cashAccountType": "CACC",
        "bic": "RNCBROBU",
        "bank": {
          "code": "BCR",
          "name": "BCR Bank",
          "bic": "RNCB",
          "icon": "https://cdn.fint.ro/image/bank/icon/bcr.png"
        },
        "consentStatus": "enabled",
        "consentValidUntil": "2026-12-31",
        "lastTransactionsSync": "2026-06-22 08:00:00",
        "createdOn": "2026-06-01 10:00:00",
        "updatedOn": "2026-06-22 08:00:00"
      }
    ],
    "total": 1
  }
}

Response fieldsCâmpuri de răspuns

FieldCâmpDescriptionDescriere
accounts[]Stored accounts for the license, including accounts from disabled consents.Conturile stocate ale licenței, inclusiv conturi din consimțăminte dezactivate.
accounts[].uidPublic account identifier; pass it as accountUid to /transactions.Identificatorul public al contului; transmite-l ca accountUid la /transactions.
accounts[].statusAccount state, e.g. enabled.Starea contului, ex. enabled.
accounts[].ibanAccount IBAN.IBAN-ul contului.
accounts[].currencyAccount currency (ISO 4217, e.g. RON).Moneda contului (ISO 4217, ex. RON).
accounts[].balanceCurrent balance as a decimal string (e.g. "123.45").Soldul curent ca șir zecimal (ex. "123.45").
accounts[].nameAccount display name.Numele afișat al contului.
accounts[].ownerNameAccount holder name.Numele titularului contului.
accounts[].productBank product name, when provided.Numele produsului bancar, când este furnizat.
accounts[].cashAccountTypeISO 20022 cash account type code, e.g. CACC (current account), when provided.Cod tip cont ISO 20022, ex. CACC (cont curent), când este furnizat.
accounts[].bicAccount BIC.BIC-ul contului.
accounts[].bankBank object: code, name, bic, icon.Obiect bancă: code, name, bic, icon.
accounts[].consentStatusStatus of the consent this account belongs to (enabled or disabled).Statusul consimțământului de care aparține acest cont (enabled sau disabled).
accounts[].consentValidUntilDate the owning consent is valid until.Data până la care este valabil consimțământul deținător.
accounts[].lastTransactionsSyncTimestamp of the last transaction sync from the bank.Marcaj temporal al ultimei sincronizări de tranzacții de la bancă.
accounts[].createdOnWhen the account was first stored in Fint.Când a fost stocat prima dată contul în Fint.
accounts[].updatedOnTimestamp of the most recent change to the account.Marcaj temporal al celei mai recente modificări a contului.
totalNumber of accounts returned.Numărul de conturi returnate.

ErrorsErori

HTTPreasonWhenCând
405method_not_allowed_getWrong HTTP method (must be GET)Metodă HTTP greșită (trebuie GET)

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

List transactionsListează tranzacții

GET/v1/extrase/transactions

Transactions are scoped to enabled Extrase consents for the matched company. Results are newest-first and offset-paginated. This is a GET endpoint and takes no request body; pass parameters in the query string.

Tranzacțiile sunt limitate la consimțămintele Extrase activate pentru compania potrivită. Rezultatele sunt ordonate de la cele mai recente și paginate prin offset. Este un endpoint GET și nu primește corp de cerere; trimite parametrii în query string.

ParamParamRequiredObligatoriuDescriptionDescriere
limitnonuPage size, default 50, max 100Dimensiune pagină, implicit 50, max 100
offsetnonuOffset, default 0Offset, implicit 0
typenonuall (both directions, default)(ambele direcții, implicit), outgoing orsau incoming
accountUidnonuPublic account UID from /accountsUID public al contului din /accounts
fromnonuBooking date lower bound, YYYY-MM-DDLimită inferioară dată contabilizare, YYYY-MM-DD
tononuBooking date upper bound, YYYY-MM-DDLimită superioară dată contabilizare, YYYY-MM-DD
qnonuSearch across counterparty, IBAN, remittance, description, category, merchant, noteCăutare în contrapartidă, IBAN, detalii plată, descriere, categorie, comerciant, notă

Each item in transactions[] is a full transaction object - the same per-field structure returned by Get a transaction, including the optional provider fields (each present only when the bank/provider supplied it). The envelope also carries total, limit and offset for pagination.

Fiecare element din transactions[] este un obiect tranzacție complet - aceeași structură pe câmpuri returnată de Obține o tranzacție, inclusiv câmpurile opționale de la furnizor (fiecare prezent doar când banca/furnizorul l-a furnizat). Envelopa conține și total, limit și offset pentru paginare.

Example requestExemplu de cerere

bash
curl -sS 'https://api.fint.ro/v1/extrase/transactions?limit=50&offset=0&type=incoming' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'X-Api-Key: YOUR_COMPANY_KEY'

ResponseRăspuns

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": {
    "transactions": [
      {
        "uid": "Qf4x...",
        "type": "incoming",
        "bookingDate": "2026-06-21 00:00:00",
        "executionDateTime": "2026-06-21 09:14:32",
        "entryReference": "ENTRY-12345",
        "endToEndId": "E2E-55512",
        "interlocutor": "Client SRL",
        "interlocutorIban": "RO49AAAA1B31007593840000",
        "amount": "100.00",
        "currency": "RON",
        "fintDescription": "Payment details",
        "rawDescription": "Original bank remittance text",
        "category": "Comisioane si Taxe",
        "creditorName": "Cont curent",
        "creditorAccountIban": "RO49RNCB0000000000000001",
        "debtorName": "Client SRL",
        "debtorAccountIban": "RO49AAAA1B31007593840000",
        "transactionStatus": "booked",
        "userNote": "",
        "createdOn": "2026-06-22 08:00:00",
        "accountUid": "a1b2c3d4e5f64789a0123456789abcde",
        "accountIban": "RO49RNCB0000000000000001",
        "accountName": "Cont curent",
        "bank": {
          "code": "BCR",
          "name": "BCR Bank",
          "bic": "RNCB",
          "icon": "https://cdn.fint.ro/image/bank/icon/bcr.png"
        }
      }
    ],
    "total": 42,
    "limit": 50,
    "offset": 0
  }
}

Response fieldsCâmpuri de răspuns

FieldCâmpDescriptionDescriere
transactions[]Array of full transaction objects - the same per-item structure as Get a transaction, including the optional provider fields when the bank/provider supplied them.Array de obiecte tranzacție complete - aceeași structură pe element ca Obține o tranzacție, inclusiv câmpurile opționale de la furnizor când banca/furnizorul le-a furnizat.
totalTotal number of transactions matching the query (before pagination).Numărul total de tranzacții care corespund interogării (înainte de paginare).
limitPage size that was applied (echoed from the request).Dimensiunea paginii aplicată (reluată din cerere).
offsetOffset that was applied (echoed from the request).Offset-ul aplicat (reluat din cerere).

ErrorsErori

HTTPreasonWhenCând
405method_not_allowed_getWrong HTTP method (must be GET)Metodă HTTP greșită (trebuie GET)
400invalid_typetype is not all, incoming or outgoingtype nu este all, incoming sau outgoing
400invalid_account_uidaccountUid is malformedaccountUid este malformat
404not_foundaccountUid does not match an account owned by this licenseaccountUid nu se potrivește cu un cont deținut de această licență
400invalid_datefrom or to is not a valid YYYY-MM-DD datefrom sau to nu este o dată validă YYYY-MM-DD
400invalid_date_rangefrom is after tofrom este după to
400invalid_searchq could not be sanitizedq nu a putut fi sanitizat

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

Get a transactionObține o tranzacție

GET/v1/extrase/transaction/{uid}

Returns one transaction owned by the company key’s license under an enabled consent. The response includes the summary fields plus the optional provider fields listed below - the same per-transaction structure returned by List transactions. This is a GET endpoint and takes no request body.

Returnează o tranzacție deținută de licența cheii de companie sub un consimțământ activ. Răspunsul include câmpurile sumare plus câmpurile opționale de la furnizor listate mai jos - aceeași structură per tranzacție returnată de Listează tranzacții. Este un endpoint GET și nu primește corp de cerere.

ParamParamLocationLocațieRequiredObligatoriuDescriptionDescriere
uidpathcaleyesdaPublic transaction UID, from /transactionsUID public al tranzacției, din /transactions

Example requestExemplu de cerere

bash
curl -sS 'https://api.fint.ro/v1/extrase/transaction/Qf4x...' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'X-Api-Key: YOUR_COMPANY_KEY'

ResponseRăspuns

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": {
    "uid": "Qf4x...",
    "type": "incoming",
    "bookingDate": "2026-06-21 00:00:00",
    "executionDateTime": "2026-06-21 09:14:32",
    "entryReference": "ENTRY-12345",
    "endToEndId": "E2E-55512",
    "interlocutor": "Client SRL",
    "interlocutorIban": "RO49AAAA1B31007593840000",
    "amount": "100.00",
    "currency": "RON",
    "fintDescription": "Payment details",
    "rawDescription": "Original bank remittance text",
    "category": "Comisioane si Taxe",
    "userNote": "",
    "createdOn": "2026-06-22 08:00:00",
    "accountUid": "a1b2c3d4e5f64789a0123456789abcde",
    "accountIban": "RO49RNCB0000000000000001",
    "accountName": "Cont curent",
    "bank": {
      "code": "BCR",
      "name": "BCR Bank",
      "bic": "RNCB",
      "icon": "https://cdn.fint.ro/image/bank/icon/bcr.png"
    },
    "suggestedReconciliation": []
  }
}

Response fieldsCâmpuri de răspuns

FieldCâmpDescriptionDescriere
uidPublic transaction identifier.Identificatorul public al tranzacției.
typeDirection: incoming or outgoing.Direcția: incoming sau outgoing.
bookingDateDate the bank booked the transaction.Data la care banca a contabilizat tranzacția.
interlocutorCounterparty name (payer for incoming, payee for outgoing).Numele contrapărții (plătitor la incoming, beneficiar la outgoing).
interlocutorIbanCounterparty IBAN, when available.IBAN-ul contrapărții, când este disponibil.
amountTransaction amount as a decimal string (negative for outgoing).Suma tranzacției ca șir zecimal (negativă pentru outgoing).
currencyISO 4217 currency of the transaction.Moneda ISO 4217 a tranzacției.
fintDescriptionFint-computed best payment narrative.Cea mai bună descriere de plată calculată de Fint.
rawDescriptionOriginal bank remittance text; omitted when identical to fintDescription.Textul original al detaliilor de plată de la bancă; omis când este identic cu fintDescription.
categoryProvider category type, exposed separately from descriptions.Tipul categoriei de la furnizor, expus separat de descrieri.
createdOnWhen Fint stored the transaction.Când a stocat Fint tranzacția.
accountUidPublic UID of the owning account (from /accounts).UID-ul public al contului deținător (din /accounts).
accountIbanIBAN of the owning account.IBAN-ul contului deținător.
accountNameName of the owning account.Numele contului deținător.
bankBank object: code, name, bic, icon.Obiect bancă: code, name, bic, icon.
suggestedReconciliationE-invoices this payment probably settles - see Reconciliation suggestions. [] when none, null when unavailable to your key.Facturile electronice pe care această plată probabil le achită - vezi Sugestii de reconciliere. [] când nu există, null când nu este disponibil pentru cheia ta.

Optional provider fields - returned by both this endpoint and List transactions, in addition to the fields above, and only when the bank/provider supplied them.

Câmpuri opționale de la furnizor - returnate atât de acest endpoint, cât și de Listează tranzacții, pe lângă câmpurile de mai sus, și numai când banca/furnizorul le-a furnizat.

FieldCâmpDescriptionDescriere
executionDateTimeTimestamp the transaction was executed.Marcajul temporal al executării tranzacției.
transactionTypeBank/provider transaction type label.Eticheta tipului de tranzacție de la bancă/furnizor.
merchantNameMerchant name, for card transactions.Numele comerciantului, pentru tranzacții cu cardul.
additionalInformationExtra provider-supplied information.Informații suplimentare de la furnizor.
entryReferenceBank entry reference (PSD2 entryReference).Referința intrării la bancă (PSD2 entryReference).
endToEndIdEnd-to-end payment identifier.Identificatorul de plată end-to-end.
transactionStatusProvider transaction status, e.g. booked, pending.Statusul tranzacției la furnizor, ex. booked, pending.
proprietaryBankTransactionCodeBank’s proprietary transaction code.Codul de tranzacție proprietar al băncii.
creditorNameCreditor (payee) name.Numele creditorului (beneficiarului).
creditorAccountIbanCreditor account IBAN.IBAN-ul contului creditorului.
creditorAccountNameCreditor account name.Numele contului creditorului.
debtorNameDebtor (payer) name.Numele debitorului (plătitorului).
debtorAccountIbanDebtor account IBAN.IBAN-ul contului debitorului.
debtorAccountNameDebtor account name.Numele contului debitorului.
userNoteUser-added note on the transaction; empty string when none.Notă adăugată de utilizator pe tranzacție; șir gol când nu există.

ErrorsErori

HTTPreasonWhenCând
405method_not_allowed_getWrong HTTP method (must be GET)Metodă HTTP greșită (trebuie GET)
400invalid_uiduid is missing or malformeduid lipsește sau este malformat
404not_foundNo transaction with that uid owned by this licenseNicio tranzacție cu acest uid deținută de această licență

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

Reconciliation suggestionsSugestii de reconciliere

Every transaction returned by List transactions and Get a transaction carries suggestedReconciliation: the e-invoices this payment most likely settles, each with a confidence score from 1 to 100.

Fiecare tranzacție returnată de Listează tranzacții și Obține o tranzacție conține suggestedReconciliation: facturile electronice pe care această plată le achită cel mai probabil, fiecare cu un scor de încredere de la 1 la 100.

Service access. Suggestions cross services, so the field is only populated when your company key and the company’s license carry both extrase and efactura. An extrase-only key never learns invoice numbers or client CUIs this way - it receives null.

Acces la serviciu. Sugestiile leagă două servicii, deci câmpul este populat doar când cheia ta de companie și licența companiei au ambele servicii, extrase și efactura. O cheie doar cu extrase nu află astfel numere de facturi sau CUI-uri de clienți - primește null.

Fint suggests, it never reconciles. There is no confirmed match to read and nothing to post back - Fint has no notion of an invoice being “paid”. Treat these as input to your own reconciliation, not as a decision.

Fint sugerează, nu reconciliază. Nu există o potrivire confirmată de citit și nimic de trimis înapoi - Fint nu are noțiunea de factură „achitată”. Tratează-le ca intrare pentru propria ta reconciliere, nu ca pe o decizie.

ExampleExemplu

json
"suggestedReconciliation": [
  {
    "documentUid": "d1b2c3...",
    "documentType": "outgoing",
    "documentNumber": "INS2874",
    "documentDate": "2026-06-15",
    "documentDueDate": "2026-07-15",
    "documentTotal": "20570.00",
    "documentCurrency": "RON",
    "counterparty": "Client SRL",
    "counterpartyCui": "RO12345678",
    "confidence": 100
  }
]

Entry fieldsCâmpurile unei intrări

FieldCâmpDescriptionDescriere
documentUidUID of the suggested invoice - pass it to GET /v1/efactura/document/{uid}.UID-ul facturii sugerate - trimite-l către GET /v1/efactura/document/{uid}.
documentTypeDirection of the invoice: outgoing (issued by you) or incoming (received).Direcția facturii: outgoing (emisă de tine) sau incoming (primită).
documentNumberInvoice number.Numărul facturii.
documentDateIssue date, YYYY-MM-DD.Data emiterii, YYYY-MM-DD.
documentDueDatePayment due date, YYYY-MM-DD; null when the invoice carries none.Data scadenței, YYYY-MM-DD; null când factura nu are una.
documentTotalInvoice total as a decimal string.Totalul facturii ca șir zecimal.
documentCurrencyISO 4217 currency of the invoice.Moneda ISO 4217 a facturii.
counterpartyCounterparty name on the invoice.Numele contrapărții de pe factură.
counterpartyCuiCounterparty CUI on the invoice.CUI-ul contrapărții de pe factură.
confidenceProbability of the match, an integer from 1 to 100.Probabilitatea potrivirii, un număr întreg de la 1 la 100.

Three distinct valuesTrei valori distincte

ValueValoareMeaningSemnificație
[]No suggestion for this transaction.Nicio sugestie pentru această tranzacție.
[{…}]One or more candidates, highest confidence first, capped at 5.Unul sau mai mulți candidați, cel mai încrezător primul, maximum 5.
nullNot available to this caller: your company key or the company’s license does not have the other service. Never confuse this with [].Indisponibil pentru acest apelant: cheia de companie sau licența companiei nu are celălalt serviciu. Nu confunda niciodată acest caz cu [].

[] is a normal result, not an error. Always handle it: a payment can settle several invoices at once, and a transaction imported moments ago may not have been processed yet.

[] este un rezultat normal, nu o eroare. Tratează-l întotdeauna: o plată poate achita mai multe facturi deodată, iar o tranzacție importată recent poate să nu fi fost încă procesată.

Two candidates for the same payment is normal and is not an error. When two invoices to the same client share a total, both are returned with their own confidence and Fint does not pick one - the gap between the scores is the signal. Suggestions are rebuilt hourly, so a transaction imported minutes ago may not have one yet.

Doi candidați pentru aceeași plată este normal și nu este o eroare. Când două facturi către același client au același total, ambele sunt returnate cu propriul scor, iar Fint nu alege una - diferența dintre scoruri este semnalul. Sugestiile sunt recalculate orar, deci o tranzacție importată acum câteva minute poate să nu aibă încă una.

The mirror view - which payment settles a given invoice - is on the eFactura page.

Vederea în oglindă - ce plată achită o anumită factură - se află pe pagina eFactura.

API referenceReferință API

eFactura

Submit outgoing Romanian e-invoices and manage incoming and outgoing documents. Fint handles delivery to ANAF e-Factura.

Trimite facturi electronice românești de ieșire și gestionează documente de intrare și ieșire. Fint se ocupă de transmiterea către ANAF e-Factura.

Service access. The efactura service must be allowed on your company key and activated on that company’s license. Fint identifies the company from the company key, so you do not send it yourself.

Acces serviciu. Serviciul efactura trebuie permis pe cheia de companie și activat pe licența companiei. Fint identifică compania din cheia de companie, deci nu o trimiți tu.

An eFactura consent is the company’s authorization for Fint to access ANAF e-Factura on its behalf. It is established through ANAF’s OAuth flow: the authorized person grants access at ANAF, and the consent is recorded for the company license with a CUI and a validUntil date. While the consent is enabled, Fint can submit outgoing documents, report their status, and provide incoming documents from ANAF for that CUI.

Un consimțământ eFactura este autorizarea companiei pentru ca Fint să acceseze ANAF e-Factura în numele ei. Se stabilește prin fluxul OAuth ANAF: persoana autorizată acordă acces la ANAF, iar consimțământul este înregistrat pe licența companiei cu un CUI și o dată validUntil. Cât timp consimțământul este activ, Fint poate trimite documente de ieșire, raporta statusul lor și furniza documente de intrare de la ANAF pentru acel CUI.

You can obtain consent in two ways:

Poți obține consimțământul în două moduri:

  • Fint UI: sign in to Fint, go to Configurare → Servicii, and complete the eFactura authorization flow for the company.
  • Interfața Fint: autentifică-te în Fint, mergi la Configurare → Servicii și finalizează fluxul de autorizare eFactura pentru companie.
  • API (self-service): call /onboarding to generate a share link, have the authorized person open it in a browser and complete ANAF authorization, then poll /consent until data.consentStatus is enabled. See Onboarding & consentOnboarding și consimțământ below.
  • API (self-service): apelează /onboarding pentru a genera un link de partajare, lasă persoana autorizată să-l deschidă în browser și să finalizeze autorizarea ANAF, apoi interoghează /consent până când data.consentStatus este enabled. Vezi Onboarding & consentOnboarding și consimțământ mai jos.

The ANAF authorization step can be completed only by a person who holds a qualified digital certificate registered at ANAF for the company’s CUI (fiscal code). That person must authenticate at ANAF with that certificate; Fint does not collect or store certificate passwords, PINs, or other signing credentials. The company must also have active e-Factura access in ANAF SPV (Spatiu Privat Virtual).

Pasul de autorizare ANAF poate fi finalizat doar de o persoană care deține un certificat digital calificat înregistrat la ANAF pentru CUI-ul (codul fiscal) companiei. Acea persoană trebuie să se autentifice la ANAF cu certificatul respectiv; Fint nu colectează și nu stochează parole de certificat, PIN-uri sau alte credențiale de semnare. Compania trebuie să aibă și acces activ e-Factura în ANAF SPV (Spațiu Privat Virtual).

For outgoing documents, the consent CUI must match from.cui on each /send request. Without an enabled consent, /send returns 403 efactura_consent_required.

Pentru documente de ieșire, CUI-ul consimțământului trebuie să coincidă cu from.cui la fiecare cerere /send. Fără consimțământ activ, /send returnează 403 efactura_consent_required.

Complete consent setup before calling /send. Use the Fint UI or the Onboarding & consentOnboarding și consimțământ API endpoints below.

Finalizează configurarea consimțământului înainte de a apela /send. Folosește interfața Fint sau endpoint-urile API de Onboarding & consentOnboarding și consimțământ de mai jos.

Onboarding & consentOnboarding și consimțământ

API-only flow for delegated ANAF authorization: generate a share link with /onboarding, have the certificate holder complete authorization at ANAF, then poll /consent until consent is enabled.

Flux doar prin API pentru autorizare ANAF delegată: generează un link de partajare cu /onboarding, lasă titularul certificatului să finalizeze autorizarea la ANAF, apoi interoghează /consent până când consimțământul este activ.

Create onboarding linkCreează link de onboarding

POST/v1/efactura/onboarding

Creates a 7-day share link the end-user opens in a browser to authorize Fint at ANAF.

Creează un link de partajare valabil 7 zile pe care utilizatorul final îl deschide în browser pentru a autoriza Fint la ANAF.

Example requestExemplu de cerere

bash
curl -sS -X POST 'https://api.fint.ro/v1/efactura/onboarding' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'X-Api-Key: YOUR_COMPANY_KEY' \
  -H 'Content-Type: application/json' \
  -d '{}'

ResponseRăspuns

json
{
  "status": "success",
  "data": {
    "authLink": "https://app.fint.ro/onboarding/efactura?token=...",
    "expiresOn": "2026-06-27 12:00:00"
  }
}

Response fieldsCâmpuri de răspuns

FieldCâmpDescriptionDescriere
authLinkBrowser link the certificate holder opens to authorize Fint at ANAF.Link de browser pe care titularul certificatului îl deschide pentru a autoriza Fint la ANAF.
expiresOnWhen the link expires (7 days after creation), YYYY-MM-DD HH:MM:SS.Când expiră link-ul (7 zile după creare), YYYY-MM-DD HH:MM:SS.

ErrorsErori

HTTPreasonWhenCând
405method_not_allowedWrong HTTP method (must be POST)Metodă HTTP greșită (trebuie POST)
400invalid_jsonRequest body is not valid JSONCorpul cererii nu este JSON valid
500token_creation_failedCould not create the onboarding tokenNu s-a putut crea token-ul de onboarding

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

GET/v1/efactura/consent

Returns the enabled ANAF consent for the company key’s license, or data: null when none is enabled yet. This is a GET endpoint and takes no request body.

Returnează consimțământul ANAF activ pentru licența cheii de companie, sau data: null când niciunul nu este încă activ. Este un endpoint GET și nu primește corp de cerere.

Example requestExemplu de cerere

bash
curl -sS 'https://api.fint.ro/v1/efactura/consent' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'X-Api-Key: YOUR_COMPANY_KEY'

Response (consent enabled)Răspuns (consimțământ activ)

json
{
  "status": "success",
  "data": {
    "consentStatus": "enabled",
    "validUntil": "2027-01-01",
    "updatedOn": "2026-06-01 10:00:00"
  }
}

Response (no enabled consent)Răspuns (fără consimțământ activ)

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": null
}

Response fieldsCâmpuri de răspuns

data is null when no ANAF consent is enabled yet. When a consent is enabled, data is an object with the fields below.

data este null când niciun consimțământ ANAF nu este încă activ. Când un consimțământ este activ, data este un obiect cu câmpurile de mai jos.

FieldCâmpDescriptionDescriere
consentStatusConsent state; enabled when a usable consent exists.Starea consimțământului; enabled când există un consimțământ utilizabil.
validUntilDate the consent is valid until, YYYY-MM-DD.Data până la care este valabil consimțământul, YYYY-MM-DD.
updatedOnTimestamp of the most recent change to the consent.Marcaj temporal al celei mai recente modificări a consimțământului.

ErrorsErori

HTTPreasonWhenCând
405method_not_allowed_getWrong HTTP method (must be GET)Metodă HTTP greșită (trebuie GET)

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

Send a documentTrimite un document

POST/v1/efactura/send

Validates and enqueues one outgoing document. The request body is a single JSON object describing the invoice; the fields below are its top-level keys (not HTTP headers). Fint maps it to a CIUS-RO (EN 16931) UBL invoice before sending it to ANAF.

Validează și pune în coadă un document de ieșire. Corpul cererii este un singur obiect JSON care descrie factura; câmpurile de mai jos sunt cheile sale de nivel superior (nu header-e HTTP). Fint îl transformă într-o factură UBL CIUS-RO (EN 16931) înainte de a o trimite la ANAF.

Request body fieldsCâmpuri din corpul cererii

Totals are computed, not sent. Line amounts, the VAT breakdown and the invoice totals are derived by Fint from items. Do not send total fields - they are ignored.

Totalurile sunt calculate, nu trimise. Valorile de linie, defalcarea TVA și totalurile facturii sunt derivate de Fint din items. Nu trimite câmpuri de total - sunt ignorate.

HeaderAntet

FieldCâmpRequirementCerințăMeaningSemnificație
documentNumberRequiredObligatoriuInvoice number. Must be non-empty and unique per seller; a repeat returns 409 duplicate_document.Numărul facturii. Nevid și unic per furnizor; o repetare returnează 409 duplicate_document.
documentDateRequiredObligatoriuIssue date; any parseable date, emitted as YYYY-MM-DD.Data emiterii; orice dată parsabilă, emisă ca YYYY-MM-DD.
dueDateOptionalOpționalPayment due date; any parseable date, emitted as YYYY-MM-DD.Data scadenței plății; orice dată parsabilă, emisă ca YYYY-MM-DD.
currencyRequiredObligatoriuInvoice currency. Must be RON.Moneda facturii. Trebuie să fie RON.
documentTypeCodeOptionalOpționalUNCL 1001 type; default 380. Allowed: 380 Factură, 381 Notă de creditare, 384 Factură corectată, 389 Autofactură, 751 Informații contabile.Tip UNCL 1001; implicit 380. Permise: 380 Factură, 381 Notă de creditare, 384 Factură corectată, 389 Autofactură, 751 Informații contabile.
noteOptionalOpționalFree-text note or observation. Not length-checked by Fint; ANAF limits it to 300 characters.Notă sau observație text liber. Neverificată ca lungime de Fint; ANAF o limitează la 300 de caractere.
deliveryDateOptionalOpționalActual delivery date of the goods/services. Required by ANAF when any item uses vatScheme K (intra-community supply).Data efectivă a livrării bunurilor/serviciilor. Cerută de ANAF când un articol folosește vatScheme K (livrare intracomunitară).
deliveryAddressOptionalOpționalDelivery location address (same shape as a party address). Emitted only alongside deliveryDate; if omitted, the buyer address is used.Adresa locului de livrare (aceeași structură ca address al unei părți). Emisă doar împreună cu deliveryDate; dacă lipsește, se folosește adresa clientului.
buyerReferenceOptionalOpționalBuyer’s reference, e.g. a PO or cost-center code. Not length-checked by Fint; ANAF limits it to 30 characters.Referința cumpărătorului, ex. o comandă sau cod de centru de cost. Neverificată ca lungime de Fint; ANAF o limitează la 30 de caractere.

Parties - from & toPărți - from și to

from is the supplier (furnizor) and to is the customer (client). Both share the same shape. from.cui must equal the enabled consent CUI for your license, otherwise 422 from_cui_mismatch. For a consumer (B2C) buyer, set to.cui to 0000000000000; a full to.name and to.address are still required.

from este furnizorul și to este clientul. Ambele au aceeași structură. from.cui trebuie să fie egal cu CUI-ul consimțământului activ al licenței, altfel 422 from_cui_mismatch. Pentru un client persoană fizică (B2C), setează to.cui la 0000000000000; sunt necesare în continuare to.name și to.address complete.

FieldCâmpRequirementCerințăMeaningSemnificație
cuiRequiredObligatoriuFiscal code. from.cui must match the consent; to.cui a valid CUI, or 0000000000000 for B2C.Cod fiscal. from.cui trebuie să coincidă cu consimțământul; to.cui un CUI valid, sau 0000000000000 pentru B2C.
nameRequiredObligatoriuLegal name of the party.Denumirea legală a părții.
regComOptionalOpționalTrade register number (nr. reg. com.), e.g. J40/12813/2016. Max 100 characters. Sent to ANAF as the seller’s legal registration identifier or the buyer’s party identifier - see UBL mapping.Numărul de la registrul comerțului (nr. reg. com.), ex. J40/12813/2016. Maxim 100 de caractere. Este trimis la ANAF ca identificator de înregistrare legală al vânzătorului sau ca identificator al cumpărătorului - vezi Mapare UBL.
address.lineRequiredObligatoriuStreet address.Adresa (stradă, număr).
address.cityRequiredObligatoriuCity. In Bucharest use the sector, e.g. SECTOR1.Localitate. În București folosește sectorul, ex. SECTOR1.
address.countrySubdivisionRequiredObligatoriuCounty as RO-XX (e.g. RO-CJ); Bucharest is RO-B.Județul ca RO-XX (ex. RO-CJ); Bucureștiul este RO-B.
address.countryRequiredObligatoriuISO country code, e.g. RO.Cod ISO de țară, ex. RO.
address.postalCodeOptionalOpționalPostal code.Cod poștal.
legalFormOptionalOpționalfrom only. Additional legal information that Romanian law requires on the invoice and no other field carries, e.g. Capital social: 200 lei. Separate multiple entries with #.Doar pentru from. Informații juridice suplimentare pe care legea le cere pe factură și care nu au alt câmp, ex. Capital social: 200 lei. Separă mai multe mențiuni cu #.
emailOptionalOpționalto only. Buyer electronic address, sent as the invoice endpoint id.Doar pentru to. Adresa electronică a cumpărătorului, trimisă ca identificator de endpoint al facturii.
contactNameOptionalOpționalContact person for this party.Persoana de contact pentru această parte.
contactEmailOptionalOpționalContact email for this party.Emailul de contact pentru această parte.

Normalization. You do not need to pre-format addresses. Fint accepts county names or codes (e.g. Cluj or RO-CJ) and Bucharest variants (București, Sector 1, RO-B) and normalizes them to ANAF/CIUS-RO form; unrecognized city/subdivision is filled from Info CUI by the party’s cui.

Normalizare. Nu trebuie să pre-formatezi adresele. Fint acceptă nume sau coduri de județ (ex. Cluj sau RO-CJ) și variante pentru București (București, Sector 1, RO-B) și le normalizează în forma ANAF/CIUS-RO; localitatea/subdiviziunea nerecunoscută este completată din Info CUI după cui-ul părții.

Trade register number. The same Info CUI lookup fills from.regCom when you leave the key out of the payload, so the seller’s nr. reg. com. reaches ANAF without any work on your side. Send from.regCom yourself to override it, or send it as "" / null to omit it from the invoice. There is no auto-fill for to.regCom - send it if you want the buyer’s number on the document.

Numărul de la registrul comerțului. Aceeași căutare în Info CUI completează from.regCom când nu trimiți deloc cheia, așa că nr. reg. com. al vânzătorului ajunge la ANAF fără efort din partea ta. Trimite from.regCom pentru a-l suprascrie, sau trimite-l ca "" / null pentru a-l omite din factură. Pentru to.regCom nu există completare automată - trimite-l dacă vrei numărul cumpărătorului pe document.

Line items - items[]Linii - items[]

A non-empty array; each element is one invoice line.

Un array nevid; fiecare element este o linie de factură.

FieldCâmpRequirementCerințăMeaningSemnificație
nameRequiredObligatoriuItem name/description, max 200 characters.Denumirea/descrierea articolului, max 200 caractere.
quantityRequiredObligatoriuInvoiced quantity.Cantitatea facturată.
priceRequiredObligatoriuNet unit price.Prețul unitar net.
vatRateRequiredObligatoriuVAT percentage, 0-100. Must be 0 for every scheme except S.Procent TVA, 0-100. Trebuie să fie 0 pentru orice schemă în afară de S.
vatSchemeRequiredObligatoriuVAT category code, UNCL 5305 - see the table below.Cod categorie TVA, UNCL 5305 - vezi tabelul de mai jos.
vatexCodeConditionalCondiționatVAT exemption reason code, e.g. VATEX-EU-AE. Required by ANAF for exempt / reverse-charge categories (E, AE, K, G, O); not used for S or Z.Cod motiv scutire TVA, ex. VATEX-EU-AE. Cerut de ANAF pentru categoriile scutite / taxare inversă (E, AE, K, G, O); neutilizat pentru S sau Z.
vatexReasonOptionalOpționalFree-text VAT exemption reason, paired with vatexCode.Motiv de scutire TVA în text liber, împreună cu vatexCode.
classificationCodeOptionalOpționalItem classification code, e.g. a CPV code. Requires classificationList.Cod de clasificare a articolului, ex. un cod CPV. Necesită classificationList.
classificationListOptionalOpționalClassification scheme id (listID). Must be a UNTDID 7143 code (e.g. STI for CPV). Requires classificationCode.Id-ul schemei de clasificare (listID). Trebuie să fie un cod UNTDID 7143 (ex. STI pentru CPV). Necesită classificationCode.

VAT schemes (vatScheme)Scheme de TVA (vatScheme)

The per-item vatScheme is a UNCL 5305 category code. Every scheme except S is a zero-rate category and requires vatRate: 0. The API validates vatScheme and the vatRate: 0 coupling; the vatexCode and deliveryDate requirements in the "Requires" column are enforced by ANAF at submission, not pre-checked by this API.

Câmpul vatScheme per articol este un cod de categorie UNCL 5305. Orice schemă în afară de S este o categorie cu cotă zero și necesită vatRate: 0. API-ul validează vatScheme și corelarea cu vatRate: 0; cerințele vatexCode și deliveryDate din coloana "Necesită" sunt aplicate de ANAF la trimitere, nu pre-verificate de acest API.

CodeCodMeaningSemnificațieRequiresNecesită
SStandard rateCotă standardvatRate > 0vatRate > 0
ZZero ratedCotă zerovatRate: 0vatRate: 0
EExempt from VATScutit de TVAvatRate: 0, vatexCodevatRate: 0, vatexCode
AEReverse chargeTaxare inversăvatRate: 0, vatexCode (e.g. VATEX-EU-AE)vatRate: 0, vatexCode (ex. VATEX-EU-AE)
KIntra-community supplyLivrare intracomunitarăvatRate: 0, deliveryDate, vatexCode (VATEX-EU-IC)vatRate: 0, deliveryDate, vatexCode (VATEX-EU-IC)
GExport outside the EUExport în afara UEvatRate: 0, vatexCode (VATEX-EU-G)vatRate: 0, vatexCode (VATEX-EU-G)
OOutside scope of VATÎn afara sferei TVAvatRate: 0, vatexCode (VATEX-EU-O)vatRate: 0, vatexCode (VATEX-EU-O)
LCanary Islands (IGIC)Insulele Canare (IGIC)vatRate: 0vatRate: 0
MCeuta & Melilla (IPSI)Ceuta și Melilla (IPSI)vatRate: 0vatRate: 0

Payment - paymentMeansPlată - paymentMeans

The paymentMeans object is optional. When you include it, paymentMeansCode is required within it.

Obiectul paymentMeans este opțional. Când îl incluzi, paymentMeansCode este obligatoriu în interiorul lui.

FieldCâmpRequirementCerințăMeaningSemnificație
paymentMeansCodeRequired if paymentMeans presentObligatoriu dacă paymentMeans existăUNCL 4461 payment means code, a number 1-97; e.g. 30 credit transfer.Cod mijloc de plată UNCL 4461, un număr 1-97; ex. 30 transfer bancar.
ibanOptionalOpționalPayee account IBAN. Recommended.IBAN-ul contului beneficiar. Recomandat.
paymentIdOptionalOpționalPayment reference / remittance information.Referință de plată / informații de remitere.
accountNameOptionalOpționalPayee account holder name.Numele titularului contului beneficiar.
bicOptionalOpționalPayee bank BIC/SWIFT.BIC/SWIFT-ul băncii beneficiare.
Example requestExemplu de cerere
curl -sS -X POST 'https://api.fint.ro/v1/efactura/send' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'X-Api-Key: YOUR_COMPANY_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "documentNumber": "INV-1",
    "documentDate": "2025-03-21",
    "currency": "RON",
    "documentTypeCode": "380",
    "note": "Livrare conform contract 42/2025.",
    "deliveryDate": "2025-03-21",
    "from": {
      "cui": "34790982",
      "name": "Seller SRL",
      "address": {
        "line": "Str. Test 1",
        "city": "SECTOR1",
        "postalCode": "010001",
        "countrySubdivision": "RO-B",
        "country": "RO"
      },
      "regCom": "J40/12813/2016"
    },
    "to": {
      "cui": "12345678",
      "name": "Buyer SRL",
      "address": {
        "line": "Str. Client 2",
        "city": "SECTOR1",
        "postalCode": "010002",
        "countrySubdivision": "RO-B",
        "country": "RO"
      },
      "regCom": "J40/8853/2015"
    },
    "items": [
      {
        "name": "Service",
        "quantity": 1,
        "price": 100,
        "vatRate": 21,
        "vatScheme": "S",
        "classificationCode": "79411000",
        "classificationList": "STI"
      }
    ],
    "paymentMeans": {
      "paymentMeansCode": "30",
      "iban": "RO49AAAA1B31007593840000",
      "paymentId": "ORD-1"
    }
  }'
{
  "documentNumber": "INV-1",
  "documentDate": "2025-03-21",
  "currency": "RON",
  "documentTypeCode": "380",
  "note": "Livrare conform contract 42/2025.",
  "deliveryDate": "2025-03-21",
  "from": {
    "cui": "34790982",
    "name": "Seller SRL",
    "address": {
      "line": "Str. Test 1",
      "city": "SECTOR1",
      "postalCode": "010001",
      "countrySubdivision": "RO-B",
      "country": "RO"
    },
    "regCom": "J40/12813/2016"
  },
  "to": {
    "cui": "12345678",
    "name": "Buyer SRL",
    "address": {
      "line": "Str. Client 2",
      "city": "SECTOR1",
      "postalCode": "010002",
      "countrySubdivision": "RO-B",
      "country": "RO"
    },
    "regCom": "J40/8853/2015"
  },
  "items": [
    {
      "name": "Service",
      "quantity": 1,
      "price": 100,
      "vatRate": 21,
      "vatScheme": "S",
      "classificationCode": "79411000",
      "classificationList": "STI"
    }
  ],
  "paymentMeans": {
    "paymentMeansCode": "30",
    "iban": "RO49AAAA1B31007593840000",
    "paymentId": "ORD-1"
  }
}

In short, documentNumber, documentDate, currency (RON), from, to, and a non-empty items array are required; everything else is optional. After local checks and a duplicate check, Fint pre-validates the generated UBL with ANAF.

Pe scurt, documentNumber, documentDate, currency (RON), from, to și un array items nevid sunt obligatorii; restul sunt opționale. După verificări locale și verificarea duplicatelor, Fint pre-validează UBL-ul generat cu ANAF.

Response (201 Created)Răspuns (201 Created)

json
{
  "status": "success",
  "msg": "Document has been validated with Fint. Pending upload and ANAF confirmation.",
  "reason": null,
  "data": {
    "uid": "a1b2c3d4-e5f6-4789-a012-3456789abcde",
    "status": "pending"
  }
}

Response fieldsCâmpuri de răspuns

FieldCâmpDescriptionDescriere
uidStable identifier of the newly created document; use it with Get a document and /download.Identificatorul stabil al documentului nou creat; folosește-l cu Obține un document și /download.
statusLifecycle status of the document; pending immediately after a successful submit.Statusul în ciclul de viață al documentului; pending imediat după o trimitere reușită.

On failure, data instead carries error detail: a 422 validation_failed returns a data.errors[] array (each with code, field, message), and a 409 duplicate_document returns data.existingDocumentUid.

La eșec, data conține în schimb detaliul erorii: un 422 validation_failed returnează un array data.errors[] (fiecare cu code, field, message), iar un 409 duplicate_document returnează data.existingDocumentUid.

Response (422 validation failed)Răspuns (422 validare eșuată)

json
{
  "status": "error",
  "msg": "Document is not valid.",
  "reason": "validation_failed",
  "data": {
    "errors": [
      {
        "code": "from_cui_mismatch",
        "field": "from.cui",
        "message": "from.cui must match the enabled eFactura consent CUI for this license"
      }
    ]
  }
}

ErrorsErori

HTTPreasonWhenCând
405method_not_allowedWrong HTTP method (must be POST)Metodă HTTP greșită (trebuie POST)
429limit_exceededUsage at/over plan limit for the efactura serviceUtilizare la/peste limita planului pentru serviciul efactura
400invalid_jsonRequest body is not valid JSONCorpul cererii nu este JSON valid
403efactura_consent_requiredNo enabled consent, or the consent has no CUINiciun consimțământ activ, sau consimțământul nu are CUI
422validation_failedDocument fails field validation, or fails ANAF pre-validation (see data.errors[])Documentul eșuează validarea câmpurilor, sau eșuează pre-validarea ANAF (vezi data.errors[])
409duplicate_documentSame seller + documentNumber already queued or sent (see data.existingDocumentUid)Același furnizor + documentNumber deja în coadă sau trimis (vezi data.existingDocumentUid)
500enqueue_failedCould not create the pending documentNu s-a putut crea documentul în așteptare

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

List documentsListează documente

GET/v1/efactura/documents

Lists documents for the key’s license. No query parameters uses defaults. Omitting type returns both directions (incoming and outgoing) interleaved, newest-first; each item carries a type field so you can tell them apart. For line items and download availability, use /document. This is a GET endpoint and takes no request body; pass parameters in the query string.

Listează documentele pentru licența cheii. Fără parametri de query folosește valorile implicite. Fără type sunt returnate ambele direcții (intrare și ieșire) intercalate, cele mai noi primele; fiecare element are un câmp type ca să le poți deosebi. Pentru linii și disponibilitate descărcare, folosește /document. Este un endpoint GET și nu primește corp de cerere; trimite parametrii în query string.

ParamParametruRequiredObligatoriuDescriptionDescriere
typenonuall (both directions, default)(ambele direcții, implicit), outgoing orsau incoming
limitnonuPage size, default 50, max 100Dimensiune pagină, implicit 50, max 100
offsetnonuOffset, default 0Offset, implicit 0
statusnonuComma-separated list of pending, sent, validated, rejected, failed (sent never applies to incoming documents); default all. Any unknown value returns 400 invalid_statusListă separată prin virgulă din pending, sent, validated, rejected, failed (sent nu apare niciodată la documentele primite); implicit toate. Orice valoare necunoscută returnează 400 invalid_status

Example requestExemplu de cerere

bash
curl -sS 'https://api.fint.ro/v1/efactura/documents?type=incoming&limit=50&offset=0' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'X-Api-Key: YOUR_COMPANY_KEY'

ResponseRăspuns

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": {
    "documents": [
      {
        "uid": "a1b2c3d4-...",
        "type": "incoming",
        "status": "validated",
        "source": "spv",
        "documentTypeCode": "380",
        "documentNumber": "INV-1",
        "documentDate": "2025-03-21",
        "currency": "RON",
        "fromTo": "Seller SRL",
        "fromToCui": "34790982",
        "total": "121.00",
        "anafStatus": "ok",
        "anafId": "5032836579",
        "processed": 1,
        "createdOn": "2025-03-21 10:00:00",
        "updatedOn": "2025-03-21 12:00:00"
      }
    ],
    "total": 42,
    "limit": 50,
    "offset": 0
  }
}

Response fieldsCâmpuri de răspuns

FieldCâmpDescriptionDescriere
documents[]Array of document objects carrying the summary fields (uid, type, status, source, documentTypeCode, documentNumber, documentDate, currency, fromTo, fromToCui, total, anafStatus, anafId, processed, createdOn, updatedOn, suggestedReconciliation). See Get a document for the full per-field reference; line items, parties and download availability are returned only by that endpoint.Array de obiecte document care conțin câmpurile sumare (uid, type, status, source, documentTypeCode, documentNumber, documentDate, currency, fromTo, fromToCui, total, anafStatus, anafId, processed, createdOn, updatedOn, suggestedReconciliation). Vezi Obține un document pentru referința completă pe câmpuri; liniile, părțile și disponibilitatea descărcării sunt returnate doar de acel endpoint.
totalTotal number of documents matching the query (before pagination).Numărul total de documente care corespund interogării (înainte de paginare).
limitPage size that was applied (echoed from the request).Dimensiunea paginii aplicată (reluată din cerere).
offsetOffset that was applied (echoed from the request).Offset-ul aplicat (reluat din cerere).

ErrorsErori

HTTPreasonWhenCând
405method_not_allowed_getWrong HTTP method (must be GET)Metodă HTTP greșită (trebuie GET)
400invalid_typetype is not all, incoming or outgoingtype nu este all, incoming sau outgoing

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

Get a documentObține un document

GET/v1/efactura/document/{uid}

Resolves any document (outgoing or incoming) owned by the company key’s license, including parties, line items, payment means, ANAF state and download availability. This is a GET endpoint and takes no request body.

Rezolvă orice document (de ieșire sau intrare) deținut de licența cheii de companie, inclusiv părți, linii, mijloace de plată, starea ANAF și disponibilitatea descărcării. Este un endpoint GET și nu primește corp de cerere.

ParamParamLocationLocațieRequiredObligatoriuDescriptionDescriere
uidpathcaleyesdaDocument UID, from /documents or the /send responseUID-ul documentului, din /documents sau răspunsul /send

Example requestExemplu de cerere

bash
curl -sS 'https://api.fint.ro/v1/efactura/document/a1b2c3d4-e5f6-4789-a012-3456789abcde' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'X-Api-Key: YOUR_COMPANY_KEY'

ResponseRăspuns

json
{
  "status": "success",
  "data": {
    "uid": "a1b2c3d4-...",
    "type": "outgoing",
    "status": "validated",
    "errorMessage": null,
    "source": "fint",
    "documentTypeCode": "380",
    "documentNumber": "INV-1",
    "documentDate": "2025-03-21",
    "currency": "RON",
    "fromTo": "Buyer SRL",
    "fromToCui": "12345678",
    "total": "100.00",
    "anafStatus": "ok",
    "anafId": "5032836579",
    "pdfAvailable": 1,
    "xmlAvailable": 1,
    "processed": 1,
    "createdOn": "2025-03-21 10:00:00",
    "updatedOn": "2025-03-21 12:00:00",
    "note": "Livrare conform contract 42/2025.",
    "dueDate": "2025-04-20",
    "buyerReference": "PO-2025-042",
    "deliveryDate": "2025-03-21",
    "deliveryAddress": null,
    "from": {
      "cui": "34790982",
      "name": "Seller SRL",
      "address": {
        "line": "Str. Test 1",
        "city": "SECTOR1",
        "postalCode": "010001",
        "countrySubdivision": "RO-B",
        "country": "RO"
      },
      "regCom": "J40/12813/2016"
    },
    "to": {
      "cui": "12345678",
      "name": "Buyer SRL",
      "address": {
        "line": "Str. Client 2",
        "city": "SECTOR1",
        "postalCode": "010002",
        "countrySubdivision": "RO-B",
        "country": "RO"
      },
      "regCom": "J40/8853/2015"
    },
    "items": [
      {
        "name": "Service",
        "quantity": 1,
        "price": 100,
        "vatRate": 0,
        "vatScheme": "E",
        "currency": "RON",
        "vatexCode": "VATEX-EU-D",
        "vatexReason": "Scutit conform reglementarilor UE",
        "classificationCode": "79411000",
        "classificationList": "STI",
        "value": "100.00"
      }
    ],
    "paymentMeans": {
      "paymentMeansCode": "30",
      "paymentId": "ORD-1",
      "iban": "RO49AAAA1B31007593840000",
      "accountName": "Main account",
      "bic": null
    },
    "suggestedReconciliation": []
  }
}

Response fieldsCâmpuri de răspuns

FieldCâmpDescriptionDescriere
uidStable document identifier; use it with /document and /download.Identificator stabil al documentului; folosește-l cu /document și /download.
typeoutgoing (issued by you) or incoming (received from a supplier via SPV).outgoing (emis de tine) sau incoming (primit de la un furnizor prin SPV).
statusFint lifecycle status: pending, sent, validated, rejected, or failed.Statusul în ciclul de viață Fint: pending, sent, validated, rejected sau failed.
errorMessageFailure detail when the document was rejected or processing failed; otherwise null.Detaliul erorii când documentul a fost respins sau procesarea a eșuat; altfel null.
sourceOrigin: fint (issued through Fint) or spv (discovered in the ANAF SPV).Origine: fint (emis prin Fint) sau spv (descoperit în SPV-ul ANAF).
documentTypeCodeDocument type code, e.g. 380 invoice, 381 credit note.Cod tip document, ex. 380 factură, 381 notă de credit.
documentNumberDocument/invoice number.Numărul documentului/facturii.
documentDateIssue date, YYYY-MM-DD.Data emiterii, YYYY-MM-DD.
currencyDocument currency (ISO 4217, e.g. RON).Moneda documentului (ISO 4217, ex. RON).
fromToCounterparty name (buyer on outgoing, supplier on incoming).Numele contrapărții (client la ieșire, furnizor la intrare).
fromToCuiCounterparty CUI.CUI-ul contrapărții.
totalGrand total including VAT, as a string.Totalul general cu TVA, ca șir de caractere.
anafStatusANAF processing state for the upload/download, or null before it is known.Starea de procesare ANAF pentru încărcare/descărcare, sau null până când este cunoscută.
anafIdANAF upload index / download id, or null.Index de încărcare / id de descărcare ANAF, sau null.
pdfAvailable1 if a human-readable PDF can be fetched from /download, else 0.1 dacă un PDF lizibil poate fi obținut din /download, altfel 0.
xmlAvailable1 if the signed XML/ZIP can be fetched from /download, else 0.1 dacă XML-ul/ZIP-ul semnat poate fi obținut din /download, altfel 0.
processed1 once the document has been fully processed after ANAF confirmation, else 0.1 după procesarea completă a documentului în urma confirmării ANAF, altfel 0.
createdOnTimestamp when the document was first recorded in Fint (issued for outgoing, or first pulled from SPV for incoming).Marcaj temporal când documentul a fost înregistrat prima dată în Fint (emis pentru ieșire, sau preluat prima dată din SPV pentru intrare).
updatedOnTimestamp of the most recent change to the document (status or ANAF state update).Marcaj temporal al celei mai recente modificări a documentului (actualizare status sau stare ANAF).
noteFree-text note, when present.Notă în text liber, când există.
dueDatePayment due date (YYYY-MM-DD), or null. Echoed from the submitted payload; for incoming documents it is read from the supplier’s XML when present.Data scadenței plății (YYYY-MM-DD) sau null. Reluată din payload-ul trimis; pentru documentele primite este citită din XML-ul furnizorului, când există.
buyerReferenceBuyer’s reference (PO / cost-center code), or null. Echoed from the submitted payload; for incoming documents it is read from the supplier’s XML when present.Referința cumpărătorului (comandă / centru de cost) sau null. Reluată din payload-ul trimis; pentru documentele primite este citită din XML-ul furnizorului, când există.
deliveryDateActual delivery date, when present.Data efectivă a livrării, când există.
deliveryAddressDelivery address object (same shape as a party address), when present.Obiect adresă de livrare (aceeași formă ca address al unei părți), când există.
fromSupplier party: cui, name, address - see the party fields under Send a document. May also carry regCom, email, contactName, contactEmail and legalForm when present.Partea furnizor: cui, name, address - vezi câmpurile părții la Trimite un document. Poate conține și regCom, email, contactName, contactEmail și legalForm când există.
toCustomer party: same shape as from.Partea client: aceeași formă ca from.
paymentMeansPayment means (paymentMeansCode, paymentId, iban, accountName, bic), or null when the document carries none. Now also returned for incoming documents, read from the stored UBL - previously these were always null.Modalitate de plată (paymentMeansCode, paymentId, iban, accountName, bic), sau null când documentul nu conține niciuna. Acum este returnată și pentru documentele de intrare, citită din UBL-ul stocat - anterior acestea erau mereu null.
suggestedReconciliationBank payments that probably settle this invoice - see Reconciliation suggestions. [] when none, null when unavailable to your key.Plăți bancare care probabil achită această factură - vezi Sugestii de reconciliere. [] când nu există, null când nu este disponibil pentru cheia ta.
items[]Invoice lines. Each line is an object with the fields below. See the line item fields under Send a document for the submission-side detail.Liniile facturii. Fiecare linie este un obiect cu câmpurile de mai jos. Vezi câmpurile de linie la Trimite un document pentru detaliile de trimitere.
items[].nameItem name / description.Numele / descrierea articolului.
items[].quantityInvoiced quantity. May be negative on discount or credit lines.Cantitatea facturată. Poate fi negativă pe liniile de reducere sau creditare.
items[].priceNet unit price - always a positive per-unit amount.Prețul unitar net - întotdeauna o valoare pozitivă per unitate.
items[].vatRateVAT percentage (0-100).Procent TVA (0-100).
items[].vatSchemeVAT category code (S, Z, E, AE, K, G, O, L, M).Cod categorie TVA (S, Z, E, AE, K, G, O, L, M).
items[].currencyLine currency (ISO 4217, e.g. RON).Moneda liniei (ISO 4217, ex. RON).
items[].valueSigned net total for the line, as a decimal string (e.g. "100.00"). It is negative on discount or credit lines. price is always a positive per-unit amount and quantity may be negative, so do not reconstruct the line total from price × quantity - use value directly.Totalul net cu semn al liniei, ca șir zecimal (ex. "100.00"). Este negativ pe liniile de reducere sau creditare. price este întotdeauna o valoare pozitivă per unitate, iar quantity poate fi negativ, deci nu reconstitui totalul liniei din price × quantity - folosește direct value.
items[].vatexCodeVAT exemption reason code (e.g. VATEX-EU-AE), returned when present.Cod motiv scutire TVA (ex. VATEX-EU-AE), returnat când există.
items[].vatexReasonFree-text VAT exemption reason, returned when present.Motiv de scutire TVA în text liber, returnat când există.
items[].classificationCodeItem classification code (e.g. a CPV code), returned when present.Cod de clasificare a articolului (ex. un cod CPV), returnat când există.
items[].classificationListClassification scheme id (e.g. STI), returned when present.Id-ul schemei de clasificare (ex. STI), returnat când există.

ErrorsErori

HTTPreasonWhenCând
405method_not_allowed_getWrong HTTP method (must be GET)Metodă HTTP greșită (trebuie GET)
400invalid_uiduid is missing or malformeduid lipsește sau este malformat
404not_foundNo document with that uid owned by this licenseNiciun document cu acest uid deținut de această licență

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

Download a documentDescarcă un document

GET/v1/efactura/download/{uid}?type=pdf|xml

Returns the raw binary as an attachment, not the JSON envelope. PDF for type=pdf; signed XML delivered as a ZIP for type=xml (zip is an alias for xml). Use pdfAvailable/xmlAvailable from /document/{uid} to know which exist. This is a GET endpoint and takes no request body.

Returnează binarul brut ca atașament, nu envelopa JSON. PDF pentru type=pdf; XML semnat livrat ca ZIP pentru type=xml (zip este alias pentru xml). Folosește pdfAvailable/xmlAvailable din /document/{uid} pentru a ști ce există. Este un endpoint GET și nu primește corp de cerere.

ParamParamLocationLocațieRequiredObligatoriuDescriptionDescriere
uidpathcaleyesdaDocument UIDUID-ul documentului
typequeryqueryyesdapdf orsau xml (zip accepted as an alias for xml)(zip acceptat ca alias pentru xml)

Example requestExemplu de cerere

bash
curl -sS 'https://api.fint.ro/v1/efactura/download/a1b2c3d4-e5f6-4789-a012-3456789abcde?type=pdf' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'X-Api-Key: YOUR_COMPANY_KEY' \
  -o document.pdf

Response (200 OK)Răspuns (200 OK)

The response is the raw file as a binary attachment (with a Content-Disposition header), not JSON. Save it to disk with -o, as shown above.

Răspunsul este fișierul brut ca atașament binar (cu header Content-Disposition), nu JSON. Salvează-l pe disc cu -o, ca mai sus.

ErrorsErori

HTTPreasonWhenCând
405method_not_allowed_getWrong HTTP method (must be GET)Metodă HTTP greșită (trebuie GET)
400invalid_uiduid is missing or malformeduid lipsește sau este malformat
400invalid_typetype is not pdf, xml or ziptype nu este pdf, xml sau zip
404not_foundNo document with that uid owned by this licenseNiciun document cu acest uid deținut de această licență
404document_not_availableDocument exists but the file is not available on diskDocumentul există dar fișierul nu este disponibil pe disc

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

UBL mappingMapare UBL

Fint maps the document to a CIUS-RO (EN 16931) UBL invoice before sending it to ANAF. You do not need any of this to use the API - it is a reference for reconciling Fint fields against a raw UBL/XML invoice or the ANAF PDF. Seller and buyer share the same element paths - regCom is the one exception - and the EN 16931 column shows seller / buyer where they differ.

Fint mapează documentul într-o factură UBL CIUS-RO (EN 16931) înainte de a o trimite la ANAF. Nu ai nevoie de aceste detalii pentru a folosi API-ul - sunt o referință pentru a reconcilia câmpurile Fint cu o factură UBL/XML brută sau cu PDF-ul ANAF. Furnizorul și clientul folosesc aceleași căi de element - regCom este singura excepție - iar coloana EN 16931 arată furnizor / client acolo unde diferă.

Fint fieldCâmp FintUBL elementElement UBLEN 16931
documentNumbercbc:IDBT-1
documentDatecbc:IssueDateBT-2
dueDatecbc:DueDateBT-9
currencycbc:DocumentCurrencyCodeBT-5
documentTypeCodecbc:InvoiceTypeCode (cbc:CreditNoteTypeCode for credit notes)(cbc:CreditNoteTypeCode pentru note de credit)BT-3
notecbc:NoteBT-22
buyerReferencecbc:BuyerReferenceBT-10
deliveryDatecac:Delivery/cbc:ActualDeliveryDateBT-72
deliveryAddresscac:Delivery/cac:DeliveryLocation/cac:AddressBG-15
from / tocac:AccountingSupplierParty/cac:Party / cac:AccountingCustomerParty/cac:PartyBG-4 / BG-7
cuicac:PartyTaxScheme/cbc:CompanyIDBT-31 / BT-48
namecac:PartyLegalEntity/cbc:RegistrationNameBT-27 / BT-44
regComcac:PartyLegalEntity/cbc:CompanyID (seller)(furnizor) / cac:PartyIdentification/cbc:ID (buyer)(client)BT-30 / BT-46
legalFormcac:PartyLegalEntity/cbc:CompanyLegalFormBT-33 (seller only)(doar furnizor)
emailcbc:EndpointID withcu schemeID="EM"BT-49 (buyer only)(doar client)
contactNamecac:Contact/cbc:NameBT-41 / BT-56
contactEmailcac:Contact/cbc:ElectronicMailBT-42 / BT-58
address.linecac:PostalAddress/cbc:StreetNameBT-35 / BT-50
address.citycac:PostalAddress/cbc:CityNameBT-37 / BT-52
address.postalCodecac:PostalAddress/cbc:PostalZoneBT-38 / BT-53
address.countrySubdivisioncac:PostalAddress/cbc:CountrySubentityBT-39 / BT-54
address.countrycac:PostalAddress/cac:Country/cbc:IdentificationCodeBT-40 / BT-55
items[].namecac:Item/cbc:NameBT-153
items[].quantitycbc:InvoicedQuantity (cbc:CreditedQuantity for credit notes)(cbc:CreditedQuantity pentru note de credit)BT-129
items[].pricecac:Price/cbc:PriceAmountBT-146
items[].valuecbc:LineExtensionAmountBT-131
items[].vatRatecac:Item/cac:ClassifiedTaxCategory/cbc:PercentBT-152
items[].vatSchemecac:Item/cac:ClassifiedTaxCategory/cbc:IDBT-151
items[].vatexCodecac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:TaxExemptionReasonCodeBT-121
items[].vatexReasoncac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:TaxExemptionReasonBT-120
items[].classificationCodecac:Item/cac:CommodityClassification/cbc:ItemClassificationCodeBT-158
items[].classificationListcbc:ItemClassificationCode/@listIDBT-158-1
paymentMeansCodecac:PaymentMeans/cbc:PaymentMeansCodeBT-81
paymentIdcac:PaymentMeans/cbc:PaymentIDBT-83
ibancac:PaymentMeans/cac:PayeeFinancialAccount/cbc:IDBT-84
accountNamecac:PaymentMeans/cac:PayeeFinancialAccount/cbc:NameBT-85
biccac:PayeeFinancialAccount/cac:FinancialInstitutionBranch/cbc:IDBT-86
totalcac:LegalMonetaryTotal/cbc:TaxInclusiveAmountBT-112

vatexCode / vatexReason are emitted once per VAT category in the document VAT breakdown, not on each line (CIUS-RO). All totals and the VAT breakdown are computed by Fint from items - they are not sent.

vatexCode / vatexReason sunt emise o singură dată per categorie de TVA în detalierea TVA a documentului, nu pe fiecare linie (CIUS-RO). Toate totalurile și detalierea TVA sunt calculate de Fint din items - nu se trimit.

Reconciliation suggestionsSugestii de reconciliere

Every document returned by List documents and Get a document carries suggestedReconciliation: the bank payments that most likely settle this invoice, each with a confidence score from 1 to 100. It is the mirror of the same field on the Extrase transaction endpoints.

Fiecare document returnat de Listează documente și Obține un document conține suggestedReconciliation: plățile bancare care achită cel mai probabil această factură, fiecare cu un scor de încredere de la 1 la 100. Este oglinda aceluiași câmp de pe endpoint-urile de tranzacții Extrase.

Service access. Suggestions cross services, so the field is only populated when your company key and the company’s license carry both efactura and extrase. An efactura-only key never learns bank amounts or IBANs this way - it receives null.

Acces la serviciu. Sugestiile leagă două servicii, deci câmpul este populat doar când cheia ta de companie și licența companiei au ambele servicii, efactura și extrase. O cheie doar cu efactura nu află astfel sume bancare sau IBAN-uri - primește null.

Fint suggests, it never reconciles. A suggestion is not a statement that the invoice is paid. There is no confirmed match to read and nothing to post back - treat these as input to your own reconciliation.

Fint sugerează, nu reconciliază. O sugestie nu afirmă că factura este achitată. Nu există o potrivire confirmată de citit și nimic de trimis înapoi - tratează-le ca intrare pentru propria ta reconciliere.

ExampleExemplu

json
"suggestedReconciliation": [
  {
    "transactionUid": "Qf4x...",
    "transactionType": "incoming",
    "bookingDate": "2026-07-13 00:00:00",
    "amount": "20570.00",
    "currency": "RON",
    "interlocutor": "Client SRL",
    "interlocutorIban": "RO09PORL7789778256833565",
    "accountUid": "a1b2c3d4e5f64789a0123456789abcde",
    "accountIban": "RO49RNCB0000000000000001",
    "bankName": "BCR Bank",
    "confidence": 100
  }
]

Entry fieldsCâmpurile unei intrări

FieldCâmpDescriptionDescriere
transactionUidUID of the suggested transaction - pass it to GET /v1/extrase/transaction/{uid}.UID-ul tranzacției sugerate - trimite-l către GET /v1/extrase/transaction/{uid}.
transactionTypeDirection: incoming settles an invoice you issued, outgoing one you received.Direcția: incoming achită o factură emisă de tine, outgoing una primită.
bookingDateDate the bank booked the payment.Data la care banca a contabilizat plata.
amountPayment amount as a positive decimal string.Suma plății ca șir zecimal pozitiv.
currencyISO 4217 currency of the payment.Moneda ISO 4217 a plății.
interlocutorCounterparty name on the bank side.Numele contrapărții din partea bancară.
interlocutorIbanCounterparty IBAN, when the bank supplied it.IBAN-ul contrapărții, când banca l-a furnizat.
accountUidPublic UID of your account the payment moved through.UID-ul public al contului tău prin care a trecut plata.
accountIbanIBAN of that account.IBAN-ul acelui cont.
bankNameName of the bank that booked it.Numele băncii care a contabilizat-o.
confidenceProbability of the match, an integer from 1 to 100.Probabilitatea potrivirii, un număr întreg de la 1 la 100.

Three distinct valuesTrei valori distincte

ValueValoareMeaningSemnificație
[]No suggestion for this document.Nicio sugestie pentru acest document.
[{…}]One or more candidates, highest confidence first, capped at 5.Unul sau mai mulți candidați, cel mai încrezător primul, maximum 5.
nullNot available to this caller: your company key or the company’s license does not have the extrase service. Never confuse this with [].Indisponibil pentru acest apelant: cheia de companie sau licența companiei nu are serviciul extrase. Nu confunda niciodată acest caz cu [].

[] is a normal result, not an error. Always handle it. Note in particular that an empty array is not a statement that the invoice is unpaid - Fint reports the matches it can see, it does not track payment status.

[] este un rezultat normal, nu o eroare. Tratează-l întotdeauna. Reține în special că un array gol nu afirmă că factura este neachitată - Fint raportează potrivirile pe care le vede, nu urmărește starea plății.

Two candidates for the same invoice is normal and is not an error. Fint reports every plausible payment with its own confidence and never picks one - the gap between the scores is the signal. Suggestions are rebuilt hourly, so a document synced minutes ago may not have one yet.

Doi candidați pentru aceeași factură este normal și nu este o eroare. Fint raportează fiecare plată plauzibilă cu propriul scor și nu alege niciodată una - diferența dintre scoruri este semnalul. Sugestiile sunt recalculate orar, deci un document sincronizat acum câteva minute poate să nu aibă încă una.

API referenceReferință API

Info CUI

Look up Romanian company data by CUI (fiscal code): identity, VAT status and financial history (balance sheet). Responses are cached permanently.

Caută date despre companii românești după CUI (cod fiscal): identificare, stare TVA și istoric financiar (bilanț). Răspunsurile sunt cache-uite permanent.

Service access. The infocui service must be allowed on your company key and activated on that company’s license. Fint identifies the company from the company key, so you do not send it yourself.

Acces serviciu. Serviciul infocui trebuie permis pe cheia de companie și activat pe licența companiei. Fint identifică compania din cheia de companie, deci nu o trimiți tu.

Look up a companyCaută o companie

GET/v1/infocui

Pass the company to look up as the required cui query parameter (string or integer; RO prefix stripped, digits only); any valid Romanian CUI is allowed. Dual-key auth still applies. This is a GET endpoint and takes no request body.

Trimite compania de căutat ca parametru query obligatoriu cui (string sau întreg; prefixul RO eliminat, doar cifre); orice CUI românesc valid este permis. Autentificarea cu două chei se aplică în continuare. Este un endpoint GET și nu primește corp de cerere.

ParamParamRequiredObligatoriuDescriptionDescriere
cuiyesdaCompany to look up (RO prefix stripped, digits only)Compania de căutat (prefix RO eliminat, doar cifre)

Example requestExemplu de cerere

bash
curl -sS 'https://api.fint.ro/v1/infocui?cui=12345678' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'X-Api-Key: YOUR_COMPANY_KEY'

ResponseRăspuns

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": {
    "cui": "12345678",
    "name": "Exemplu SRL",
    "registrationNumber": "J40/1234/2010",
    "address": "Str. Exemplu 1",
    "addressFull": "Str. Exemplu 1, București, Sector 3",
    "city": "București",
    "county": "Sector 3",
    "countyCode": "B",
    "country": "România",
    "postalCode": "010101",
    "phone": null,
    "fax": null,
    "iban": null,
    "registrationStatus": "INREGISTRAT din data 01.01.2010",
    "registrationDate": "2010-01-01",
    "caenCode": "6201",
    "eInvoiceEnabled": false,
    "taxAuthority": "Administrația Finanțelor Publice",
    "legalForm": "SOCIETATE COMERCIALĂ CU RĂSPUNDERE LIMITATĂ",
    "vatRegistered": true,
    "cashVatEnabled": false,
    "financials": {
      "currency": "RON",
      "latestYear": 2024,
      "years": [
        {
          "year": 2024,
          "caenCode": "6201",
          "caenCode_label": "Cod CAEN",
          "employees": 21,
          "employees_label": "Număr mediu de salariați",
          "netTurnover": 4163901,
          "netTurnover_label": "Cifra de afaceri netă",
          "totalRevenue": 4225683,
          "totalRevenue_label": "Venituri totale",
          "totalExpenses": 3701679,
          "totalExpenses_label": "Cheltuieli totale",
          "grossProfit": 524004,
          "grossProfit_label": "Profit brut",
          "grossLoss": 0,
          "grossLoss_label": "Pierdere brută",
          "netProfit": 415548,
          "netProfit_label": "Profit net",
          "netLoss": 0,
          "netLoss_label": "Pierdere netă",
          "fixedAssets": 281078,
          "fixedAssets_label": "Active imobilizate",
          "currentAssets": 2219841,
          "currentAssets_label": "Active circulante",
          "inventory": 177271,
          "inventory_label": "Stocuri",
          "receivables": 152070,
          "receivables_label": "Creanțe",
          "cash": 1890500,
          "cash_label": "Casa și conturi la bănci",
          "prepaidExpenses": 0,
          "prepaidExpenses_label": "Cheltuieli în avans",
          "liabilities": 1608209,
          "liabilities_label": "Datorii",
          "deferredRevenue": 125715,
          "deferredRevenue_label": "Venituri în avans",
          "provisions": 0,
          "provisions_label": "Provizioane",
          "equity": 766995,
          "equity_label": "Capitaluri total",
          "paidCapital": 322,
          "paidCapital_label": "Capital subscris vărsat",
          "publicPatrimony": 0,
          "publicPatrimony_label": "Patrimoniul regiei"
        }
      ]
    }
  }
}

Response fieldsCâmpuri de răspuns

FieldCâmpDescriptionDescriere
cuiFiscal code (digits only, RO prefix stripped).Cod fiscal (doar cifre, prefixul RO eliminat).
nameRegistered company name.Denumirea înregistrată a companiei.
registrationNumberTrade register number, e.g. J40/1234/2010.Numărul de la registrul comerțului, ex. J40/1234/2010.
addressStreet address line.Adresa (stradă, număr).
addressFullFull formatted, single-line address.Adresă completă formatată, pe un singur rând.
cityCity/locality.Localitate.
countyCounty (or Bucharest sector).Județ (sau sectorul din București).
countyCodeCounty code, e.g. B for Bucharest.Codul județului, ex. B pentru București.
countryCountry name.Numele țării.
postalCodePostal code, when available.Cod poștal, când este disponibil.
phonePhone number, or null.Număr de telefon, sau null.
faxFax number, or null.Număr de fax, sau null.
ibanTreasury IBAN, or null.IBAN de trezorerie, sau null.
registrationStatusRegistration status text from ANAF.Textul statusului de înregistrare de la ANAF.
registrationDateRegistration date, YYYY-MM-DD.Data înregistrării, YYYY-MM-DD.
caenCodePrimary CAEN activity code.Codul CAEN principal de activitate.
eInvoiceEnabledtrue if registered in the ANAF RO e-Factura register.true dacă este înregistrată în registrul ANAF RO e-Factura.
taxAuthorityAdministering tax authority.Administrația financiară competentă.
legalFormLegal form of the company.Forma juridică a companiei.
vatRegisteredtrue if registered for VAT (TVA).true dacă este înregistrată în scopuri de TVA.
cashVatEnabledtrue if on the VAT-on-collection (TVA la încasare) scheme.true dacă aplică TVA la încasare.
financialsBalance-sheet history object; null is never returned - see the fields below.Obiect cu istoricul bilanțier; nu se returnează niciodată null - vezi câmpurile de mai jos.
financials.currencyCurrency of the amounts (RON).Moneda sumelor (RON).
financials.latestYearMost recent reported year, or null when no balance sheet is filed.Cel mai recent an raportat, sau null când nu există bilanț depus.
financials.years[]Per-year balance-sheet entries, newest first (typically from 2013 onward); empty when none filed.Intrări bilanțiere pe an, de la cel mai recent (de regulă din 2013); gol când nu există.
financials.years[].yearReporting year.Anul de raportare.
financials.years[].employeesAverage headcount for the year.Numărul mediu de salariați pentru an.
financials.years[] metricsmetrici financials.years[]Whole-RON integer amounts: netTurnover, totalRevenue, totalExpenses, grossProfit, grossLoss, netProfit, netLoss, fixedAssets, currentAssets, inventory, receivables, cash, prepaidExpenses, liabilities, deferredRevenue, provisions, equity, paidCapital, publicPatrimony, plus caenCode. Each metric has a sibling <field>_label - see the Financials note below.Sume întregi în RON: netTurnover, totalRevenue, totalExpenses, grossProfit, grossLoss, netProfit, netLoss, fixedAssets, currentAssets, inventory, receivables, cash, prepaidExpenses, liabilities, deferredRevenue, provisions, equity, paidCapital, publicPatrimony, plus caenCode. Fiecare metrică are un câmp pereche <field>_label - vezi nota Date financiare de mai jos.

Financials. The financials object carries the company’s balance-sheet history from ANAF filings: currency, latestYear and years (newest first, typically from 2013 onward). Amounts are whole-RON integers; employees is the average headcount. Every field except year has a sibling <field>_label with the official ANAF Romanian term (e.g. netTurnover_label = Cifra de afaceri netă). A company with no filed balance sheet returns an empty years array with latestYear null. Financials are included in the same request at no extra cost.

Date financiare. Obiectul financials conține istoricul bilanțier al companiei din declarațiile ANAF: currency, latestYear și years (de la cel mai recent, de regulă din 2013). Sumele sunt numere întregi în RON; employees este numărul mediu de salariați. Fiecare câmp în afară de year are un câmp pereche <field>_label cu termenul oficial ANAF în română (ex. netTurnover_label = Cifra de afaceri netă). O companie fără bilanț depus returnează un array years gol, cu latestYear null. Datele financiare sunt incluse în aceeași cerere, fără cost suplimentar.

ErrorsErori

HTTPreasonWhenCând
405method_not_allowed_getWrong HTTP method (must be GET)Metodă HTTP greșită (trebuie GET)
400missing_cuiNo cui query parameterLipsește parametrul query cui
400invalid_cuicui is not a valid Romanian fiscal codecui nu este un cod fiscal românesc valid
404company_not_foundNo company found for that cuiNicio companie găsită pentru acel cui

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

API referenceReferință API

Schimb valutar

Official Romanian reference exchange rates for RON to foreign currency pairs.

Cursuri oficiale românești de referință pentru perechi RON cu valute străine.

Service access. The schimbvalutar service must be allowed on your company key and activated on that company’s license. Fint identifies the company from the company key, so you do not send it yourself.

Acces serviciu. Serviciul schimbvalutar trebuie permis pe cheia de companie și activat pe licența companiei. Fint identifică compania din cheia de companie, deci nu o trimiți tu.

Get a rateObține un curs

GET/v1/schimbvalutar

Returns the official RON exchange rate for a currency pair. Omit date for the latest publication, or pass it to request a specific calendar date (historical rate). This is a GET endpoint and takes no request body; pass parameters in the query string.

Returnează cursul oficial RON pentru o pereche de valute. Omite date pentru ultima publicare, sau trimite-l pentru a solicita o dată calendaristică specifică (curs istoric). Este un endpoint GET și nu primește corp de cerere; trimite parametrii în query string.

ParamParamRequiredObligatoriuDescriptionDescriere
fromyesdaMust be RONTrebuie să fie RON
toyesdaTarget ISO 4217 code (e.g. EUR, USD)Cod țintă ISO 4217 (ex. EUR, USD)
datenonuCalendar date YYYY-MM-DD; omit for latest publication, pass for a historical rateDată calendaristică YYYY-MM-DD; omite pentru ultima publicare, trimite pentru un curs istoric

Example requestExemplu de cerere

bash
curl -sS 'https://api.fint.ro/v1/schimbvalutar?from=RON&to=EUR' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'X-Api-Key: YOUR_COMPANY_KEY'

Example request (historical)Exemplu de cerere (istoric)

bash
curl -sS 'https://api.fint.ro/v1/schimbvalutar?from=RON&to=USD&date=2025-01-15' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'X-Api-Key: YOUR_COMPANY_KEY'

ResponseRăspuns

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": {
    "from": "RON",
    "to": "EUR",
    "date": "2026-05-20",
    "rate": 4.9756,
    "multiplier": 1,
    "source": "bnr",
    "publishedDate": "2026-05-20"
  }
}

Response fieldsCâmpuri de răspuns

FieldCâmpDescriptionDescriere
fromBase currency; always RON.Moneda de bază; întotdeauna RON.
toTarget currency (ISO 4217), echoed from the request.Moneda țintă (ISO 4217), reluată din cerere.
datePublication date actually used, YYYY-MM-DD (may fall back to an earlier banking day).Data publicării efectiv folosită, YYYY-MM-DD (poate reveni la o zi bancară anterioară).
rateExchange rate as a JSON number: RON per 1 unit of to (the official multiplier is already applied).Cursul ca număr JSON: RON per 1 unitate din to (multiplicatorul oficial este deja aplicat).
multiplierOfficial multiplier for the pair (e.g. 100 for some currencies); already folded into rate.Multiplicatorul oficial al perechii (ex. 100 pentru unele valute); deja inclus în rate.
sourceRate source, e.g. bnr (Banca Națională a României).Sursa cursului, ex. bnr (Banca Națională a României).
publishedDateDate the source published the rate (same as date).Data la care sursa a publicat cursul (aceeași cu date).

rate is RON per 1 unit of to (the official multiplier is already applied).

rate este RON per 1 unitate din to (multiplicatorul oficial este deja aplicat).

The response date / publishedDate is the publication date actually used. On weekends, holidays, or before the daily update (~13:00), this may be earlier than the date you requested (previous banking day fallback). Future dates return 400 future_date.

date / publishedDate din răspuns este data publicării efectiv folosită. În weekend, sărbători sau înainte de actualizarea zilnică (~13:00), poate fi anterioară datei cerute (fallback la ziua bancară anterioară). Datele viitoare returnează 400 future_date.

ErrorsErori

HTTPreasonWhenCând
405method_not_allowed_getWrong HTTP method (must be GET)Metodă HTTP greșită (trebuie GET)
400missing_from / invalid_fromfrom is missing or not RONfrom lipsește sau nu este RON
400missing_to / invalid_toto is missing or not a 3-letter ISO 4217 codeto lipsește sau nu este un cod ISO 4217 de 3 litere
400invalid_datedate is not a valid YYYY-MM-DD datedate nu este o dată validă YYYY-MM-DD
400future_datedate is in the futuredate este în viitor
404rate_not_foundUnknown currency, or historical date before available dataValută necunoscută, sau dată istorică înainte de datele disponibile
429limit_exceededUsage at/over plan limit for the schimbvalutar serviceUtilizare la/peste limita planului pentru serviciul schimbvalutar
502provider_errorUpstream rate source failureEroare la sursa de cursuri

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

API referenceReferință API

Organization APIAPI Organizație

Manage companies, activate services, and create API keys at the organization level - using your organization key only.

Gestionează companii, activează servicii și creează chei API la nivel de organizație - folosind doar cheia de organizație.

Enterprise only. These endpoints are available exclusively on the Enterprise plan. Non-Enterprise organizations receive 403 enterprise_required on every request.

Doar Enterprise. Aceste endpoint-uri sunt disponibile exclusiv pe planul Enterprise. Organizațiile non-Enterprise primesc 403 enterprise_required la fiecare cerere.

Authentication exception. Send only X-Org-Key - no company key (X-Api-Key / Bearer) is used. All operations are automatically scoped to your organization.

Excepție de autentificare. Trimite doar X-Org-Key - nu se folosește cheie de companie (X-Api-Key / Bearer). Toate operațiile sunt automat limitate la organizația ta.

List companiesListare companii

GET/v1/organization/companies/list

Returns all active companies in the organization, including each company's currently active services. This is a GET endpoint and takes no request body.

Returnează toate companiile active din organizație, inclusiv serviciile active ale fiecărei companii. Este un endpoint GET și nu primește corp de cerere.

Example requestExemplu de cerere

bash
curl -sS 'https://api.fint.ro/v1/organization/companies/list' \
  -H 'X-Org-Key: YOUR_ORG_KEY'

ResponseRăspuns

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": [
    {
      "uid": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4",
      "name": "Acme SRL",
      "cui": "12345678",
      "status": "enabled",
      "activeServices": [
        "efactura",
        "extrase"
      ]
    }
  ]
}

Response fieldsCâmpuri de răspuns

FieldCâmpDescriptionDescriere
data[]Array of company objects (all active companies in the organization).Array de obiecte companie (toate companiile active din organizație).
data[].uidCompany UID; use it in the companies/{uid}/... endpoints.UID-ul companiei; folosește-l în endpoint-urile companies/{uid}/....
data[].nameCompany display name.Numele companiei.
data[].cuiCompany fiscal code.Codul fiscal al companiei.
data[].statusCompany state, e.g. enabled.Starea companiei, ex. enabled.
data[].activeServices[]Service keys currently active on the company (efactura, extrase, infocui, schimbvalutar).Cheile de serviciu active pe companie (efactura, extrase, infocui, schimbvalutar).

ErrorsErori

HTTPreasonWhenCând
405method_not_allowed_getWrong HTTP method (must be GET)Metodă HTTP greșită (trebuie GET)

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

Create a companyCreare companie

POST/v1/organization/companies/create

Creates a new company under the organization. The CUI (2-10 digits; optional RO prefix) must be unique within the organization.

Creează o nouă companie în organizație. CUI-ul (2-10 cifre; prefix RO opțional) trebuie să fie unic în organizație.

FieldCâmpRequiredObligatoriuDescriptionDescriere
nameyesdaCompany display nameNumele companiei
cuiyesdaRomanian tax id; unique in your orgCUI românesc; unic în organizație

Example requestExemplu de cerere

bash
curl -sS -X POST 'https://api.fint.ro/v1/organization/companies/create' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"name":"Acme SRL","cui":"12345678"}'

Response (201)Răspuns (201)

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": {
    "uid": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4",
    "name": "Acme SRL",
    "cui": "12345678"
  }
}

Response fieldsCâmpuri de răspuns

FieldCâmpDescriptionDescriere
uidUID of the newly created company; use it in the companies/{uid}/... endpoints.UID-ul companiei nou create; folosește-l în endpoint-urile companies/{uid}/....
nameCompany display name (echoed from the request).Numele companiei (reluat din cerere).
cuiCompany fiscal code, normalized to digits only.Codul fiscal al companiei, normalizat la doar cifre.

ErrorsErori

HTTPreasonWhenCând
405method_not_allowedWrong HTTP method (must be POST)Metodă HTTP greșită (trebuie POST)
400invalid_jsonRequest body is not valid JSONCorpul cererii nu este JSON valid
400missing_nameNo nameLipsește name
400missing_cuiNo cuiLipsește cui
400invalid_cuicui is not 2-10 digits (optional RO prefix)cui nu are 2-10 cifre (prefix RO opțional)
409duplicate_cuicui already exists in this organizationcui există deja în această organizație
500company_create_failedCould not create the companyNu s-a putut crea compania

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

List available servicesListare servicii disponibile

GET/v1/organization/services/list

Returns the service keys that can be activated on a company and used as API key scopes. This is a GET endpoint and takes no request body.

Returnează cheile de serviciu care pot fi activate pe o companie și folosite ca domeniu pentru cheile API. Este un endpoint GET și nu primește corp de cerere.

ResponseRăspuns

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": [
    {
      "key": "efactura",
      "label": "eFactura"
    },
    {
      "key": "extrase",
      "label": "Extrase"
    },
    {
      "key": "infocui",
      "label": "Info CUI"
    },
    {
      "key": "schimbvalutar",
      "label": "Schimb valutar"
    }
  ]
}

Response fieldsCâmpuri de răspuns

FieldCâmpDescriptionDescriere
data[]Array of available service objects.Array de obiecte serviciu disponibile.
data[].keyService key used when activating a service or scoping an API key (efactura, extrase, infocui, schimbvalutar).Cheia de serviciu folosită la activarea unui serviciu sau la limitarea unei chei API (efactura, extrase, infocui, schimbvalutar).
data[].labelHuman-readable service name.Numele lizibil al serviciului.

ErrorsErori

HTTPreasonWhenCând
405method_not_allowed_getWrong HTTP method (must be GET)Metodă HTTP greșită (trebuie GET)

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

Activate a serviceActivare serviciu

POST/v1/organization/companies/{uid}/services/activate

Activates a single service for a company. A company must have a service active before API keys can call it. Use the uid from companies/list. The action is in the URL, so the body only carries the service.

Activează un singur serviciu pentru o companie. O companie trebuie să aibă serviciul activ înainte ca cheile API să-l poată apela. Folosește uid-ul din companies/list. Acțiunea este în URL, deci corpul conține doar serviciul.

FieldCâmpLocationLocațieRequiredObligatoriuDescriptionDescriere
uidpathcaleyesdaCompany UID, from companies/listUID-ul companiei, din companies/list
servicebodycorpyesdaService key: efactura, extrase, infocui, schimbvalutarCheie serviciu: efactura, extrase, infocui, schimbvalutar

Example requestExemplu de cerere

bash
curl -sS -X POST 'https://api.fint.ro/v1/organization/companies/a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4/services/activate' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"service":"efactura"}'

ResponseRăspuns

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": {
    "companyUid": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4",
    "service": "efactura",
    "active": true
  }
}

Response fieldsCâmpuri de răspuns

FieldCâmpDescriptionDescriere
companyUidUID of the affected company.UID-ul companiei afectate.
serviceService key that was activated.Cheia de serviciu care a fost activată.
activetrue after a successful activation.true după activarea reușită.

ErrorsErori

HTTPreasonWhenCând
405method_not_allowedWrong HTTP method (must be POST)Metodă HTTP greșită (trebuie POST)
400invalid_jsonRequest body is not valid JSONCorpul cererii nu este JSON valid
404company_not_founduid not found in your organizationuid nu a fost găsit în organizația ta
400missing_serviceNo serviceLipsește service
400invalid_serviceservice is not a recognized service keyservice nu este o cheie de serviciu recunoscută
409service_already_activeService is already active on this companyServiciul este deja activ pe această companie
500service_update_failedCould not activate the serviceNu s-a putut activa serviciul

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

Deactivate a serviceDezactivare serviciu

POST/v1/organization/companies/{uid}/services/deactivate

Deactivates a single service for a company (removes its service plan). Use the uid from companies/list. The body carries only the service.

Dezactivează un singur serviciu pentru o companie (îi elimină planul de serviciu). Folosește uid-ul din companies/list. Corpul conține doar serviciul.

FieldCâmpLocationLocațieRequiredObligatoriuDescriptionDescriere
uidpathcaleyesdaCompany UID, from companies/listUID-ul companiei, din companies/list
servicebodycorpyesdaService key: efactura, extrase, infocui, schimbvalutarCheie serviciu: efactura, extrase, infocui, schimbvalutar

Example requestExemplu de cerere

bash
curl -sS -X POST 'https://api.fint.ro/v1/organization/companies/a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4/services/deactivate' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"service":"efactura"}'

ResponseRăspuns

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": {
    "companyUid": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4",
    "service": "efactura",
    "active": false
  }
}

Response fieldsCâmpuri de răspuns

FieldCâmpDescriptionDescriere
companyUidUID of the affected company.UID-ul companiei afectate.
serviceService key that was deactivated.Cheia de serviciu care a fost dezactivată.
activefalse after a successful deactivation.false după dezactivarea reușită.

ErrorsErori

HTTPreasonWhenCând
405method_not_allowedWrong HTTP method (must be POST)Metodă HTTP greșită (trebuie POST)
400invalid_jsonRequest body is not valid JSONCorpul cererii nu este JSON valid
404company_not_founduid not found in your organizationuid nu a fost găsit în organizația ta
400missing_serviceNo serviceLipsește service
400invalid_serviceservice is not a recognized service keyservice nu este o cheie de serviciu recunoscută
409service_not_activeService is not currently active on this companyServiciul nu este momentan activ pe această companie
500service_update_failedCould not deactivate the serviceNu s-a putut dezactiva serviciul

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

Create a company API keyCreare cheie API pentru companie

POST/v1/organization/companies/{uid}/apikeys/create

Creates a company API key scoped to the given services. Use the uid from companies/list. The plaintext key is returned only once - store it securely. Use the returned key as X-Api-Key on service endpoints together with X-Org-Key.

Creează o cheie API pentru companie, limitată la serviciile indicate. Folosește uid-ul din companies/list. Cheia în clar este returnată o singură dată - stocheaz-o în siguranță. Folosește cheia returnată ca X-Api-Key pe endpoint-urile de servicii împreună cu X-Org-Key.

FieldCâmpLocationLocațieRequiredObligatoriuDescriptionDescriere
uidpathcaleyesdaCompany UID, from companies/listUID-ul companiei, din companies/list
namebodycorpyesdaHuman-readable label for the keyEtichetă lizibilă pentru cheie
servicesbodycorpyesdaArray of service keys the key may call (at least one)Array de chei de serviciu pe care le poate apela (cel puțin una)

Example requestExemplu de cerere

bash
curl -sS -X POST 'https://api.fint.ro/v1/organization/companies/a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4/apikeys/create' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"name":"My integration","services":["efactura","infocui"]}'

Response (201)Răspuns (201)

json
{
  "status": "success",
  "msg": "Store this key securely - it will not be shown again.",
  "reason": null,
  "data": {
    "id": 7,
    "companyUid": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4",
    "name": "My integration",
    "apiKey": "key_live_Ab3...48chars",
    "services": [
      "efactura",
      "infocui"
    ]
  }
}

Response fieldsCâmpuri de răspuns

FieldCâmpDescriptionDescriere
idNumeric identifier of the created key.Identificatorul numeric al cheii create.
companyUidUID of the company the key belongs to.UID-ul companiei de care aparține cheia.
nameHuman-readable label (echoed from the request).Eticheta lizibilă (reluată din cerere).
apiKeyThe plaintext company API key. Returned only once - store it securely and send it as X-Api-Key.Cheia API a companiei în clar. Returnată o singură dată - stocheaz-o în siguranță și trimite-o ca X-Api-Key.
services[]Service keys the API key is scoped to.Cheile de serviciu la care este limitată cheia API.

ErrorsErori

HTTPreasonWhenCând
405method_not_allowedWrong HTTP method (must be POST)Metodă HTTP greșită (trebuie POST)
400invalid_jsonRequest body is not valid JSONCorpul cererii nu este JSON valid
404company_not_founduid not found in your organizationuid nu a fost găsit în organizația ta
400missing_nameNo nameLipsește name
400missing_servicesservices is missing or emptyservices lipsește sau este gol
400invalid_serviceOne of the entries in services is not a recognized service keyUna dintre intrările din services nu este o cheie de serviciu recunoscută
500api_key_create_failedCould not create the API keyNu s-a putut crea cheia API

Also see Authentication errors for key, auth and base rate-limit failures.

Vezi și Erori de autentificare pentru erori de cheie, autentificare și limitare de bază a ratei.

API referenceReferință API

SandboxSandbox

Build and test your integration against https://sandbox.fint.ro - a fully mocked copy of the Fint API that mirrors the live request and response shapes but never touches real providers or real company data.

Construiește și testează integrarea pe https://sandbox.fint.ro - o copie complet simulată a API-ului Fint, care reproduce structura cererilor și răspunsurilor reale, dar nu atinge niciodată furnizorii reali sau date reale de companie.

Safe to test. Sandbox responses are hardcoded mock data. No documents are sent to ANAF, no banks are contacted, nothing is stored, no billing limits apply, and calls are not logged. Use it to validate your HTTP client, auth headers, and response parsing before going live.

Sigur pentru testare. Răspunsurile sandbox sunt date simulate, codate fix. Niciun document nu ajunge la ANAF, nicio bancă nu este contactată, nimic nu este stocat, nu se aplică limite de facturare, iar apelurile nu sunt înregistrate. Folosește-l pentru a valida clientul HTTP, headerele de autentificare și parsarea răspunsurilor înainte de a trece pe producție.

How it worksCum funcționează

The sandbox is served from a separate host, sandbox.fint.ro, and exposes the same service endpoints as the live API (Extrase, eFactura, Info CUI, Schimb valutar) under the /v1 prefix. Every endpoint returns deterministic mock data, so the same request always yields the same response. Request methods, query parameters, the { status, msg, reason, data } envelope, and reason error codes all match the live API - only the host and the API keys differ.

Sandbox-ul este servit de pe un host separat, sandbox.fint.ro, și expune aceleași endpoint-uri ca API-ul live (Extrase, eFactura, Info CUI, Schimb valutar) sub prefixul /v1. Fiecare endpoint returnează date simulate deterministe, deci aceeași cerere produce mereu același răspuns. Metodele cererilor, parametrii din query, plicul { status, msg, reason, data } și codurile de eroare reason sunt identice cu API-ul live - diferă doar hostul și cheile API.

Differences from the live APIDiferențe față de API-ul live

AspectAspectLive APIAPI liveSandboxSandbox
Base URLURL de bazăhttps://api.fint.rohttps://sandbox.fint.ro
KeysCheiorg_live_* + key_live_*org_sandbox_* + key_sandbox_*
ProvidersFurnizoriReal upstream providersFurnizori realiNone - all data is mockedNiciunul - toate datele sunt simulate
DataDateYour real company dataDatele reale ale companiei taleFixed mock data, not persistedDate simulate fixe, nestocate
Billing / limitsFacturare / limite429 limit_exceeded may applyse poate aplicaNot enforcedNeaplicate
Request loggingÎnregistrare cereriLoggedÎnregistrateNot loggedNeînregistrate
Organization APIAPI OrganizațieAvailableDisponibilNot availableIndisponibil

AuthenticationAutentificare

Sandbox uses the same dual-key authentication as the live API, with one rule: both keys must carry the sandbox prefix. Live keys are rejected with invalid_org_api_key / invalid_api_key, and both keys must belong to the same organization.

Sandbox folosește aceeași autentificare cu două chei ca API-ul live, cu o regulă: ambele chei trebuie să aibă prefixul sandbox. Cheile live sunt respinse cu invalid_org_api_key / invalid_api_key, iar ambele chei trebuie să aparțină aceleiași organizații.

HeaderValueValoare
X-Org-KeyOrganization sandbox key (org_sandbox_…)Cheia sandbox de organizație (org_sandbox_…)
X-Api-KeyCompany sandbox key (key_sandbox_…)Cheia sandbox de companie (key_sandbox_…)

The company key may instead be sent as Authorization: Bearer key_sandbox_….

Cheia de companie poate fi trimisă alternativ ca Authorization: Bearer key_sandbox_….

bash
curl -sS 'https://sandbox.fint.ro/v1/extrase/accounts' \
  -H 'X-Org-Key: org_sandbox_…' \
  -H 'X-Api-Key: key_sandbox_…'

Obtaining sandbox keysObținerea cheilor sandbox

Generate a sandbox key pair from the same pages as live keys, using the dedicated Cheie sandbox button. Each key is created once and is idempotent - returning to the page shows the same key. Sandbox keys are hidden from the live key list.

Generează o pereche de chei sandbox din aceleași pagini ca cele live, folosind butonul dedicat Cheie sandbox. Fiecare cheie este creată o singură dată și este idempotentă - la revenirea pe pagină apare aceeași cheie. Cheile sandbox nu apar în lista cheilor live.

KeyCheieWhereUndeNotesNote
OrganizationOrganizație (org_sandbox_)Header → API → Chei APICheie sandboxGenerează cheie sandboxHeader → API → Chei APICheie sandboxGenerează cheie sandboxOne per organization.Una per organizație.
CompanyCompanie (key_sandbox_)Configurare → Chei APICheie sandboxGenerează cheie sandboxConfigurare → Chei APICheie sandboxGenerează cheie sandboxOne per active company; automatically scoped to all four services.Una per companie activă; include automat toate cele patru servicii.

Reconciliation suggestionsSugestii de reconciliere

Sandbox transactions and documents carry suggestedReconciliation exactly as the live API does - see Extrase and eFactura for the field reference. The fixtures are deterministic, so the same uid always returns the same suggestions.

Tranzacțiile și documentele din sandbox conțin suggestedReconciliation exact ca API-ul live - vezi Extrase și eFactura pentru referința câmpului. Fixture-urile sunt deterministe, deci același uid returnează mereu aceleași sugestii.

The fixtures cover all three states on purpose. Some rows return [], some return one suggestion, and some return two - so you can exercise every branch of your client without hunting for test data.

Fixture-urile acoperă intenționat toate cele trei stări. Unele rânduri returnează [], altele o sugestie, iar altele două - ca să poți exersa fiecare ramură a clientului tău fără să cauți date de test.

The rows that return two suggestions are the important ones to render: both entries share the same amount but carry clearly different confidences (97 and 47). This is the ambiguous case - two invoices to the same client with the same total - and Fint deliberately reports both rather than picking one. Make sure your UI or matching logic handles it.

Rândurile care returnează două sugestii sunt cele importante de randat: ambele intrări au aceeași sumă, dar scoruri de încredere clar diferite (97 și 47). Acesta este cazul ambiguu - două facturi către același client cu același total - iar Fint raportează intenționat ambele, fără să aleagă una. Asigură-te că interfața sau logica ta de potrivire îl tratează.

Sandbox keys are scoped to all services, so suggestedReconciliation is never null here. To exercise the null branch - a key without the other service - use a scoped key on the live API.

Cheile de sandbox au acces la toate serviciile, deci suggestedReconciliation nu este niciodată null aici. Pentru a exersa ramura null - o cheie fără celălalt serviciu - folosește o cheie restrânsă pe API-ul live.

Extrase

Mocks 4 bank accounts (BCR RON, BCR EUR, ING RON, CEC RON), 50 transactions, and 3 bank consents (BCR and ING enabled; CEC disabled/expired). Field and parameter reference is identical to the production Extrase page - only the host and key prefixes differ.

Simulează 4 conturi bancare (BCR RON, BCR EUR, ING RON, CEC RON), 50 de tranzacții și 3 consimțăminte bancare (BCR și ING active; CEC inactiv/expirat). Referința câmpurilor și parametrilor este identică cu pagina de producție Extrase - diferă doar hostul și prefixele cheilor.

Create onboarding linkCreare link de onboarding

POST/v1/extrase/onboarding

Example requestExemplu de cerere

bash
curl -sS -X POST 'https://sandbox.fint.ro/v1/extrase/onboarding' \
  -H 'X-Org-Key: org_sandbox_…' \
  -H 'X-Api-Key: key_sandbox_…' \
  -H 'Content-Type: application/json' \
  -d '{}'

ResponseRăspuns

json
{
  "status": "success",
  "data": {
    "authLink": "https://sandbox.fint.ro/consent/extrase",
    "expiresOn": "2026-07-06 09:00:00"
  }
}

The authLink opens a mock consent landing page (see Consent pages) - no bank OAuth occurs.

Linkul authLink deschide o pagină de consimțământ simulată (vezi Pagini de consimțământ) - nu are loc niciun OAuth bancar.

Response fieldsCâmpuri de răspuns

Identical to the production Extrase POST /v1/extrase/onboarding response - see its Response fields.

Identice cu răspunsul POST /v1/extrase/onboarding de pe pagina de producție Extrase - vezi Câmpuri de răspuns.

Check consentsVerificare consimțăminte

GET/v1/extrase/consents

ResponseRăspuns

json
{
  "status": "success",
  "data": {
    "consents": [
      {
        "bankCode": "BCR",
        "bankName": "BCR Bank",
        "consentStatus": "enabled",
        "validUntil": "2026-12-26",
        "updatedOn": "2026-06-26 09:00:00"
      },
      {
        "bankCode": "ING",
        "bankName": "ING Bank",
        "consentStatus": "enabled",
        "validUntil": "2026-12-26",
        "updatedOn": "2026-06-26 09:00:00"
      },
      {
        "bankCode": "CEC",
        "bankName": "CEC Bank SA",
        "consentStatus": "disabled",
        "validUntil": "2026-06-19",
        "updatedOn": "2026-03-21 09:00:00"
      }
    ],
    "total": 3
  }
}

Response fieldsCâmpuri de răspuns

Identical to the production Extrase GET /v1/extrase/consents response - see its Response fields.

Identice cu răspunsul GET /v1/extrase/consents de pe pagina de producție Extrase - vezi Câmpuri de răspuns.

List accountsListare conturi

GET/v1/extrase/accounts

Example requestExemplu de cerere

bash
curl -sS 'https://sandbox.fint.ro/v1/extrase/accounts' \
  -H 'X-Org-Key: org_sandbox_…' \
  -H 'X-Api-Key: key_sandbox_…'

Response (first of 4 accounts)Răspuns (primul din 4 conturi)

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": {
    "accounts": [
      {
        "uid": "bcrron0000000000000000000000acc1",
        "status": "enabled",
        "iban": "RO49RNCB0000000000000001",
        "currency": "RON",
        "balance": "15230.45",
        "name": "Cont curent RON",
        "ownerName": "Sandbox Test SRL",
        "product": "Cont curent",
        "cashAccountType": "CACC",
        "bic": "RNCBROBU",
        "bank": {
          "code": "BCR",
          "name": "BCR Bank",
          "bic": "RNCBROBU",
          "icon": "https://cdn.fint.ro/image/bank/icon/bcr.png"
        },
        "consentStatus": "enabled",
        "consentValidUntil": "2026-12-26",
        "lastTransactionsSync": "2026-06-29 07:00:00",
        "createdOn": "2026-06-29 09:00:00",
        "updatedOn": "2026-06-29 09:00:00"
      }
    ],
    "total": 4
  }
}

The CEC RON account is returned too, but with consentStatus: disabled and an expired consentValidUntil.

Contul CEC RON este returnat și el, dar cu consentStatus: disabled și un consentValidUntil expirat.

Response fieldsCâmpuri de răspuns

Identical to the production Extrase GET /v1/extrase/accounts response - see its Response fields.

Identice cu răspunsul GET /v1/extrase/accounts de pe pagina de producție Extrase - vezi Câmpuri de răspuns.

List transactionsListare tranzacții

GET/v1/extrase/transactions

Supports the same query parameters as live: limit, offset, type, accountUid, from, to, q. Transactions belong only to the three enabled accounts (the disabled CEC account returns none).

Acceptă aceiași parametri de query ca live: limit, offset, type, accountUid, from, to, q. Tranzacțiile aparțin doar celor trei conturi active (contul CEC inactiv nu returnează niciuna).

Example requestExemplu de cerere

bash
curl -sS 'https://sandbox.fint.ro/v1/extrase/transactions?limit=50&offset=0' \
  -H 'X-Org-Key: org_sandbox_…' \
  -H 'X-Api-Key: key_sandbox_…'

ResponseRăspuns

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": {
    "transactions": [
      {
        "uid": "txn00000000000000000000000000001",
        "type": "outgoing",
        "bookingDate": "2026-06-28",
        "interlocutor": "Enel Energie SA",
        "interlocutorIban": "RO55BACX0000000000000555",
        "amount": "-73.30",
        "currency": "RON",
        "fintDescription": "Factura energie electrica",
        "rawDescription": "Factura energie electrica / ref 1",
        "category": "utilities",
        "createdOn": "2026-06-28 09:00:00",
        "accountUid": "bcrron0000000000000000000000acc1",
        "accountIban": "RO49RNCB0000000000000001",
        "accountName": "Cont curent RON",
        "bank": {
          "code": "BCR",
          "name": "BCR Bank",
          "bic": "RNCBROBU",
          "icon": "https://cdn.fint.ro/image/bank/icon/bcr.png"
        },
        "executionDateTime": "2026-06-28 09:00:00",
        "entryReference": "ENTRY-000001",
        "endToEndId": "E2E-000001",
        "transactionStatus": "BOOK",
        "additionalInformation": "Factura energie electrica / ref 1",
        "merchantName": "Enel Energie SA",
        "creditorName": "Enel Energie SA",
        "creditorAccountIban": "RO55BACX0000000000000555",
        "debtorName": "Cont curent RON",
        "debtorAccountIban": "RO49RNCB0000000000000001",
        "userNote": ""
      }
    ],
    "total": 50,
    "limit": 50,
    "offset": 0
  }
}

Response fieldsCâmpuri de răspuns

Identical to the production Extrase GET /v1/extrase/transactions response - see its Response fields.

Identice cu răspunsul GET /v1/extrase/transactions de pe pagina de producție Extrase - vezi Câmpuri de răspuns.

Get a transactionObținere tranzacție

GET/v1/extrase/transaction/{uid}

Use a uid from the list above (e.g. txn00000000000000000000000000001). The detail response returns the same per-transaction structure as the list above - including provider fields such as executionDateTime, entryReference and endToEndId.

Folosește un uid din lista de mai sus (ex. txn00000000000000000000000000001). Răspunsul detaliat returnează aceeași structură per tranzacție ca lista de mai sus - inclusiv câmpuri de la furnizor precum executionDateTime, entryReference și endToEndId.

bash
curl -sS 'https://sandbox.fint.ro/v1/extrase/transaction/txn00000000000000000000000000001' \
  -H 'X-Org-Key: org_sandbox_…' \
  -H 'X-Api-Key: key_sandbox_…'

Response fieldsCâmpuri de răspuns

Identical to the production Extrase GET /v1/extrase/transaction/{uid} response - see its Response fields.

Identice cu răspunsul GET /v1/extrase/transaction/{uid} de pe pagina de producție Extrase - vezi Câmpuri de răspuns.

ErrorsErori

The reason codes match the live API. Authentication errors are the same as Authentication, except both keys must carry the sandbox prefix. 429 limit_exceeded is never returned - limits are not enforced in sandbox.

Codurile reason corespund API-ului live. Erorile de autentificare sunt aceleași ca la Autentificare, cu excepția că ambele chei trebuie să aibă prefixul sandbox. 429 limit_exceeded nu este returnat niciodată - limitele nu sunt aplicate în sandbox.

HTTPreasonWhenCând
405method_not_allowed_getWrong HTTP method (must be GET)Metodă HTTP greșită (trebuie GET)
400invalid_uid/transaction/{uid} - malformed uid/transaction/{uid} - uid malformat
400invalid_type, invalid_account_uid, invalid_date, invalid_date_range, invalid_search/transactions - malformed query parameter/transactions - parametru query malformat
404not_foundUnknown uid or accountUiduid sau accountUid necunoscut

eFactura

Mocks 50 documents (30 outgoing, 20 incoming, including two type 381 credit notes). Document uids are production-shaped with a sandbox_ prefix (^sandbox_[A-Za-z0-9]{32}$) and are deterministic. The request-body field reference is documented under the production eFactura page’s Send a document endpoint and applies here unchanged.

Simulează 50 de documente (30 emise, 20 primite, inclusiv două note de creditare tip 381). Uid-urile documentelor au forma de producție cu prefix sandbox_ (^sandbox_[A-Za-z0-9]{32}$) și sunt deterministe. Referința câmpurilor din corpul cererii este documentată la endpoint-ul Trimitere document din pagina de producție eFactura și se aplică aici neschimbată.

Create onboarding linkCreare link de onboarding

POST/v1/efactura/onboarding

ResponseRăspuns

json
{
  "status": "success",
  "data": {
    "authLink": "https://sandbox.fint.ro/consent/efactura",
    "expiresOn": "2026-07-06 09:00:00"
  }
}

Response fieldsCâmpuri de răspuns

Identical to the production eFactura POST /v1/efactura/onboarding response - see its Response fields.

Identice cu răspunsul POST /v1/efactura/onboarding de pe pagina de producție eFactura - vezi Câmpuri de răspuns.

GET/v1/efactura/consent

ResponseRăspuns

json
{
  "status": "success",
  "data": {
    "consentStatus": "enabled",
    "validUntil": "2026-12-26",
    "updatedOn": "2026-06-26 09:00:00"
  }
}

Response fieldsCâmpuri de răspuns

Identical to the production eFactura GET /v1/efactura/consent response - see its Response fields.

Identice cu răspunsul GET /v1/efactura/consent de pe pagina de producție eFactura - vezi Câmpuri de răspuns.

Send a documentTrimitere document

POST/v1/efactura/send

Validates the document structure with the same rules as the live API - required fields, party/address shape, the from.cui / consent match, and the vatScheme / vatRate coupling (see the request body fields on the production eFactura page). On success it returns 201 with the uid of the first mock outgoing pending document - you can immediately fetch it with GET /v1/efactura/document/{uid}. An invalid document returns 422 validation_failed with a data.errors array. Nothing is uploaded to ANAF, and - unlike live - there is no ANAF pre-validation or duplicate-number check.

Validează structura documentului cu aceleași reguli ca API-ul live - câmpuri obligatorii, forma părților/adreselor, potrivirea from.cui cu consimțământul și corelarea vatScheme / vatRate (vezi câmpurile din corpul cererii pe pagina de producție eFactura). La succes returnează 201 cu uid-ul primului document emis simulat cu status pending - îl poți obține imediat cu GET /v1/efactura/document/{uid}. Un document invalid returnează 422 validation_failed cu un array data.errors. Nimic nu este încărcat la ANAF și - spre deosebire de live - nu există pre-validare ANAF sau verificare de număr duplicat.

Sandbox consent CUI. The sandbox's enabled eFactura consent belongs to Sandbox Test SRL, CUI 123456. Set from.cui to 123456 (or RO123456); any other value returns 422 validation_failed with from_cui_mismatch.

CUI consimțământ sandbox. Consimțământul eFactura activ din sandbox aparține companiei Sandbox Test SRL, CUI 123456. Setează from.cui la 123456 (sau RO123456); orice altă valoare returnează 422 validation_failed cu from_cui_mismatch.

Example requestExemplu de cerere
curl -sS -X POST 'https://sandbox.fint.ro/v1/efactura/send' \
  -H 'X-Org-Key: org_sandbox_…' \
  -H 'X-Api-Key: key_sandbox_…' \
  -H 'Content-Type: application/json' \
  -d '{
    "documentNumber": "TEST-1",
    "documentDate": "2026-06-29",
    "currency": "RON",
    "documentTypeCode": "380",
    "from": {
      "cui": "123456",
      "name": "Sandbox Test SRL",
      "address": { "line": "Str. Exemplu nr. 10", "city": "SECTOR1", "countrySubdivision": "RO-B", "country": "RO", "postalCode": "010101" },
      "regCom": "J40/1234/2020"
    },
    "to": {
      "cui": "654321",
      "name": "Buyer SRL",
      "address": { "line": "Bd. Unirii nr. 5", "city": "SECTOR1", "countrySubdivision": "RO-B", "country": "RO", "postalCode": "030101" },
      "regCom": "J40/1001/2015"
    },
    "items": [
      {
        "name": "Service",
        "quantity": 1,
        "price": 100,
        "vatRate": 21,
        "vatScheme": "S"
      }
    ]
  }'
{
  "documentNumber": "TEST-1",
  "documentDate": "2026-06-29",
  "currency": "RON",
  "documentTypeCode": "380",
  "from": {
    "cui": "123456",
    "name": "Sandbox Test SRL",
    "address": { "line": "Str. Exemplu nr. 10", "city": "SECTOR1", "countrySubdivision": "RO-B", "country": "RO", "postalCode": "010101" },
    "regCom": "J40/1234/2020"
  },
  "to": {
    "cui": "654321",
    "name": "Buyer SRL",
    "address": { "line": "Bd. Unirii nr. 5", "city": "SECTOR1", "countrySubdivision": "RO-B", "country": "RO", "postalCode": "030101" },
    "regCom": "J40/1001/2015"
  },
  "items": [
    {
      "name": "Service",
      "quantity": 1,
      "price": 100,
      "vatRate": 21,
      "vatScheme": "S"
    }
  ]
}

Response (201)Răspuns (201)

json
{
  "status": "success",
  "msg": "Document has been validated with Fint. Pending upload and ANAF confirmation.",
  "reason": null,
  "data": {
    "uid": "sandbox_XqdTICN1YmGkD8RV3cUE0keIZkRMoufc",
    "status": "pending"
  }
}

Response (422 validation failed)Răspuns (422 validare eșuată)

json
{
  "status": "error",
  "msg": "Document is not valid.",
  "reason": "validation_failed",
  "data": {
    "errors": [
      {
        "code": "from_cui_mismatch",
        "field": "from.cui",
        "message": "from.cui must match the enabled eFactura consent CUI for this license"
      }
    ]
  }
}

Response fieldsCâmpuri de răspuns

Identical to the production eFactura POST /v1/efactura/send response - see its Response fields.

Identice cu răspunsul POST /v1/efactura/send de pe pagina de producție eFactura - vezi Câmpuri de răspuns.

List documentsListare documente

GET/v1/efactura/documents

Same query parameters as live: type (all default - both directions - or outgoing/incoming), limit, offset, status (unknown status values return 400 invalid_status, as in production). Outgoing fixtures cycle through pending, sent, validated, rejected and failed; incoming fixtures through validated, pending and rejected.

Aceiași parametri de query ca live: type (all implicit - ambele direcții - sau outgoing/incoming), limit, offset, status (valorile necunoscute de status returnează 400 invalid_status, ca în producție). Fixture-urile emise trec ciclic prin pending, sent, validated, rejected și failed; cele primite prin validated, pending și rejected.

bash
curl -sS 'https://sandbox.fint.ro/v1/efactura/documents?type=incoming&limit=50&offset=0' \
  -H 'X-Org-Key: org_sandbox_…' \
  -H 'X-Api-Key: key_sandbox_…'

ResponseRăspuns

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": {
    "documents": [
      {
        "uid": "sandbox_…",
        "type": "incoming",
        "status": "validated",
        "source": "spv",
        "documentTypeCode": "380",
        "documentNumber": "SUP-IN-0001",
        "documentDate": "2026-06-28",
        "currency": "RON",
        "fromTo": "Alpha Distribution SRL",
        "fromToCui": "RO234567",
        "total": "167.75",
        "anafStatus": "ok",
        "anafId": "6000000001",
        "processed": 1,
        "createdOn": "2026-06-28 09:00:00",
        "updatedOn": "2026-06-28 09:30:00"
      }
    ],
    "total": 20,
    "limit": 50,
    "offset": 0
  }
}

Response fieldsCâmpuri de răspuns

Identical to the production eFactura GET /v1/efactura/documents response - see its Response fields.

Identice cu răspunsul GET /v1/efactura/documents de pe pagina de producție eFactura - vezi Câmpuri de răspuns.

Get a documentObținere document

GET/v1/efactura/document/{uid}

Example requestExemplu de cerere

bash
curl -sS 'https://sandbox.fint.ro/v1/efactura/document/sandbox_XqdTICN1YmGkD8RV3cUE0keIZkRMoufc' \
  -H 'X-Org-Key: org_sandbox_…' \
  -H 'X-Api-Key: key_sandbox_…'

ResponseRăspuns

json
{
  "status": "success",
  "data": {
    "uid": "sandbox_XqdTICN1YmGkD8RV3cUE0keIZkRMoufc",
    "type": "outgoing",
    "status": "pending",
    "errorMessage": null,
    "source": "fint",
    "documentTypeCode": "380",
    "documentNumber": "SBX-OUT-0001",
    "documentDate": "2026-06-28",
    "currency": "RON",
    "fromTo": "Alpha Distribution SRL",
    "fromToCui": "RO234567",
    "total": "173.50",
    "anafStatus": null,
    "anafId": null,
    "pdfAvailable": 0,
    "xmlAvailable": 0,
    "processed": 1,
    "createdOn": "2026-06-28 09:00:00",
    "updatedOn": "2026-06-28 09:30:00",
    "note": "Document sandbox - date simulate.",
    "dueDate": "2026-07-28",
    "buyerReference": null,
    "deliveryDate": "2026-06-28",
    "deliveryAddress": null,
    "from": {
      "cui": "123456",
      "name": "Sandbox Test SRL",
      "address": {
        "line": "Str. Exemplu nr. 10",
        "city": "București",
        "postalCode": "010101",
        "countrySubdivision": "RO-B",
        "country": "RO"
      },
      "regCom": "J40/1234/2020"
    },
    "to": {
      "cui": "234567",
      "name": "Alpha Distribution SRL",
      "address": {
        "line": "Bd. Unirii nr. 5",
        "city": "București",
        "postalCode": "030101",
        "countrySubdivision": "RO-B",
        "country": "RO"
      },
      "regCom": "J40/1001/2015"
    },
    "items": [
      {
        "name": "Servicii sandbox",
        "quantity": 1,
        "price": 157.73,
        "vatRate": 21,
        "vatScheme": "S",
        "currency": "RON",
        "value": "157.73"
      },
      {
        "name": "Reducere comercială",
        "quantity": 1,
        "price": 14.34,
        "vatRate": 21,
        "vatScheme": "S",
        "currency": "RON",
        "value": "-14.34"
      }
    ],
    "paymentMeans": {
      "paymentMeansCode": "30",
      "paymentId": "SBX-OUT-0001",
      "iban": "RO49RNCB0000000000000001",
      "accountName": "Sandbox Test SRL",
      "bic": "RNCBROBU"
    }
  }
}

Response fieldsCâmpuri de răspuns

Identical to the production eFactura GET /v1/efactura/document/{uid} response - see its Response fields.

Identice cu răspunsul GET /v1/efactura/document/{uid} de pe pagina de producție eFactura - vezi Câmpuri de răspuns.

Download a documentDescărcare document

GET/v1/efactura/download/{uid}?type=pdf|xml

No binary files exist in the sandbox, so this endpoint always returns 404 sandbox_download_unavailable.

În sandbox nu există fișiere binare, așa că acest endpoint returnează mereu 404 sandbox_download_unavailable.

json
{
  "status": "error",
  "msg": null,
  "reason": "sandbox_download_unavailable",
  "data": null
}

ErrorsErori

/send runs the same structural validation as the live API (returns 422 validation_failed with a data.errors array of {code, field, message} objects), but skips the ANAF UBL pre-check and the duplicate-number check. So the live-only errors 409 duplicate_document, 500 enqueue_failed and 429 limit_exceeded do not occur here.

/send rulează aceeași validare structurală ca API-ul live (returnează 422 validation_failed cu un array data.errors de obiecte {code, field, message}), dar sare peste pre-verificarea UBL la ANAF și verificarea numărului duplicat. Astfel, erorile specifice live 409 duplicate_document, 500 enqueue_failed și 429 limit_exceeded nu apar aici.

HTTPreasonWhenCând
400invalid_json/send body is missing or not valid JSON; data.detail is empty_body, json_syntax_error, or invalid_rootcorpul /send lipsește sau nu este JSON valid; data.detail este empty_body, json_syntax_error sau invalid_root
400invalid_status/documents - the status filter contains an unknown status value/documents - filtrul status conține o valoare necunoscută
422validation_failed/send - document failed structural validation; per-field details in data.errors, e.g. from_cui_mismatch/send - documentul nu a trecut validarea structurală; detalii per câmp în data.errors, ex. from_cui_mismatch
400invalid_uid/document/{uid} or /download/{uid} - malformed uid/document/{uid} sau /download/{uid} - uid malformat
404not_found/document/{uid} - unknown uid/document/{uid} - uid necunoscut
400invalid_type/documents or /download/{uid} - invalid type/documents sau /download/{uid} - type invalid
404sandbox_download_unavailable/download/{uid} - no binary files exist in sandbox/download/{uid} - nu există fișiere binare în sandbox

Info CUI

GET/v1/infocui

Most CUIs return a fixed mock company, Sandbox Test SRL. The special CUI RO222222 returns 404 company_not_found so you can test the not-found path. Field reference is identical to the production Info CUI page.

Majoritatea CUI-urilor returnează o companie simulată fixă, Sandbox Test SRL. CUI-ul special RO222222 returnează 404 company_not_found, ca să poți testa cazul „negăsit”. Referința câmpurilor este identică cu pagina de producție Info CUI.

Example requestExemplu de cerere

bash
curl -sS 'https://sandbox.fint.ro/v1/infocui?cui=RO123456' \
  -H 'X-Org-Key: org_sandbox_…' \
  -H 'X-Api-Key: key_sandbox_…'

ResponseRăspuns

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": {
    "cui": "123456",
    "name": "Sandbox Test SRL",
    "registrationNumber": "J40/1234/2015",
    "address": "Str. Exemplu nr. 10, Sector 1",
    "addressFull": "Str. Exemplu nr. 10, Sector 1, București, România",
    "city": "București",
    "county": "București",
    "countyCode": "B",
    "country": "România",
    "postalCode": "010101",
    "phone": "+40212345678",
    "fax": null,
    "iban": "RO49RNCB0000000000000001",
    "registrationStatus": "INREGISTRAT din data 2015-03-12",
    "registrationDate": "2015-03-12",
    "caenCode": "6201",
    "eInvoiceEnabled": true,
    "taxAuthority": "Administrația Sector 1",
    "legalForm": "Societate cu răspundere limitată",
    "vatRegistered": true,
    "cashVatEnabled": false,
    "financials": {
      "currency": "RON",
      "latestYear": 2024,
      "years": [
        {
          "year": 2024,
          "caenCode": "6201",
          "caenCode_label": "Cod CAEN",
          "employees": 12,
          "employees_label": "Număr mediu de salariați",
          "netTurnover": 2100000,
          "netTurnover_label": "Cifra de afaceri netă",
          "totalRevenue": 2150000,
          "totalRevenue_label": "Venituri totale",
          "totalExpenses": 1800000,
          "totalExpenses_label": "Cheltuieli totale",
          "grossProfit": 350000,
          "grossProfit_label": "Profit brut",
          "grossLoss": 0,
          "grossLoss_label": "Pierdere brută",
          "netProfit": 294000,
          "netProfit_label": "Profit net",
          "netLoss": 0,
          "netLoss_label": "Pierdere netă",
          "fixedAssets": 150000,
          "fixedAssets_label": "Active imobilizate",
          "currentAssets": 900000,
          "currentAssets_label": "Active circulante",
          "inventory": 50000,
          "inventory_label": "Stocuri",
          "receivables": 200000,
          "receivables_label": "Creanțe",
          "cash": 650000,
          "cash_label": "Casa și conturi la bănci",
          "prepaidExpenses": 0,
          "prepaidExpenses_label": "Cheltuieli în avans",
          "liabilities": 300000,
          "liabilities_label": "Datorii",
          "deferredRevenue": 0,
          "deferredRevenue_label": "Venituri în avans",
          "provisions": 0,
          "provisions_label": "Provizioane",
          "equity": 750000,
          "equity_label": "Capitaluri total",
          "paidCapital": 200,
          "paidCapital_label": "Capital subscris vărsat",
          "publicPatrimony": 0,
          "publicPatrimony_label": "Patrimoniul regiei"
        },
        {
          "year": 2023,
          "caenCode": "6201",
          "caenCode_label": "Cod CAEN",
          "employees": 10,
          "employees_label": "Număr mediu de salariați",
          "netTurnover": 1700000,
          "netTurnover_label": "Cifra de afaceri netă",
          "totalRevenue": 1730000,
          "totalRevenue_label": "Venituri totale",
          "totalExpenses": 1500000,
          "totalExpenses_label": "Cheltuieli totale",
          "grossProfit": 230000,
          "grossProfit_label": "Profit brut",
          "grossLoss": 0,
          "grossLoss_label": "Pierdere brută",
          "netProfit": 193000,
          "netProfit_label": "Profit net",
          "netLoss": 0,
          "netLoss_label": "Pierdere netă",
          "fixedAssets": 120000,
          "fixedAssets_label": "Active imobilizate",
          "currentAssets": 700000,
          "currentAssets_label": "Active circulante",
          "inventory": 40000,
          "inventory_label": "Stocuri",
          "receivables": 160000,
          "receivables_label": "Creanțe",
          "cash": 500000,
          "cash_label": "Casa și conturi la bănci",
          "prepaidExpenses": 0,
          "prepaidExpenses_label": "Cheltuieli în avans",
          "liabilities": 250000,
          "liabilities_label": "Datorii",
          "deferredRevenue": 0,
          "deferredRevenue_label": "Venituri în avans",
          "provisions": 0,
          "provisions_label": "Provizioane",
          "equity": 570000,
          "equity_label": "Capitaluri total",
          "paidCapital": 200,
          "paidCapital_label": "Capital subscris vărsat",
          "publicPatrimony": 0,
          "publicPatrimony_label": "Patrimoniul regiei"
        },
        {
          "year": 2022,
          "caenCode": "6201",
          "caenCode_label": "Cod CAEN",
          "employees": 8,
          "employees_label": "Număr mediu de salariați",
          "netTurnover": 1200000,
          "netTurnover_label": "Cifra de afaceri netă",
          "totalRevenue": 1220000,
          "totalRevenue_label": "Venituri totale",
          "totalExpenses": 1080000,
          "totalExpenses_label": "Cheltuieli totale",
          "grossProfit": 140000,
          "grossProfit_label": "Profit brut",
          "grossLoss": 0,
          "grossLoss_label": "Pierdere brută",
          "netProfit": 117600,
          "netProfit_label": "Profit net",
          "netLoss": 0,
          "netLoss_label": "Pierdere netă",
          "fixedAssets": 90000,
          "fixedAssets_label": "Active imobilizate",
          "currentAssets": 500000,
          "currentAssets_label": "Active circulante",
          "inventory": 30000,
          "inventory_label": "Stocuri",
          "receivables": 120000,
          "receivables_label": "Creanțe",
          "cash": 350000,
          "cash_label": "Casa și conturi la bănci",
          "prepaidExpenses": 0,
          "prepaidExpenses_label": "Cheltuieli în avans",
          "liabilities": 200000,
          "liabilities_label": "Datorii",
          "deferredRevenue": 0,
          "deferredRevenue_label": "Venituri în avans",
          "provisions": 0,
          "provisions_label": "Provizioane",
          "equity": 390000,
          "equity_label": "Capitaluri total",
          "paidCapital": 200,
          "paidCapital_label": "Capital subscris vărsat",
          "publicPatrimony": 0,
          "publicPatrimony_label": "Patrimoniul regiei"
        }
      ]
    }
  }
}

Response fieldsCâmpuri de răspuns

Identical to the production Info CUI GET /v1/infocui response - see its Response fields.

Identice cu răspunsul GET /v1/infocui de pe pagina de producție Info CUI - vezi Câmpuri de răspuns.

ErrorsErori

reason codes match the live API. The special CUI RO222222 is wired to return 404 company_not_found so you can exercise the not-found path; every other well-formed CUI returns the mock company. 429 limit_exceeded is not enforced in sandbox.

Codurile reason corespund API-ului live. CUI-ul special RO222222 este configurat să returneze 404 company_not_found pentru a testa cazul negăsit; orice alt CUI bine format returnează compania simulată. 429 limit_exceeded nu este aplicat în sandbox.

HTTPreasonWhenCând
405method_not_allowed_getWrong HTTP method (must be GET)Metodă HTTP greșită (trebuie GET)
400missing_cui / invalid_cuicui is missing or not a valid fiscal codecui lipsește sau nu este un cod fiscal valid
404company_not_foundSpecial test CUI RO222222CUI de test special RO222222

Schimb valutar

GET/v1/schimbvalutar

Returns fixed mock rates with no upstream fetch: EUR 5.2390, USD 4.8500, GBP 6.1200, CHF 5.4500, HUF 1.3120 (per 100). from must be RON; an optional date is echoed back unchanged (no banking-day fallback in sandbox). Field reference is identical to the production Schimb valutar page.

Returnează cursuri simulate fixe, fără apel extern: EUR 5.2390, USD 4.8500, GBP 6.1200, CHF 5.4500, HUF 1.3120 (la 100). from trebuie să fie RON; un date opțional este returnat neschimbat (fără fallback la ziua bancară în sandbox). Referința câmpurilor este identică cu pagina de producție Schimb valutar.

Example requestExemplu de cerere

bash
curl -sS 'https://sandbox.fint.ro/v1/schimbvalutar?from=RON&to=EUR' \
  -H 'X-Org-Key: org_sandbox_…' \
  -H 'X-Api-Key: key_sandbox_…'

Example request (historical)Exemplu de cerere (istoric)

bash
curl -sS 'https://sandbox.fint.ro/v1/schimbvalutar?from=RON&to=USD&date=2025-01-15' \
  -H 'X-Org-Key: org_sandbox_…' \
  -H 'X-Api-Key: key_sandbox_…'

ResponseRăspuns

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": {
    "from": "RON",
    "to": "EUR",
    "date": "2026-06-29",
    "rate": 5.239,
    "multiplier": 1,
    "source": "bnr",
    "publishedDate": "2026-06-29"
  }
}

rate is RON per 1 unit of to (the official multiplier is already applied).

rate este RON per 1 unitate din to (multiplicatorul oficial este deja aplicat).

Response fieldsCâmpuri de răspuns

Identical to the production Schimb valutar GET /v1/schimbvalutar response - see its Response fields.

Identice cu răspunsul GET /v1/schimbvalutar de pe pagina de producție Schimb valutar - vezi Câmpuri de răspuns.

ErrorsErori

from must be RON and to must be one of the five mocked currencies (EUR, USD, GBP, CHF, HUF); any other currency returns 404 rate_not_found. Because sandbox serves fixed rates and never contacts an upstream source, 502 provider_error cannot occur, and 429 limit_exceeded is not enforced.

from trebuie să fie RON, iar to una dintre cele cinci valute simulate (EUR, USD, GBP, CHF, HUF); orice altă valută returnează 404 rate_not_found. Deoarece sandbox-ul servește cursuri fixe și nu contactează nicio sursă externă, 502 provider_error nu poate apărea, iar 429 limit_exceeded nu este aplicat.

HTTPreasonWhenCând
405method_not_allowed_getWrong HTTP method (must be GET)Metodă HTTP greșită (trebuie GET)
400missing_from / invalid_fromfrom is missing or not RONfrom lipsește sau nu este RON
400missing_to / invalid_toto is missing or not a 3-letter ISO 4217 codeto lipsește sau nu este un cod ISO 4217 de 3 litere
400invalid_date / future_datedate is malformed or in the futuredate este malformat sau în viitor
404rate_not_foundCurrency outside the mocked setValută în afara setului simulat

Onboarding endpoints return an authLink that opens in a browser. In sandbox these resolve to mock success pages - same layout as production, but no provider redirect, session, or database write.

Endpoint-urile de onboarding returnează un authLink care se deschide în browser. În sandbox acestea duc la pagini de succes simulate - același aspect ca producția, dar fără redirecționare către furnizor, sesiune sau scriere în baza de date.

URLSimulatesSimulează
https://sandbox.fint.ro/consent/extraseExtrase onboarding success (mock IBAN list)Succes onboarding Extrase (listă IBAN simulată)
https://sandbox.fint.ro/consent/efacturaeFactura onboarding success (mock CUI)Succes onboarding eFactura (CUI simulat)

Not available in sandbox. The Organization API (/v1/organization/*) is live-only and is not served by the sandbox host. Billing limits are never enforced and sandbox calls are not logged.

Indisponibil în sandbox. API-ul Organizație (/v1/organization/*) există doar pe producție și nu este servit de hostul sandbox. Limitele de facturare nu se aplică niciodată, iar apelurile sandbox nu sunt înregistrate.

API referenceReferință API

WebhooksWebhook-uri

Webhooks push a signed JSON payload to a URL you control the moment something happens in eFactura or Extrase, so you don’t have to poll the API.

Webhook-urile trimit un payload JSON semnat către o adresă pe care o controlezi, în momentul în care se întâmplă ceva în eFactura sau Extrase, ca să nu fie nevoie să interoghezi API-ul.

Managed in the app, not via the API. Webhooks are configured in the Fint dashboard, not through the public API. Sign in as a company admin and open Companie → Webhook-uri.Gestionate în aplicație, nu prin API. Webhook-urile se configurează în panoul Fint, nu prin API-ul public. Autentifică-te ca administrator de companie și deschide Companie → Webhook-uri.

Setting up an endpointConfigurarea unui endpoint

  1. Create the endpoint. Open Companie → Webhook-uri and click Webhook nou.
  2. Creează endpoint-ul. Deschide Companie → Webhook-uri și apasă Webhook nou.
  3. Choose the URL and events. Enter your HTTPS URL, pick the events you want, and save.
  4. Alege adresa și evenimentele. Introdu adresa HTTPS, alege evenimentele dorite și salvează.
  5. Save the signing secret. Fint shows a signing secret (whsec_…) once - copy it now; it is never shown again. Use it to verify every delivery. You can regenerate it later from the endpoint’s actions menu (⋮) via Regenerează secret, which immediately invalidates the old one.
  6. Salvează secretul de semnare. Fint afișează un secret de semnare (whsec_…) o singură dată - copiază-l acum; nu va mai fi afișat. Folosește-l pentru a verifica fiecare livrare. Îl poți regenera ulterior din meniul de acțiuni (⋮) prin Regenerează secret, ceea ce invalidează imediat secretul vechi.
  7. Send a test. Use Trimite test from the actions menu to send a webhook.ping and confirm your endpoint receives it.
  8. Trimite un test. Folosește Trimite test din meniul de acțiuni pentru a trimite un webhook.ping și a confirma că endpoint-ul îl primește.
  9. Watch deliveries. Istoric webhook (the actions menu) shows every delivery, its status and HTTP code, and lets you redeliver one manually.
  10. Urmărește livrările. Istoric webhook (meniul de acțiuni) arată fiecare livrare, statusul și codul HTTP, și îți permite să retrimiți manual o livrare.

Scope. Each endpoint belongs to one company and only receives that company’s events.Domeniu. Fiecare endpoint aparține unei singure companii și primește doar evenimentele acelei companii.

Endpoint requirements. The URL must be https on the standard port 443, must not contain credentials, and must not resolve to a private or internal address. This is re-checked on every delivery.Cerințe pentru endpoint. Adresa trebuie să folosească https pe portul standard 443, să nu conțină credențiale și să nu indice o adresă privată sau internă. Acest lucru este verificat la fiecare livrare.

EventsEvenimente

EventEvenimentFires whenSe declanșează când
efactura.document.receivedAn incoming document is fetched from ANAF SPVUn document primit este descărcat din ANAF SPV
efactura.document.sentAn outgoing document is uploaded to ANAFUn document emis este încărcat la ANAF
efactura.document.validatedANAF marks an outgoing document validANAF marchează un document emis ca valid
efactura.document.rejectedANAF rejects an outgoing documentANAF respinge un document emis
efactura.document.failedAn outgoing document reaches the failed stateUn document emis ajunge în starea eșuat
efactura.document.processedA document’s ZIP/UBL is parsed and its PDF renderedZIP/UBL-ul unui document este procesat și PDF-ul generat
efactura.consent.createdANAF consent authorizedConsimțământ ANAF autorizat
efactura.consent.expiringANAF consent expiring soonConsimțământ ANAF care expiră curând
efactura.consent.expiredANAF consent expiredConsimțământ ANAF expirat
efactura.consent.disabledANAF consent disabledConsimțământ ANAF dezactivat
extrase.transactions.importedNew bank transactions were stored after a syncTranzacții bancare noi au fost salvate după o sincronizare
extrase.consent.createdBank (Open Banking) consent authorizedConsimțământ bancar (Open Banking) autorizat
extrase.consent.expiringBank consent expiring soonConsimțământ bancar care expiră curând
extrase.consent.expiredBank consent expiredConsimțământ bancar expirat
extrase.consent.disabledBank consent disabledConsimțământ bancar dezactivat

Delivery formatFormatul livrării

Each delivery is an HTTP POST with Content-Type: application/json and these headers:

Fiecare livrare este un POST HTTP cu Content-Type: application/json și următoarele header-e:

HeaderHeaderMeaningSemnificație
Fint-Signaturet=<unix>,v1=<hmac-sha256 hex> - timestamped HMAC over the raw bodyt=<unix>,v1=<hmac-sha256 hex> - HMAC cu marcaj de timp peste corpul brut
Fint-DeliveryUnique delivery id - use it as your idempotency keyId unic de livrare - folosește-l ca cheie de idempotență
Fint-EventThe event name (also present in the body)Numele evenimentului (prezent și în corp)
User-AgentFint-Webhooks/1

The body is a stable envelope; data is specific to each event:

Corpul este o envelopă stabilă; data este specific fiecărui eveniment:

json
{
  "id": "hd8s0f...",
  "type": "efactura.document.validated",
  "createdAt": "2026-08-12 10:04:33",
  "companyUid": "oyUsdORx...",
  "data": {
    "documentUid": "a1b2c3...",
    "status": "validated",
    "type": "outgoing",
    "total": 1190.0,
    "currency": "RON"
  }
}

Respond with any 2xx status to acknowledge. Any other status, or a timeout, counts as a failure and is retried.

Răspunde cu orice status 2xx pentru a confirma. Orice alt status, sau un timeout, este considerat eșec și se reîncearcă.

Verifying the signatureVerificarea semnăturii

Every request carries a Fint-Signature header of the form t=<timestamp>,v1=<signature>. Compute an HMAC-SHA256 over "{t}.{rawBody}" using your endpoint secret and compare it, in constant time, to v1. Reject the request if the timestamp is outside a tolerance window (300 seconds is a good default) to guard against replay.

Fiecare cerere poartă un header Fint-Signature de forma t=<timestamp>,v1=<semnătură>. Calculează un HMAC-SHA256 peste "{t}.{rawBody}" folosind secretul endpoint-ului și compară-l, în timp constant, cu v1. Respinge cererea dacă marcajul de timp este în afara unei ferestre de toleranță (300 de secunde este o valoare implicită bună) pentru a preveni atacurile de tip replay.

javascript
import crypto from 'node:crypto';

function fintVerifyWebhook(rawBody, sigHeader, secret, toleranceSeconds = 300) {
  const parts = Object.fromEntries(
    String(sigHeader).split(',').map((p) => p.split('=').map((s) => s.trim())),
  );
  if (!parts.t || !parts.v1 || !/^\d+$/.test(parts.t)) return false;
  if (Math.abs(Math.floor(Date.now() / 1000) - Number(parts.t)) > toleranceSeconds) return false;

  const expected = crypto
    .createHmac('sha256', secret)
    .update(`${parts.t}.${rawBody}`)
    .digest('hex');

  const a = Buffer.from(expected);
  const b = Buffer.from(parts.v1);
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}

Always verify against the raw request body exactly as received - do not re-serialize the JSON first, or the signature will not match.

Verifică întotdeauna pe baza corpului brut al cererii, exact cum a fost primit - nu re-serializa JSON-ul întâi, altfel semnătura nu se va potrivi.

Retries and idempotencyReîncercări și idempotență

Delivery is at-least-once, so the same event may arrive more than once (for example after a network hiccup). Deduplicate on the Fint-Delivery id, which is unique per delivery and echoed in the body as id.

Livrarea este cel puțin o dată, deci același eveniment poate ajunge de mai multe ori (de exemplu după o problemă de rețea). Deduplică după id-ul Fint-Delivery, care este unic per livrare și este reluat în corp ca id.

A failed delivery is retried with exponential backoff - roughly 1m, 5m, 30m, 2h, 6h, 12h, 24h - up to 8 attempts. After that it is marked failed and kept in Istoric webhook, where you can redeliver it manually. An endpoint that fails many deliveries in a row is automatically disabled; re-enable it after fixing the receiver.

O livrare eșuată se reîncearcă cu backoff exponențial - aproximativ 1m, 5m, 30m, 2h, 6h, 12h, 24h - până la 8 încercări. După aceea este marcată ca eșuată și păstrată în Istoric webhook, de unde o poți retrimite manual. Un endpoint care eșuează multe livrări la rând este dezactivat automat; reactivează-l după ce repari receptorul.

ReferenceReferință

ConceptsConcepte

Background on the Romanian financial and regulatory context behind Fint's services. Useful if you are new to open banking, e-invoicing, or Romanian tax identifiers.

Context financiar și de reglementare românesc din spatele serviciilor Fint. Util dacă ești nou în open banking, facturare electronică sau identificatori fiscali românești.

Open Banking (PSD2)Open Banking (PSD2)

PSD2 (the EU Payment Services Directive 2) requires banks to expose customer account data and payment initiation via standardized APIs, provided the account holder has given explicit consent. The consent is established through an OAuth flow with the bank: the account holder authenticates at their bank and authorizes a third party to read their accounts and transactions.

PSD2 (Directiva europeană privind serviciile de plată 2) obligă băncile să expună date de cont și inițiere de plăți prin API-uri standardizate, cu condiția consimțământului explicit al titularului de cont. Consimțământul se stabilește printr-un flux OAuth cu banca: titularul se autentifică la bancă și autorizează o terță parte să citească conturile și tranzacțiile.

In Fint's Extrase service, this means each connected bank requires its own PSD2 consent. Once authorized, Fint keeps accounts, balances, and transactions synchronized from the bank. The public API returns this already-synchronized data; it does not call the bank in real time. Consents have a validity period set by the bank; Fint maintains the connection and notifies your organization when a consent expires or is revoked.

În serviciul Extrase Fint, asta înseamnă că fiecare bancă conectată necesită propriul consimțământ PSD2. Odată autorizat, Fint menține conturile, soldurile și tranzacțiile sincronizate de la bancă. API-ul public returnează aceste date deja sincronizate; nu apelează banca în timp real. Consimțămintele au o perioadă de valabilitate stabilită de bancă; Fint menține conexiunea și notifică organizația când un consimțământ expiră sau este revocat.

See Extrase for API endpoints and consent setup.

Vezi Extrase pentru endpoint-uri API și configurarea consimțământului.

eFactura (Romanian e-invoicing)eFactura (facturare electronică românească)

eFactura is the Romanian government's electronic invoicing system, operated by ANAF (Agenția Națională de Administrare Fiscală). Businesses in Romania are legally required to submit and receive invoices electronically through ANAF's SPV (Spațiu Privat Virtual). Invoices are formatted as UBL 2.1 XML; ANAF validates the document and countersigns it upon acceptance.

eFactura este sistemul guvernamental român de facturare electronică, operat de ANAF (Agenția Națională de Administrare Fiscală). Afacerile din România sunt obligate legal să trimită și să primească facturi electronic prin SPV ANAF (Spațiu Privat Virtual). Facturile sunt formatate ca UBL 2.1 XML; ANAF validează documentul și îl contrasemnează la acceptare.

To submit invoices via Fint, the company must have active SPV access at ANAF and must authorize Fint through an ANAF OAuth consent. This authorization can only be completed by a person who holds a qualified digital certificate registered at ANAF for that company's CUI. Once authorized, Fint submits outgoing documents to ANAF and provides incoming documents received from other parties.

Pentru a trimite facturi prin Fint, compania trebuie să aibă acces SPV activ la ANAF și să autorizeze Fint printr-un consimțământ OAuth ANAF. Această autorizare poate fi finalizată doar de o persoană cu certificat digital calificat înregistrat la ANAF pentru CUI-ul companiei. Odată autorizat, Fint trimite documentele de ieșire la ANAF și furnizează documente de intrare primite de la alte părți.

The most common document type is 380 (standard invoice). Other types include 381 (credit note) and 384 (corrective invoice). See eFactura for the full API reference and consent setup.

Cel mai frecvent tip de document este 380 (factură standard). Alte tipuri includ 381 (notă de creditare) și 384 (factură corectată). Vezi eFactura pentru referința API completă și configurarea consimțământului.

CUI (Cod Unic de Înregistrare)CUI (Cod Unic de Înregistrare)

The CUI is the Romanian company fiscal identifier, roughly equivalent to a VAT or company registration number in other EU countries. It uniquely identifies a legal entity registered in Romania. A CUI may appear with or without the RO prefix (e.g. RO12345678 or 12345678); Fint normalizes all inputs to digits only.

CUI-ul este identificatorul fiscal al companiei românești, echivalent aproximativ cu numărul de TVA sau de înregistrare în alte țări UE. Identifică unic o entitate juridică înregistrată în România. Un CUI poate apărea cu sau fără prefixul RO (ex. RO12345678 sau 12345678); Fint normalizează toate intrările la cifre.

The CUI is used in two ways within Fint: as the lookup target in Info CUI (retrieve public company data for any valid Romanian CUI), and as the company identifier in eFactura where from.cui must match the CUI for which your ANAF consent was granted.

CUI-ul este folosit în două moduri în Fint: ca țintă de căutare în Info CUI (recuperează date publice despre companie pentru orice CUI românesc valid) și ca identificator de companie în eFactura, unde from.cui trebuie să coincidă cu CUI-ul pentru care ai primit consimțământ ANAF.

Reference exchange ratesCursuri de referință

One official Romanian reference exchange rate is published per foreign currency per banking day, typically around 13:00 local time. Rates are expressed as RON per 1 unit of the foreign currency, with a multiplier applied for currencies quoted in lots (e.g. 100 JPY). These are official reference rates used for accounting and fiscal purposes, not live market trading rates.

Se publică un curs oficial românesc de referință per valută străină per zi bancară, de obicei în jurul orei 13:00 ora locală. Cursurile sunt exprimate ca RON per 1 unitate de valută străină, cu multiplicator aplicat pentru valute cotate în loturi (ex. 100 JPY). Sunt cursuri oficiale de referință pentru contabilitate și fiscalitate, nu cursuri de tranzacționare live.

When querying a rate for a date when no publication exists (weekends, public holidays, or before the daily update), Fint returns the most recent available rate with its actual publication date in publishedDate. Future dates are rejected with 400 future_date. See Schimb valutar for the API reference.

Când interoghezi un curs pentru o dată fără publicare (weekend, sărbători legale sau înainte de actualizarea zilnică), Fint returnează cel mai recent curs disponibil cu data reală de publicare în publishedDate. Datele viitoare sunt respinse cu 400 future_date. Vezi Schimb valutar pentru referința API.

ReferenceReferință

ConventionsConvenții

Conventions shared by every Fint endpoint: request format, the response envelope, error handling, and identifiers.

Convenții comune tuturor endpoint-urilor Fint: formatul cererii, envelopa de răspuns, gestionarea erorilor și identificatorii.

GeneralGenerale

  • Content type: request bodies are JSON (Content-Type: application/json) unless noted.
  • Tip de conținut: corpurile cererilor sunt JSON (Content-Type: application/json), dacă nu se specifică altfel.
  • Envelope: responses use { "status", "msg", "reason", "data" }. On success, msg and reason are usually null.
  • Envelopă: răspunsurile folosesc { "status", "msg", "reason", "data" }. La succes, msg și reason sunt de obicei null.
  • Error handling: branch on the stable reason field (snake_case), not the human-readable msg.
  • Gestionarea erorilor: ramifică pe câmpul stabil reason (snake_case), nu pe msg lizibil.
  • Identifiers: resources are referenced by a public uid; internal numeric database ids are not exposed, except where explicitly documented (e.g. the id returned when creating a company API key).
  • Identificatori: resursele sunt referite printr-un uid public; id-urile numerice interne din baza de date nu sunt expuse, cu excepția cazurilor documentate explicit (ex. id-ul returnat la crearea unei chei API de companie).

HTTP methods and URL structureMetode HTTP și structura URL

Fint follows one rule across every service so endpoints are predictable:

Fint respectă o singură regulă în toate serviciile, astfel încât endpoint-urile să fie previzibile:

  • GET is used for reads and never takes a request body.
  • GET este folosit pentru citiri și nu acceptă niciodată un corp de cerere.
  • POST is used for actions and creates, and takes a JSON body. Service toggles such as services/activate stay POST; there are no PUT, PATCH or DELETE methods.
  • POST este folosit pentru acțiuni și creări și acceptă un corp JSON. Comutările de serviciu precum services/activate rămân POST; nu există metode PUT, PATCH sau DELETE.

Where a value goes in the URL depends on what it is:

Locul unei valori în URL depinde de ce reprezintă:

  • Path segment - the identity of a stored resource. A specific resource that Fint issued a uid for is addressed by that uid in the path: /v1/{service}/{collection}/{uid}. Examples: GET /v1/extrase/transaction/{uid}, GET /v1/efactura/document/{uid}, GET /v1/efactura/download/{uid}, and the /v1/organization/companies/{company}/… actions.
  • Segment de cale - identitatea unei resurse stocate. O resursă specifică pentru care Fint a emis un uid este adresată prin acel uid în cale: /v1/{service}/{collection}/{uid}. Exemple: GET /v1/extrase/transaction/{uid}, GET /v1/efactura/document/{uid}, GET /v1/efactura/download/{uid} și acțiunile /v1/organization/companies/{company}/….
  • Query string - everything else. Pagination (limit, offset), filters (type, status, from, to, q, accountUid) and representation options (the download type) go in the query string. Lookup inputs that are not a Fint uid also go there - for example Info CUI’s ?cui= and Schimb valutar’s ?from=&to=&date=, whose inputs are the values you are looking up, not resources Fint owns.
  • Query string - tot restul. Paginarea (limit, offset), filtrele (type, status, from, to, q, accountUid) și opțiunile de reprezentare (parametrul type la descărcare) merg în query string. Valorile de căutare care nu sunt un uid Fint merg tot acolo - de exemplu ?cui= la Info CUI și ?from=&to=&date= la Schimb valutar, ale căror valori sunt ceea ce cauți, nu resurse deținute de Fint.

Error envelopeEnvelopă de eroare

All responses share a single JSON envelope. On errors, branch on the stable reason field rather than the human-readable msg.

Toate răspunsurile folosesc o singură envelopă JSON. La erori, ramifică pe câmpul stabil reason, nu pe msg lizibil.

json
{
  "status": "error",
  "msg": "A human-readable English sentence.",
  "reason": "stable_snake_case_identifier",
  "data": null
}

The /efactura/download endpoint is the exception on success: it streams a binary file instead of the envelope. Validation errors on /efactura/send include a data.errors[] array with per-field code, field and message.

Endpoint-ul /efactura/download este excepția la succes: transmite un fișier binar în loc de envelopă. Erorile de validare la /efactura/send includ un array data.errors[] cu code, field și message per câmp.

Error codes are documented where they occur: each service’s reference page lists its own reason codes, and authentication errors are documented under Authentication.

Codurile de eroare sunt documentate acolo unde apar: pagina de referință a fiecărui serviciu listează propriile coduri reason, iar erorile de autentificare sunt documentate la Autentificare.

Request bodyCorpul cererii

  • Content-Type: always Content-Type: application/json for POST requests.
  • Content-Type: întotdeauna Content-Type: application/json pentru cererile POST.
  • Root type: the body must be a JSON object ({…}). An empty object is accepted on endpoints that take no body.
  • Tipul rădăcinii: corpul trebuie să fie un obiect JSON ({…}). Un obiect gol este acceptat pe endpoint-urile care nu necesită corp.
  • Size limit: the eFactura /send endpoint enforces a 512 KiB maximum; larger bodies are rejected before JSON parsing.
  • Limită de dimensiune: endpoint-ul eFactura /send impune un maximum de 512 KiB; corpurile mai mari sunt respinse înainte de parsarea JSON.

Malformed JSON returns 400 invalid_json. On the eFactura /send endpoint the response also carries a data.detail sub-code identifying the cause:

JSON-ul malformat returnează 400 invalid_json. Pe endpoint-ul eFactura /send răspunsul conține și un sub-cod data.detail care identifică cauza:

data.detailCauseCauză
empty_bodyNo body sent when one is requiredNiciun corp trimis când este necesar
payload_too_largeBody exceeds 512 KiBCorpul depășește 512 KiB
json_syntax_errorBody is not valid JSONCorpul nu este JSON valid
invalid_rootRoot value is not a JSON objectValoarea rădăcină nu este un obiect JSON

PaginationPaginare

List endpoints use offset-based pagination with two query parameters: limit (page size, default 50, max 100) and offset (rows to skip, default 0). The response always echoes both values back alongside a total count of all matching rows - use it to calculate whether more pages exist.

Endpoint-urile de listare folosesc paginare bazată pe offset cu doi parametri: limit (dimensiunea paginii, implicit 50, maxim 100) și offset (rânduri de sărit, implicit 0). Răspunsul returnează mereu ambele valori împreună cu un total al tuturor rândurilor care corespund - folosește-l pentru a calcula dacă mai există pagini.

json
{
  "status": "success",
  "msg": null,
  "reason": null,
  "data": {
    "documents": [
      "..."
    ],
    "total": 142,
    "limit": 50,
    "offset": 0
  }
}

Monetary amountsSume monetare

All monetary amounts in API responses are decimal strings, not JSON numbers - e.g. "121.00", not 121.00. This avoids the floating-point rounding errors that affect native floats in most languages (121.10 cannot be represented exactly in binary IEEE 754). Always parse monetary fields with your language’s decimal type (Decimal, BigDecimal, decimal.Decimal, etc.).

Toate sumele monetare din răspunsurile API sunt șiruri zecimale, nu numere JSON - ex. "121.00", nu 121.00. Aceasta evită erorile de rotunjire în virgulă mobilă care afectează float-urile native în majoritatea limbajelor (121.10 nu poate fi reprezentat exact în IEEE 754 binar). Parsează întotdeauna câmpurile monetare cu tipul zecimal al limbajului tău (Decimal, BigDecimal, decimal.Decimal etc.).

Two clarifications:

Două precizări:

  • eFactura line-item echo fields (items[].price, items[].quantity, items[].vatRate) are JSON numbers, mirroring the numeric values you submit on /send. Computed monetary fields (total, items[].value, account balance, transaction amount) are always decimal strings.
  • Câmpurile de linie eFactura reluate din cerere (items[].price, items[].quantity, items[].vatRate) sunt numere JSON, oglindind valorile numerice trimise la /send. Câmpurile monetare calculate (total, items[].value, balance pe conturi, amount pe tranzacții) sunt întotdeauna șiruri zecimale.
  • Exchange rates (Schimb valutar rate) are JSON numbers - a rate is a ratio, not a monetary amount.
  • Cursurile valutare (rate la Schimb valutar) sunt numere JSON - un curs este un raport, nu o sumă monetară.

Dates and timestampsDate și timestamp-uri

  • Dates - calendar dates use YYYY-MM-DD (e.g. "2026-06-29"), both in query parameters and response fields such as documentDate, bookingDate, validUntil.
  • Date calendaristice - folosesc formatul YYYY-MM-DD (ex. "2026-06-29"), atât în parametrii de interogare cât și în câmpurile de răspuns precum documentDate, bookingDate, validUntil.
  • Timestamps - datetime fields use YYYY-MM-DD HH:MM:SS (e.g. "2026-06-29 10:00:00"), as in createdOn, updatedOn, expiresOn.
  • Timestamp-uri - câmpurile datetime folosesc YYYY-MM-DD HH:MM:SS (ex. "2026-06-29 10:00:00"), ca în createdOn, updatedOn, expiresOn.

API root and version discoveryRădăcina API și descoperirea versiunilor

Both API hosts answer unauthenticated GET requests on their root and version paths, in the standard envelope, always 200:

Ambele hosturi API răspund la cereri GET neautentificate pe rădăcină și pe calea de versiune, în anvelopa standard, întotdeauna 200:

  • GET https://api.fint.ro/ - lists the available API versions with their base URLs (data.versions, currently only v1).
  • GET https://api.fint.ro/ - listează versiunile API disponibile cu URL-urile lor de bază (data.versions, momentan doar v1).
  • GET https://api.fint.ro/v1 - lists every available endpoint of that version (data.endpoints).
  • GET https://api.fint.ro/v1 - listează toate endpoint-urile disponibile ale versiunii (data.endpoints).

The same applies on the sandbox host (https://sandbox.fint.ro/ and https://sandbox.fint.ro/v1). These are stable, non-error targets - use them for uptime monitoring or client-side connectivity checks.

La fel și pe hostul sandbox (https://sandbox.fint.ro/ și https://sandbox.fint.ro/v1). Sunt ținte stabile, fără erori - folosește-le pentru monitorizarea uptime-ului sau verificări de conectivitate în client.

Unknown routesRute necunoscute

Any misspelled or non-existent path under /v1/ returns 404 not_found in the standard JSON envelope - never an HTML error page. It is safe to always parse Fint API responses as JSON.

Orice cale greșită sau inexistentă sub /v1/ returnează 404 not_found în envelopa JSON standard - niciodată o pagină de eroare HTML. Răspunsurile API Fint pot fi parsate întotdeauna ca JSON.

ReferenceReferință

LimitsLimite

Fint applies two independent kinds of limit, and it helps to keep them apart. Technical limits shape each individual request (body size, page size) and protect the API from abuse (rate limiting). Billing limits are the monthly allowance your plan includes for each service. This page explains both and what happens when you reach them.

Fint aplică două tipuri independente de limită și e util să le ții separate. Limitele tehnice modelează fiecare cerere în parte (dimensiunea corpului, dimensiunea paginii) și protejează API-ul de abuz (rate limiting). Limitele de facturare reprezintă cota lunară inclusă în planul tău pentru fiecare serviciu. Această pagină le explică pe ambele și ce se întâmplă când le atingi.

Technical limitsLimite tehnice

These apply per request, on every service, regardless of plan.

Acestea se aplică per cerere, pe fiecare serviciu, indiferent de plan.

LimitLimităValueValoareNotesNote
Request body sizeDimensiunea corpului cererii 512 KiB Larger bodies are rejected before JSON parsing with 400 invalid_json (data.detail: payload_too_large). See Conventions - Request body.Corpurile mai mari sunt respinse înainte de parsarea JSON cu 400 invalid_json (data.detail: payload_too_large). Vezi Convenții - Corpul cererii.
Page size (limit)Dimensiunea paginii (limit) default 50, max 100implicit 50, maxim 100 List endpoints use offset-based pagination (limit, offset). See Conventions - Pagination.Endpoint-urile de listare folosesc paginare bazată pe offset (limit, offset). Vezi Convenții - Paginare.
Request rateRata cererilor generous ceilingplafon generos An abuse ceiling only - see Rate limiting below.Doar un plafon anti-abuz - vezi Rate limiting mai jos.

Rate limitingRate limiting

Fint enforces a rate limit per company key, per organization key and per client IP over a short rolling window. The thresholds are deliberately high: they exist only to stop deliberate flooding and never interfere with normal integration traffic. You do not need to tune your client to stay under a specific number - just avoid tight retry loops.

Fint aplică o limită de rată per cheie de companie, per cheie de organizație și per IP client, pe o fereastră scurtă glisantă. Pragurile sunt intenționat ridicate: există doar pentru a opri inundarea deliberată și nu interferează niciodată cu traficul normal de integrare. Nu e nevoie să-ți reglezi clientul pentru a rămâne sub un anumit număr - evită doar buclele agresive de reîncercare.

When the ceiling is exceeded, the API responds with 429 and reason: "rate_limited", plus a Retry-After header giving the number of seconds to wait. Honor it: pause for that long, then retry. The limiter is fail-open - if it ever cannot record a request, it allows the request rather than blocking legitimate traffic.

Când plafonul este depășit, API-ul răspunde cu 429 și reason: "rate_limited", plus un antet Retry-After care indică numărul de secunde de așteptat. Respectă-l: așteaptă acel interval, apoi reîncearcă. Limitatorul este fail-open - dacă vreodată nu poate înregistra o cerere, o permite în loc să blocheze traficul legitim.

Rate limiting is completely separate from your plan allowance. A rate_limited response never counts against your billing usage, and reaching your plan allowance never produces a rate_limited response - that is limit_exceeded instead. See The two 429s.

Rate limiting este complet separat de cota planului tău. Un răspuns rate_limited nu se scade niciodată din consumul facturat, iar atingerea cotei planului nu produce niciodată un răspuns rate_limited - acela este limit_exceeded. Vezi Cele două 429.

Billing / usage limitsLimite de facturare / consum

Every service you activate on a company comes with a monthly included allowance, measured in that service’s natural unit:

Fiecare serviciu activat pe o companie vine cu o cotă lunară inclusă, măsurată în unitatea naturală a serviciului:

  • eFactura - documents sent and retrieved.
  • eFactura - documente trimise și preluate.
  • Extrase - bank accounts kept enabled.
  • Extrase - conturi bancare menținute active.
  • Info CUI and Schimb valutar - API requests.
  • Info CUI și Schimb valutar - cereri API.

The allowance resets at the start of each billing period. The period is anchored to your account’s billing day, not the calendar 1st - so if your billing day is the 12th, each period runs from the 12th of one month to the 12th of the next, and usage counters reset then.

Cota se resetează la începutul fiecărei perioade de facturare. Perioada este ancorată la ziua ta de facturare, nu la data de 1 din calendar - deci dacă ziua de facturare este pe 12, fiecare perioadă merge de pe 12 a unei luni până pe 12 a lunii următoare, iar contoarele de consum se resetează atunci.

What happens when you reach the allowance depends on the extra charges setting (Consum adiţional) for that service, which you control in the dashboard:

Ce se întâmplă când atingi cota depinde de setarea consum adiţional (Consum adiţional) pentru acel serviciu, pe care o controlezi din dashboard:

  • Extra charges on: requests keep working past the allowance and each extra unit is billed at the per-unit overage price for your plan.
  • Consum adiţional activat: cererile continuă să funcționeze peste cotă, iar fiecare unitate suplimentară este facturată la prețul de depășire per unitate al planului tău.
  • Extra charges off: the service is blocked once the allowance is reached and further calls return 429 limit_exceeded. It unblocks when the period resets, or immediately if you enable extra charges or move to a higher allowance.
  • Consum adiţional dezactivat: serviciul este blocat odată ce cota este atinsă, iar apelurile ulterioare returnează 429 limit_exceeded. Se deblochează la resetarea perioadei sau imediat dacă activezi consumul adiţional ori treci la o cotă mai mare.

Extrase counts differently. Its allowance is the number of accounts enabled right now, not requests. Blocking uses that live count, so disabling an account frees capacity immediately - you are never charged for an account you have turned off for the whole period.

Extrase se numără diferit. Cota lui este numărul de conturi active în acest moment, nu cereri. Blocarea folosește acel număr live, deci dezactivarea unui cont eliberează imediat capacitate - nu ești taxat niciodată pentru un cont pe care l-ai oprit pe toată perioada.

Enterprise organizations run on custom allowances negotiated per organization rather than the standard plan defaults.

Organizațiile Enterprise funcționează pe cote personalizate, negociate per organizație, în locul valorilor standard de plan.

This page describes how the limits behave, not their exact values - allowances and overage prices differ by plan and can change. See the billing / subscription page in your Fint dashboard, or fint.ro pricing, for the current numbers on your plan.

Această pagină descrie cum se comportă limitele, nu valorile lor exacte - cotele și prețurile de depășire diferă în funcție de plan și se pot modifica. Vezi pagina de facturare / abonament din dashboard-ul Fint sau prețurile de pe fint.ro pentru cifrele actuale ale planului tău.

The two 429sCele două 429

Both limit systems surface as HTTP 429, but they mean different things and call for different responses. Always branch on the reason field.

Ambele sisteme de limite apar ca HTTP 429, dar înseamnă lucruri diferite și cer reacții diferite. Ramifică întotdeauna pe câmpul reason.

reasonMeaningSemnificațieWhat to doCe faci
rate_limited Too many requests in a short window (abuse ceiling).Prea multe cereri într-o fereastră scurtă (plafon anti-abuz). Wait the Retry-After seconds, then retry. Slow down tight loops.Așteaptă secundele din Retry-After, apoi reîncearcă. Încetinește buclele agresive.
limit_exceeded Monthly plan allowance reached with extra charges off.Cota lunară a planului atinsă cu consum adiţional dezactivat. Enable extra charges, raise the plan, or wait for the billing period to reset. Retrying alone will not help.Activează consumul adiţional, mărește planul sau așteaptă resetarea perioadei de facturare. Simpla reîncercare nu ajută.

Both codes are also listed where they occur: limit_exceeded in Authentication errors and on each service’s reference page (eFactura, Extrase, Info CUI, Schimb valutar). Request format, pagination and the response envelope are covered under Conventions.

Ambele coduri sunt listate și acolo unde apar: limit_exceeded în Erori de autentificare și pe pagina de referință a fiecărui serviciu (eFactura, Extrase, Info CUI, Schimb valutar). Formatul cererii, paginarea și envelopa de răspuns sunt tratate la Convenții.

ReferenceReferință

Self-service APIAPI self-service

Most operations you would perform in the Fint dashboard (/ui) are also available through the API, so you can provision and operate entities programmatically - no manual UI steps.

Majoritatea operațiunilor pe care le-ai face în panoul Fint (/ui) sunt disponibile și prin API, astfel încât poți provisiona și opera entități programatic - fără pași manuali în interfață.

Two building blocks make this possible. The Organization API manages organization-level resources - create companies, activate or deactivate services, and issue company API keys - using your organization key alone. Per-service onboarding endpoints (eFactura and Extrase) generate a browser link your end-user opens to grant ANAF or bank (PSD2) consent, so even consent flows can be triggered straight from the API.

Două componente fac asta posibil. API-ul Organizație gestionează resursele la nivel de organizație - creează companii, activează sau dezactivează servicii și emite chei API de companie - folosind doar cheia de organizație. Endpoint-urile de onboarding per serviciu (eFactura și Extrase) generează un link de browser pe care utilizatorul final îl deschide pentru a acorda consimțământul ANAF sau bancar (PSD2), astfel încât și fluxurile de consimțământ pot fi declanșate direct din API.

Enterprise plan. The Organization API capabilities below require the Enterprise plan. On other plans these are managed in the UI, and the API returns 403 enterprise_required.

Plan Enterprise. Capabilitățile API-ului Organizație de mai jos necesită planul Enterprise. Pe alte planuri acestea se gestionează în interfață, iar API-ul returnează 403 enterprise_required.

UI vs APIInterfață vs API

CapabilityCapabilitateUI (/ui)Interfață (/ui)Self-service APIAPI self-service
Create company (license)Creare companie (licență)YesDaYes - Organization API EnterpriseDa - API Organizație Enterprise
List companiesListare companiiYesDaYes - Organization API EnterpriseDa - API Organizație Enterprise
Activate / deactivate a service on a companyActivare / dezactivare serviciu pe o companieYesDaYes - Organization API EnterpriseDa - API Organizație Enterprise
Create company API keyCreare cheie API de companieYesDaYes - Organization API EnterpriseDa - API Organizație Enterprise
Create organization (master) API keyCreare cheie API de organizație (master)YesDaNo - UI onlyNu - doar în interfață
Generate sandbox keysGenerare chei sandboxYesDaNo - UI onlyNu - doar în interfață
eFactura ANAF consent onboardingOnboarding consimțământ ANAF eFacturaYesDaYes - onboarding endpointDa - endpoint onboarding
Extrase bank (PSD2) consent onboardingOnboarding consimțământ bancar (PSD2) ExtraseYesDaYes - onboarding endpointDa - endpoint onboarding
Manage users / rolesGestionare utilizatori / roluriYesDaNo - UI onlyNu - doar în interfață

See the Organization API for request and response shapes, and Account model for how organizations, companies, and keys fit together.

Vezi API-ul Organizație pentru formatele de cerere și răspuns și Modelul de cont pentru cum se leagă organizațiile, companiile și cheile.

ReferenceReferință

ChangelogJurnal de modificări

Every update shipped to the Fint production platform, newest first. A new entry is recorded automatically on each production release.

Fiecare actualizare livrată în producție pentru platforma Fint, cele mai recente primele. O intrare nouă este înregistrată automat la fiecare lansare în producție.

v1.0.1.19 17/08/2026

Performance and security improvements.

v1.0.1.18 15/08/2026

Improvements for eFactura ANAF onboarding flow

v1.0.1.17 15/08/2026

Performance and security improvements.

v1.0.1.16 15/08/2026

Performance and security improvements.

v1.0.1.15 15/08/2026

New bank supported for Extrase service: Salt Bank

v1.0.1.14 15/08/2026

Performance and security improvements.

v1.0.1.13 12/08/2026

Performance and security improvements.

v1.0.1.12 12/08/2026

Added webhooks for real-time event notifications.

v1.0.1.11 11/08/2026

Performance and security improvements.

v1.0.1.10 11/08/2026

Performance and security improvements.

v1.0.1.9 08/08/2026

Performance and security improvements.

v1.0.1.8 07/08/2026

Performance and security improvements.

v1.0.1.7 07/08/2026

Performance and security improvements.

v1.0.1.6 07/08/2026

Performance and security improvements.

v1.0.1.5 07/08/2026

Performance and security improvements.

v1.0.1.4 07/08/2026

Performance and security improvements.

v1.0.1.3 07/08/2026

Performance and security improvements.

v1.0.1.2 06/08/2026

New bank supported for Extrase service: ProCredit Bank

Performance and security improvements.

v1.0.1.1 06/08/2026

Performance and security improvements.

v1.0.1.0 06/08/2026

Reconciliation: bank transactions and eFactura documents are now matched automatically, with scored suggestions in the API (suggestedReconciliation) and the UI.

v1.0.0
v1.0.0.79 06/08/2026

New bank supported for Extrase service: Exim Banca Romaneasca

New bank supported for Extrase service: Vista Bank

Performance and security improvements.

v1.0.0.78 06/08/2026

Performance and security improvements.

v1.0.0.77 06/08/2026

Performance and security improvements.

v1.0.0.76 06/08/2026

Performance and security improvements.

v1.0.0.75 04/08/2026

Performance and security improvements.

v1.0.0.74 04/08/2026

Performance and security improvements.

v1.0.0.73 04/08/2026

Performance and security improvements.

v1.0.0.72 03/08/2026

Performance and security improvements.

v1.0.0.71 30/07/2026

eFactura: corrected document totals on lines carrying discounts. The API line field lineExtensionAmount was renamed to value.

v1.0.0.70 30/07/2026

Performance and security improvements.

v1.0.0.69 30/07/2026

Performance and security improvements.

v1.0.0.68 30/07/2026

Performance and security improvements.

v1.0.0.67 24/07/2026

Performance and security improvements.

v1.0.0.66 22/07/2026

Performance and security improvements.

v1.0.0.65 22/07/2026

Performance and security improvements.

v1.0.0.64 19/07/2026

Performance and security improvements.

v1.0.0.63 19/07/2026

Performance and security improvements.

v1.0.0.62 19/07/2026

Performance and security improvements.

v1.0.0.61 18/07/2026

Performance and security improvements.

v1.0.0.60 18/07/2026

Performance and security improvements.

v1.0.0.59 18/07/2026

Performance and security improvements.

v1.0.0.58 18/07/2026

Performance and security improvements.

v1.0.0.57 18/07/2026

Performance and security improvements.

v1.0.0.56 18/07/2026

Performance and security improvements.

v1.0.0.55 18/07/2026

Performance and security improvements.

v1.0.0.54 18/07/2026

Performance and security improvements.

v1.0.0.53 18/07/2026

Info CUI: responses now include a financials object with the company's full balance sheet (bilanț) history filed with ANAF.

v1.0.0.52 17/07/2026

Performance and security improvements.

v1.0.0.51 17/07/2026

Performance and security improvements.

v1.0.0.50 17/07/2026

Performance and security improvements.

v1.0.0.49 12/07/2026

Performance and security improvements.

v1.0.0.48 12/07/2026

Performance and security improvements.

v1.0.0.47 12/07/2026

API: version discovery at the API root, stricter validation of the document status filter, and consistent monetary values in responses.

v1.0.0.46 12/07/2026

Sandbox: mock responses match the live API response shapes.

v1.0.0.45 12/07/2026

Performance and security improvements.

v1.0.0.44 12/07/2026

Performance and security improvements.

v1.0.0.43 09/07/2026

Performance and security improvements.

v1.0.0.42 09/07/2026

Performance and security improvements.

v1.0.0.41 09/07/2026

Performance and security improvements.

v1.0.0.40 09/07/2026

Performance and security improvements.

v1.0.0.39 09/07/2026

Performance and security improvements.

v1.0.0.37 08/07/2026

Performance and security improvements.

v1.0.0.36 08/07/2026

Performance and security improvements.

v1.0.0.35 08/07/2026

Performance and security improvements.

v1.0.0.34 08/07/2026

Performance and security improvements.

v1.0.0.33 06/07/2026

Performance and security improvements.

v1.0.0.32 06/07/2026

Performance and security improvements.

v1.0.0.31 06/07/2026

Performance and security improvements.

v1.0.0.30 06/07/2026

Performance and security improvements.

v1.0.0.29 06/07/2026

Extrase: bank consents can now be deleted from the UI.

v1.0.0.28 04/07/2026

eFactura: ANAF authorizations remain valid for their full 365-day lifetime.

v1.0.0.27 04/07/2026

Performance and security improvements.

v1.0.0.26 04/07/2026

Performance and security improvements.

v1.0.0.25 03/07/2026

Performance and security improvements.

v1.0.0.24 03/07/2026

API: rate limiting introduced across all endpoints - see Limits.

v1.0.0.23 02/07/2026

Schimb valutar: exchange rates for dates in previous years are now available.

v1.0.0.22 02/07/2026

Performance and security improvements.

v1.0.0.21 02/07/2026

Notifications: per-category email preferences, plus reminders before a bank consent expires.

v1.0.0.20 02/07/2026

Performance and security improvements.

v1.0.0.19 02/07/2026

Performance and security improvements.

v1.0.0.18 02/07/2026

Performance and security improvements.

v1.0.0.17 02/07/2026

Performance and security improvements.

v1.0.0.16 01/07/2026

Performance and security improvements.

v1.0.0.15 01/07/2026

UI: new home page with service cards and usage statistics.

v1.0.0.14 30/06/2026

Performance and security improvements.

v1.0.0.13 30/06/2026

UI: Info CUI and Schimb valutar pages.

v1.0.0.12 30/06/2026

Performance and security improvements.

v1.0.0.11 30/06/2026

Performance and security improvements.

v1.0.0.10 30/06/2026

Performance and security improvements.

v1.0.0.9 30/06/2026

Performance and security improvements.

v1.0.0.8 30/06/2026

Performance and security improvements.

v1.0.0.7 30/06/2026

Performance and security improvements.

v1.0.0.6 30/06/2026

Performance and security improvements.

v1.0.0.5 30/06/2026

Performance and security improvements.

v1.0.0.4 30/06/2026

API: endpoint discovery at the API root.

v1.0.0.3 29/06/2026

Performance and security improvements.

v1.0.0.2 29/06/2026

Performance and security improvements.

v1.0.0.1 29/06/2026

Performance and security improvements.

v1.0.0.0 29/06/2026

First production release of the Fint platform.

Migration guideGhid de migrare

Migrating from apiefactura.roMigrare de la apiefactura.ro

apiefactura.ro is winding down: it no longer accepts new registrations, and all new e-Factura integrations move to Fint. This guide maps the apiefactura.ro API onto Fint’s eFactura API so you can switch with minimal changes.

apiefactura.ro se închide: nu mai acceptă înregistrări noi, iar toate integrările e-Factura noi se mută pe Fint. Acest ghid mapează API-ul apiefactura.ro peste API-ul eFactura al Fint, ca să poți migra cu modificări minime.

Same model, different names. Both APIs are asynchronous and JSON-in: you post one invoice as JSON, the service builds the UBL XML and submits it to ANAF for you, and you poll for the final status. Migration is mostly renaming fields, swapping authentication, and adding a one-time ANAF consent step.

Același model, alte denumiri. Ambele API-uri sunt asincrone și primesc JSON: trimiți o factură ca JSON, serviciul construiește XML-ul UBL și îl transmite la ANAF în locul tău, iar tu interoghezi statusul final. Migrarea înseamnă în principal redenumirea câmpurilor, schimbarea autentificării și un pas unic de consimțământ ANAF.

What changesCe se schimbă

AreaAspectapiefactura.roFint
Base URLURL de bazăhttps://secure.apiefactura.ro/apihttps://api.fint.ro/v1
AuthAutentificareApikey + ApipasswordX-Org-Key + X-Api-Key
Invoice bodyCorp facturăJSON wrapped in documentDataJSON învelit în documentDataFlat JSON, no wrapperJSON simplu, fără înveliș
Document idId documentNumeric idid numericString uiduid text
ErrorsEroriAlways HTTP 200; branch on statusMereu HTTP 200; ramifici pe statusReal HTTP codes; branch on reasonCoduri HTTP reale; ramifici pe reason
ANAF consentConsimțământ ANAFHandled per license, out of bandGestionat per licență, în afara API-uluiExplicit onboarding, required before /sendOnboarding explicit, necesar înainte de /send

Before you startÎnainte să începi

Set up three things in Fint once:

Configurează o singură dată trei lucruri în Fint:

  1. Get two API keys. Create an organization key at /ui/organization/apikeys and a company key at /ui/company/apikeys. Both are sent on every request; the company (CUI) is resolved from the company key, so you never pass a CUI for authentication.
  2. Obține două chei API. Creează o cheie de organizație la /ui/organization/apikeys și o cheie de companie la /ui/company/apikeys. Ambele se trimit la fiecare cerere; compania (CUI) este dedusă din cheia de companie, deci nu trimiți niciodată un CUI pentru autentificare.
  3. Enable the eFactura service on that company key and on the company’s license.
  4. Activează serviciul eFactura pe cheia de companie și pe licența companiei.
  5. Complete ANAF consent. This is the one genuinely new step. Before /send works, the company must grant Fint access to ANAF e-Factura for its CUI - via the Fint UI or the onboarding endpointendpoint-ul de onboarding. Without it, /send returns 403 efactura_consent_required.
  6. Finalizează consimțământul ANAF. Acesta este singurul pas cu adevărat nou. Înainte ca /send să funcționeze, compania trebuie să acorde Fint acces la ANAF e-Factura pentru CUI-ul ei - prin interfața Fint sau prin onboarding endpointendpoint-ul de onboarding. Fără el, /send returnează 403 efactura_consent_required.

Full detail is in the eFactura API reference.

Detaliile complete sunt în referința API eFactura.

Base URL & authenticationURL de bază și autentificare

apiefactura.ro used two custom headers matched against your license. Fint uses two keys as well, but they are separate concerns: an organization key and a company key.

apiefactura.ro folosea două antete personalizate verificate față de licența ta. Fint folosește tot două chei, dar cu roluri separate: o cheie de organizație și o cheie de companie.

apiefactura.roFintNotesNote
ApikeyX-Org-KeyOrganization key, format org_live_…Cheie de organizație, format org_live_…
ApipasswordX-Api-KeyCompany key, format key_live_… (may also be sent as Authorization: Bearer)Cheie de companie, format key_live_… (poate fi trimisă și ca Authorization: Bearer)

Check HTTP status codes now. apiefactura.ro returned 200 OK for everything and you branched on the JSON status field. Fint returns real HTTP codes (201, 422, …) and a stable reason string. Branch on reason, not on the message text.

Verifică acum codurile HTTP. apiefactura.ro returna 200 OK pentru tot și ramificai pe câmpul JSON status. Fint returnează coduri HTTP reale (201, 422, …) și un reason stabil. Ramifică pe reason, nu pe textul mesajului.

Endpoint mappingMaparea endpoint-urilor

apiefactura.roFintNotesNote
POST /sendDocumentPOST /v1/efactura/sendSubmit one outgoing invoiceTrimite o factură de ieșire
POST /getDocumentGET /v1/efactura/document/{uid}The id is now a uid in the path, not a body fieldid devine uid în cale, nu câmp în corp
POST /getDocumentsGET /v1/efactura/documentsQuery params ?type=all|outgoing|incoming&status&limit&offset replace the {start} cursorParametrii ?type=all|outgoing|incoming&status&limit&offset înlocuiesc cursorul {start}
POST /downloadPdf / downloadZipGET /v1/efactura/download/{uid}?type=pdf|xmlStreams the file bytes directly (not a URL to a file); zip aliases xmlTransmite direct octeții fișierului (nu un URL); zip este alias pentru xml
POST /testDocumentSandbox POST /v1/efactura/sendSandbox POST /v1/efactura/sendUse the sandbox for dry runs; it runs the same structural validation without touching ANAFFolosește sandbox-ul pentru teste; rulează aceeași validare structurală fără a atinge ANAF
GET /testAuth- (any authenticated call)- (orice apel autentificat)No dedicated endpoint; e.g. call GET /v1/efactura/documents to confirm keysFără endpoint dedicat; ex. apelează GET /v1/efactura/documents pentru a verifica cheile
GET /getLicenseGET /v1/efactura/consentIts practical use - “is my access still valid?” - maps to the consent check: returns consentStatus and validUntil, or data: null if no enabled consent. Company/plan metadata lives in the Fint UI, or the Organization API (Enterprise).Utilizarea practică - „mai am acces valid?” - corespunde verificării consimțământului: returnează consentStatus și validUntil, sau data: null dacă nu există consimțământ activ. Metadatele de companie/plan sunt în interfața Fint sau în API-ul Organizație (Enterprise).

Invoice payload mappingMaparea câmpurilor facturii

Drop the documentData wrapper and send fields at the top level. Seller and client fields, which were flat, become nested from and to objects with an address.

Renunță la învelișul documentData și trimite câmpurile la nivelul de sus. Câmpurile de vânzător și client, care erau simple, devin obiecte from și to cu un address.

apiefactura.roFintNotesNote
numberdocumentNumberRequired, non-emptyObligatoriu, nevid
issueDatedocumentDateYYYY-MM-DDYYYY-MM-DD
currencycurrencyMust be RON.Trebuie să fie RON.
invoiceCodedocumentTypeCodeSame UNCL 1001 set: 380, 381, 384, 389, 751; default 380Același set UNCL 1001: 380, 381, 384, 389, 751; implicit 380
name, address, city, subdivision, countryfrom.name, from.address.{line, city, countrySubdivision, country}Add from.cui - your company CUI, which must equal the enabled consent CUI. On apiefactura.ro the seller CUI came from the license; on Fint you send it explicitly.Adaugă from.cui - CUI-ul companiei tale, care trebuie să coincidă cu CUI-ul consimțământului activ. Pe apiefactura.ro CUI-ul vânzătorului venea din licență; pe Fint îl trimiți explicit.
clientCui, clientName, clientAddress, clientCity, clientSubdivision, clientCountryto.cui, to.name, to.address.{line, city, countrySubdivision, country}B2C: use CUI 0000000000000 or the client CNP, as beforeB2C: folosește CUI 0000000000000 sau CNP-ul clientului, ca înainte
regCom, clientRegComfrom.regCom, to.regComTrade register numbers, same values and same format (J40/12813/2016). from.regCom is optional on Fint: leave it out and it is filled from Info CUI by from.cui.Numerele de la registrul comerțului, aceleași valori și același format (J40/12813/2016). from.regCom este opțional pe Fint: dacă îl omiți, este completat din Info CUI după from.cui.
email- (not required)- (nu este necesar)Fint does not require a seller emailFint nu cere email de vânzător
iban + bankpaymentMeansObject: { paymentMeansCode, iban, paymentId }; paymentMeansCode (UNCL 4461, e.g. 30) required when presentObiect: { paymentMeansCode, iban, paymentId }; paymentMeansCode (UNCL 4461, ex. 30) necesar când e prezent
note, deliveryDatenote, deliveryDateSame, at header levelLa fel, la nivel de antet
items[].{name, price, quantity, vatRate, vatScheme}items[].{name, quantity, price, vatRate, vatScheme}Same fields. VAT schemes unchanged (UNCL 5305: S, Z, E, AE, K, G, O, L, M)Aceleași câmpuri. Schemele TVA neschimbate (UNCL 5305: S, Z, E, AE, K, G, O, L, M)
items[].vatexCodeitems[].vatexCodeSame VAT exemption code; also vatexReason, classificationCode + classificationListAcelași cod de scutire TVA; și vatexReason, classificationCode + classificationList

Addresses are normalized for you. As on apiefactura.ro, you do not pre-format addresses to CIUS-RO. Fint accepts county names (e.g. Cluj) or codes (RO-CJ), handles Bucharest sectors, and fills a missing city or subdivision from Info CUI by the party’s CUI.

Adresele sunt normalizate automat. Ca pe apiefactura.ro, nu preformatezi adresele la CIUS-RO. Fint acceptă nume de județ (ex. Cluj) sau coduri (RO-CJ), gestionează sectoarele Bucureștiului și completează orașul sau subdiviziunea lipsă din Info CUI după CUI-ul părții.

Send example, side by sideExemplu de trimitere, comparativ

apiefactura.ro - POST /sendDocumentapiefactura.ro - POST /sendDocument

json
{
  "documentData": {
    "number": "INV-1",
    "issueDate": "2026-03-21",
    "currency": "RON",
    "email": "[email protected]",
    "name": "Seller SRL",
    "address": "Str. Test 1",
    "city": "Bucuresti",
    "subdivision": "Bucuresti",
    "country": "RO",
    "clientCui": "12345678",
    "clientName": "Buyer SRL",
    "clientAddress": "Str. Client 2",
    "clientCity": "Bucuresti",
    "clientSubdivision": "Bucuresti",
    "clientCountry": "RO",
    "items": [
      { "name": "Service", "price": 100, "quantity": 1, "vatRate": 21, "vatScheme": "S" }
    ]
  }
}

Fint - POST /v1/efactura/sendFint - POST /v1/efactura/send

bash
curl -sS -X POST 'https://api.fint.ro/v1/efactura/send' \
  -H 'X-Org-Key: YOUR_ORG_KEY' \
  -H 'X-Api-Key: YOUR_COMPANY_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "documentNumber": "INV-1",
    "documentDate": "2026-03-21",
    "currency": "RON",
    "from": {
      "cui": "34790982",
      "name": "Seller SRL",
      "address": { "line": "Str. Test 1", "city": "Bucuresti", "postalCode": "010001", "countrySubdivision": "Bucuresti", "country": "RO" },
      "regCom": "J40/12813/2016"
    },
    "to": {
      "cui": "12345678",
      "name": "Buyer SRL",
      "address": { "line": "Str. Client 2", "city": "Bucuresti", "postalCode": "010002", "countrySubdivision": "Bucuresti", "country": "RO" },
      "regCom": "J40/8853/2015"
    },
    "items": [
      { "name": "Service", "quantity": 1, "price": 100, "vatRate": 21, "vatScheme": "S" }
    ]
  }'

Success responseRăspuns de succes

json
{
  "status": "success",
  "msg": "Document has been validated with Fint. Pending upload and ANAF confirmation.",
  "reason": null,
  "data": { "uid": "a1b2c3d4-e5f6-4789-a012-3456789abcde", "status": "pending" }
}

Keep the uid: you use it to poll status and to download the PDF or signed XML.

Păstrează uid-ul: îl folosești pentru a interoga statusul și pentru a descărca PDF-ul sau XML-ul semnat.

Document statusStatusul documentului

The lifecycle is the same shape with renamed states. Poll GET /v1/efactura/document/{uid} until the status is terminal.

Ciclul de viață are aceeași formă, cu stări redenumite. Interoghează GET /v1/efactura/document/{uid} până când statusul este final.

apiefactura.roFintMeaningSemnificație
lobbypendingValidated by the service, queued for ANAF uploadValidat de serviciu, în coadă pentru încărcare la ANAF
pendingsentUploaded to ANAF, awaiting confirmationÎncărcat la ANAF, în așteptarea confirmării
validatedvalidatedAccepted by ANAFAcceptat de ANAF
errorsrejected / failedrejected = ANAF rejected it; failed = processing failure (see errorMessage)rejected = respins de ANAF; failed = eroare de procesare (vezi errorMessage)

Incoming documents (your inbox) are no longer a separate endpoint - list them with GET /v1/efactura/documents?type=incoming.

Documentele de intrare (inbox-ul tău) nu mai au un endpoint separat - listează-le cu GET /v1/efactura/documents?type=incoming.

Error handlingGestionarea erorilor

apiefactura.ro returned { status, message, errors[] } at HTTP 200. Fint returns { status, msg, reason, data } with a real HTTP code; validation failures list machine-readable codes under data.errors[].

apiefactura.ro returna { status, message, errors[] } la HTTP 200. Fint returnează { status, msg, reason, data } cu un cod HTTP real; erorile de validare listează coduri procesabile în data.errors[].

CaseCazapiefactura.roFint
Bad credentialsCredențiale greșite200, "API autentification failed."200, "API autentification failed."401 missing_api_key / 403 api_key_disabled
Invalid invoiceFactură invalidă200, errors[] strings200, string-uri în errors[]422 validation_failed, data.errors[].code
Duplicate numberNumăr duplicat200, "Duplicated document number"200, "Duplicated document number"409 duplicate_document, data.existingDocumentUid
Quota reachedLimită atinsă200, "License document limit has been reached."200, "License document limit has been reached."429 limit_exceeded
No consentFără consimțământ- (consent handled per license)- (consimțământ per licență)403 efactura_consent_required

Testing with the sandboxTestare cu sandbox

apiefactura.ro’s testDocument validated a document without uploading. On Fint, use the mocked sandbox at https://sandbox.fint.ro/v1: same paths and envelope, same structural validation, but it never touches ANAF.

Endpoint-ul testDocument de la apiefactura.ro valida un document fără a-l încărca. Pe Fint, folosește sandbox-ul simulat la https://sandbox.fint.ro/v1: aceleași căi și înveliș, aceeași validare structurală, dar nu atinge niciodată ANAF.

  • Generate separate sandbox keys (org_sandbox_…, key_sandbox_…) from the same API-keys pages; live keys are rejected on the sandbox and vice-versa.
  • Generează chei sandbox separate (org_sandbox_…, key_sandbox_…) din aceleași pagini de chei API; cheile live sunt respinse pe sandbox și invers.
  • The sandbox consent CUI is 123456, so from.cui must be 123456 (or RO123456) there.
  • CUI-ul de consimțământ din sandbox este 123456, deci from.cui trebuie să fie 123456 (sau RO123456) acolo.

See the Sandbox API and the full eFactura reference for every field, error code, and example.

Vezi API-ul Sandbox și referința eFactura completă pentru fiecare câmp, cod de eroare și exemplu.