API documentation

Contents

The API is REST and answers in JSON. The full description, in OpenAPI 3.1 format, is at https://api.apifirme.dev/openapi.json?lang=en; this page is generated from it. Field names and values are those of the Romanian registries (denumire is the name, judet the county, stare the status).

Authentication

Every request, except the validation ones, needs an API key in the Authorization header:

curl https://api.apifirme.dev/rest/v1/companies/13548146 \
  -H "Authorization: Bearer af_live_..."

Limits

Every response says how much is left of the limits: x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-reset for the requests per minute, x-quota-limit and x-quota-remaining for those of the month. A request over the limit gets 429 with a Retry-After header and is not counted. Beyond the plan's monthly number of requests another 5 % are allowed, at no cost; only after those are requests refused.

Conditional requests

Every 200 response has an ETag header. A request that sends it back in If-None-Match gets 304 without a body if the response has not changed; it counts as a request too.

Errors

Errors follow RFC 7807: the content type is application/problem+json, and the body has type, title, status and detail. type identifies the kind of error, for example https://apifirme.dev/problems/invalid-cui.

For AI assistants

The same data is available as tools through the Model Context Protocol, at https://api.apifirme.dev/mcp (Streamable HTTP transport): lookup_company, check_invoice, get_financials, get_company_events, get_fx_rate, count_new_companies and list_new_companies. An assistant sends its user to sign in (OAuth 2.1); a program can send the same API key in the Authorization header. Only tool calls are counted, each as one request; connecting and listing the tools are not. The steps for each assistant are at https://apifirme.dev/en/ai.

Sources

Every company and every financial statement has a sources field: which registry the information comes from, which dataset, and when it was first and last retrieved.

Companies

A company's data, by its CUI (the Romanian unique registration code).

GET /rest/v1/companies/{cui}

A company's data. Returns the company with this CUI. If the company is not in the database yet, it is looked up at ANAF (the Romanian tax administration) right away: the answer comes in the same request or, if the source is slow, as 202 with a Retry-After header. For a natural person (a sole trader: PFA, individual or family enterprise) the answer is 404.

ParameterWhereDescription
cuiin the path, requiredThe unique registration code (CUI), with or without the RO prefix, for example 13548146.
curl https://api.apifirme.dev/rest/v1/companies/13548146 \
  -H "Authorization: Bearer af_live_..."

Responses:

CodeWhat it means
200The company.
202The company is being looked up at ANAF and did not arrive in time. Repeat the request after the number of seconds in Retry-After. Does not count as a request.
400A parameter is missing or not valid; detail says which.
401The API key is missing or not valid.
404Does not exist: an unregistered CUI, a natural person, or no data for the day or year requested.
429The limit per minute or the month's number of requests has been exceeded. Does not count as a request.
503The company is not in the database and ANAF could not be asked right now. Does not count as a request.

The 200 response is a Company object:

FieldTypeDescription
cuiintegerThe unique registration code (CUI).
denumirestring or nullThe name.
nr_reg_comstring or nullThe registration number in the trade register.
euidstring or nullThe European unique identifier (source: ONRC, the trade register).
sediu_secundarbooleanWhether it is the secondary seat of a company, registered at ANAF with a CUI of its own.
forma_juridicastring or nullThe legal form as ANAF writes it.
forma_juridica_codstring or nullThe legal form from the trade register: SRL, SA, ...
starestring or nullThe status, in one word: FUNCTIUNE (in operation), SUSPENDARE (suspended), REORGANIZARE JUDICIARA (judicial reorganisation), INSOLVENTA (insolvency), DIZOLVARE (dissolution), LICHIDARE (liquidation), FALIMENT (bankruptcy), RADIERE (struck off).
stari_registruarrayAll statuses and remarks from the trade register, each with cod (code) and denumire (name).
caeninteger or nullThe CAEN code of the main activity (source: ANAF). CAEN is the Romanian classification of economic activities, aligned with NACE.
caen_denumirestring or nullThe name of the CAEN code, in the classification in force.
caen_autorizatearray or nullThe activities the company is authorised for, from the trade register's open data: each with cod (code), versiune (the version of the CAEN classification it was declared in: 3 is the one of 2025, 2 the one of 2008, 1 the one of 2003, 0 the one of 1998) and denumire (name), the newest classification first. The register also keeps what was declared in the old classifications, so the same activity can appear with codes of several versions. null when they are not known (the company is not in the register's dataset), which does not mean that it has none.
data_inregistraredate or nullThe date of fiscal registration (source: ANAF).
data_inmatricularedate or nullThe date of entry in the trade register (source: ONRC).
webstring or nullThe web address declared to the trade register.
judetstring or nullThe county code of the registered office: SB, B, ...
localitatestring or nullThe locality of the registered office.
adresa_completastring or nullThe address of the registered office, as one text.
cod_postalstring or nullThe postal code.
telefonstring or nullThe telephone number declared to ANAF.
scp_tvabooleanWhether it is registered for VAT.
data_inceput_tvadate or nullSince when it has been registered for VAT.
data_sfarsit_tvadate or nullUntil when it was registered, if it no longer is.
tva_incasarebooleanWhether it applies VAT on collection.
split_tvabooleanWhether it applies split VAT payment.
status_inactivbooleanWhether it is declared fiscally inactive.
data_inactivaredate or nullSince when it has been inactive.
e_facturabooleanWhether it is in the RO e-Factura register.
updated_atdate-time or nullWhen something in the company's data last changed.
checked_atdate-time or nullWhen ANAF was last asked about the company; null if not yet.
sourcesarray of SourceWhich sources the company's data comes from, and since when.

POST /rest/v1/companies/batch

Several companies in one request. Up to 100 CUIs in a single request, answered from what is already in the database. It costs as many requests as the CUIs it answers for: one for each company returned and for each CUI we serve no data about, and one at least. A CUI that is not in the database yet appears in not_stored, costs nothing and can be asked for by itself, with GET /rest/v1/companies/{cui}, which looks it up at ANAF right away. For the limit per minute, a request for several companies is one request.

The request body is a BatchRequest object:

FieldTypeDescription
cuisarrayBetween 1 and 100 CUIs, as text or as numbers, with or without the RO prefix.
curl -X POST https://api.apifirme.dev/rest/v1/companies/batch \
  -H "Authorization: Bearer af_live_..." \
  -H "Content-Type: application/json" \
  -d '{"cuis": ["13548146", "RO4221306"]}'

Responses:

CodeWhat it means
200The companies found, and what became of the other CUIs.
400A parameter is missing or not valid; detail says which.
401The API key is missing or not valid.
429The limit per minute or the month's number of requests has been exceeded. Does not count as a request.

The 200 response is a BatchResult object:

FieldTypeDescription
dataarray of CompanyThe companies found, in the order in which they were asked for.
withheldarrayThe CUIs under which there is an entry we serve no data about: a natural person, or one not classified yet.
not_storedarrayThe valid CUIs that are not in the database yet. They cost nothing; asked for by themselves, they are looked up at ANAF.
invalidarrayWhat is not a valid CUI, as it was received.

Find a company without its CUI. Finds a company by its name or by its trade register number, for whoever does not know its CUI. Exactly one of denumire and nr_reg_com is given. By name, the companies called exactly that come first, with or without the legal form (“dedeman” finds “DEDEMAN SRL”), then those whose name begins with it, then those that contain all its words, in any order. Diacritics and capital letters do not matter, and companies in operation come before the others. The answer has at most 10 companies, each with a few fields, and no next page: more says that others match as well, and then the county or a more exact name helps. A company's full data is requested with its CUI. Natural persons and secondary seats are not among the results. A search costs one request and has a limit per minute of its own, by plan; beyond it the answer is 429 with searches-limited.

ParameterWhereDescription
denumirein the queryThe company's name or a part of it: at least one word of three letters or digits, beside the legal form.
nr_reg_comin the queryThe trade register number, in the old form (J32/508/2000) or the new one (J2000000508324), whichever way we store it. Numbers that begin with F belong to natural persons, about whom no data is served.
judetin the queryWith denumire only: one county's code, as on number plates (SB, B for Bucharest).
curl https://api.apifirme.dev/rest/v1/companies/search \
  -H "Authorization: Bearer af_live_..."

Responses:

CodeWhat it means
200The companies found.
400A parameter is missing or not valid; detail says which.
401The API key is missing or not valid.
429The limit per minute or the month's number of requests has been exceeded. Does not count as a request.

The 200 response is a SearchResult object:

FieldTypeDescription
dataarray of CompanyFoundThe companies found, the closest first: at most 10.
morebooleantrue if other companies match beside those returned.

GET /rest/v1/companies/{cui}/events

What changed at a company. The changes observed at the company since we have been following it, the most recent first (200 at most): registration for VAT or removal from it, VAT on collection, split VAT payment, being declared inactive and being reactivated, being struck off, a change of status, name, address or CAEN code, RO e-Factura. A change is noted when ANAF's answer about the company differs from its previous answer; what was before our first answer from ANAF does not appear, and the list is empty if nothing has been observed. That a company is new is not an event here: that is what registrations is for.

ParameterWhereDescription
cuiin the path, requiredThe unique registration code (CUI), with or without the RO prefix, for example 13548146.
curl https://api.apifirme.dev/rest/v1/companies/13548146/events \
  -H "Authorization: Bearer af_live_..."

Responses:

CodeWhat it means
200The changes observed at the company.
400A parameter is missing or not valid; detail says which.
401The API key is missing or not valid.
404Does not exist: an unregistered CUI, a natural person, or no data for the day or year requested.
429The limit per minute or the month's number of requests has been exceeded. Does not count as a request.

The 200 response is a EventsList object:

FieldTypeDescription
cuiintegerThe company's CUI.
eventsarray of EventThe changes observed, the most recent first.

GET /rest/v1/invoice-check/{cui}

Check before invoicing. Answers, in a single request, what an invoicing program wants to know about a customer: whether it exists, is registered for VAT, applies VAT on collection, is fiscally inactive, is in the RO e-Factura register. If ANAF's last answer about the company is more than 24 hours old, the company is asked about again right away; checked_at says how old the data is. A valid CUI that ANAF does not know gets 200 with exists: false.

ParameterWhereDescription
cuiin the path, requiredThe unique registration code (CUI), with or without the RO prefix, for example 13548146.
curl https://api.apifirme.dev/rest/v1/invoice-check/13548146 \
  -H "Authorization: Bearer af_live_..."

Responses:

CodeWhat it means
200The result of the check.
202The company is being looked up at ANAF and did not arrive in time. Repeat the request after the number of seconds in Retry-After. Does not count as a request.
400A parameter is missing or not valid; detail says which.
401The API key is missing or not valid.
404Does not exist: an unregistered CUI, a natural person, or no data for the day or year requested.
429The limit per minute or the month's number of requests has been exceeded. Does not count as a request.
503The company is not in the database and ANAF could not be asked right now. Does not count as a request.

The 200 response is a InvoiceCheck object:

FieldTypeDescription
cuiintegerThe unique registration code (CUI).
existsbooleanWhether ANAF knows a taxpayer with this CUI.
denumirestring or nullThe name.
valid_for_invoicingbooleanWhether the company exists, is not struck off and is not fiscally inactive.
vat_registeredbooleanWhether it is registered for VAT.
vat_numberstring or nullThe VAT number (RO followed by the CUI), if it is registered for VAT.
vat_on_collectionbooleanWhether it applies VAT on collection.
split_vatbooleanWhether it applies split VAT payment.
inactivebooleanWhether it is declared fiscally inactive.
struck_offbooleanWhether it is struck off.
efactura_registeredbooleanWhether it is in the RO e-Factura register.
starestring or nullThe status, in one word, as in the company's data.
checked_atdate-time or nullWhen ANAF last answered about the company.

Financial statements

The annual financial statements published by the Ministry of Finance.

GET /rest/v1/companies/{cui}/financials

A company's financial statements. All annual financial statements of the company, the most recent year first. The list is empty if there are none.

ParameterWhereDescription
cuiin the path, requiredThe unique registration code (CUI), with or without the RO prefix, for example 13548146.
curl https://api.apifirme.dev/rest/v1/companies/13548146/financials \
  -H "Authorization: Bearer af_live_..."

Responses:

CodeWhat it means
200The company's financial statements.
400A parameter is missing or not valid; detail says which.
401The API key is missing or not valid.
404Does not exist: an unregistered CUI, a natural person, or no data for the day or year requested.
429The limit per minute or the month's number of requests has been exceeded. Does not count as a request.

The 200 response is a FinancialsList object:

FieldTypeDescription
cuiintegerThe company's CUI.
financialsarray of StatementThe financial statements, the most recent year first.

GET /rest/v1/companies/{cui}/financials/{year}

The financial statement of one year.

ParameterWhereDescription
cuiin the path, requiredThe unique registration code (CUI), with or without the RO prefix, for example 13548146.
yearin the path, requiredThe year of the financial statement, for example 2025.
curl https://api.apifirme.dev/rest/v1/companies/13548146/financials/2025 \
  -H "Authorization: Bearer af_live_..."

Responses:

CodeWhat it means
200The financial statement of that year.
400A parameter is missing or not valid; detail says which.
401The API key is missing or not valid.
404Does not exist: an unregistered CUI, a natural person, or no data for the day or year requested.
429The limit per minute or the month's number of requests has been exceeded. Does not count as a request.

The 200 response is a Statement object:

FieldTypeDescription
cuiintegerThe company's CUI.
anintegerThe year of the financial statement.
tip_raportarestringThe Ministry of Finance's reporting type: UU (abbreviated balance sheet), BL_BS_SL, IR (IFRS), ONG (non-profit organisations), ...
tip_raportare_descrierestring or nullWhat kind of taxpayers file this type.
caeninteger or nullThe CAEN code from the financial statement.
caen_denumirestring or nullThe name of the code, in the classification in force in that year.
active_imobilizateinteger or nullFixed assets, total. In whole lei; null if the ministry does not publish the value.
active_circulanteinteger or nullCurrent assets, total. In whole lei; null if the ministry does not publish the value.
stocuriinteger or nullInventories. In whole lei; null if the ministry does not publish the value.
creanteinteger or nullReceivables. In whole lei; null if the ministry does not publish the value.
casa_bancainteger or nullCash and bank accounts. In whole lei; null if the ministry does not publish the value.
cheltuieli_avansinteger or nullPrepaid expenses. In whole lei; null if the ministry does not publish the value.
datoriiinteger or nullLiabilities. In whole lei; null if the ministry does not publish the value.
venituri_avansinteger or nullDeferred income. In whole lei; null if the ministry does not publish the value.
provizioaneinteger or nullProvisions. In whole lei; null if the ministry does not publish the value.
capitaluri_totalinteger or nullEquity, total. In whole lei; null if the ministry does not publish the value.
capital_socialinteger or nullSubscribed and paid-up share capital. In whole lei; null if the ministry does not publish the value.
patrimoniul_regieiinteger or nullPatrimony of the autonomous state enterprise (regie). In whole lei; null if the ministry does not publish the value.
cifra_afaceriinteger or nullNet turnover. In whole lei; null if the ministry does not publish the value.
venituri_totaleinteger or nullTotal income. In whole lei; null if the ministry does not publish the value.
cheltuieli_totaleinteger or nullTotal expenses. In whole lei; null if the ministry does not publish the value.
profit_brutinteger or nullGross profit. In whole lei; null if the ministry does not publish the value.
pierdere_brutainteger or nullGross loss. In whole lei; null if the ministry does not publish the value.
profit_netinteger or nullNet profit. In whole lei; null if the ministry does not publish the value.
pierdere_netainteger or nullNet loss. In whole lei; null if the ministry does not publish the value.
nr_mediu_salariatiinteger or nullAverage number of employees. In whole lei; null if the ministry does not publish the value.
alti_indicatoriarrayThe indicators this reporting type has in addition, each with cod (code), denumire (name) and valoare (value).
updated_atdate-timeWhen the statement last changed in our database.
sourcesarray of SourceThe dataset the statement comes from, when the ministry published it and when we retrieved it.

New companies

Newly registered companies, for those who want to learn every day which companies have appeared.

GET /rest/v1/registrations

Newly registered companies. The legal persons registered in the requested period, in the order in which they were indexed, paginated by cursor. The period is limited by the plan; a longer period is refused with 400, not silently shortened. Whoever asks daily must continue from next_cursor or, after the last page, send as discovered_after the discovered_at value of the last company received (not the time of their own clock and not the registration date): a company registered on a Monday may be indexed on the Friday, and companies become visible strictly in the order of discovered_at, so none is missed this way. A company can appear a second time, with a new discovered_at: when its CAEN code, county or legal form becomes known after it was indexed (a quarter of the new companies have no CAEN code yet on their first day). That way those who filter by these receive it too; it is recognised by its cui. Secondary seats and natural persons do not appear. Plans that do not include the list get 403.

ParameterWhereDescription
daysin the queryThe companies registered in the last so many days. Not together with registered_after.
registered_afterin the queryThe companies registered on or after this day.
discovered_afterin the queryOnly the companies we indexed after this moment (2026-10-01T08:00:00Z) or this day.
caenin the queryOne or more four-digit CAEN codes, separated by commas.
caen_prefixin the queryThe first two digits (the division) or three (the group) of the CAEN code.
judetin the queryOne or more county codes (SB, B), separated by commas.
forma_juridicain the queryOne or more legal forms, by the trade register's codes (SRL, SA), separated by commas.
limitin the queryHow many companies per page, between 1 and 500. 100 by default.
cursorin the queryThe next_cursor value from the previous answer.
curl https://api.apifirme.dev/rest/v1/registrations?days=7&judet=SB \
  -H "Authorization: Bearer af_live_..."

Responses:

CodeWhat it means
200A page of new companies.
400A parameter is missing or not valid; detail says which.
401The API key is missing or not valid.
403The plan does not include this request; upgrade_url leads to the plans.
429The limit per minute or the month's number of requests has been exceeded. Does not count as a request.

The 200 response is a RegistrationsPage object:

FieldTypeDescription
dataarray of RegistrationThe companies, in the order in which they were indexed.
next_cursorstring or nullTo be sent as cursor for the next page; null on the last page.
filterobjectThe filter applied, with the resulting period.

GET /rest/v1/registrations/count

The number of newly registered companies. How many companies match the filter. Included in every plan, over at most the longest period any plan offers. Without days or registered_after the last 30 days are counted.

ParameterWhereDescription
daysin the queryThe companies registered in the last so many days. Not together with registered_after.
registered_afterin the queryThe companies registered on or after this day.
discovered_afterin the queryOnly the companies we indexed after this moment (2026-10-01T08:00:00Z) or this day.
caenin the queryOne or more four-digit CAEN codes, separated by commas.
caen_prefixin the queryThe first two digits (the division) or three (the group) of the CAEN code.
judetin the queryOne or more county codes (SB, B), separated by commas.
forma_juridicain the queryOne or more legal forms, by the trade register's codes (SRL, SA), separated by commas.
curl https://api.apifirme.dev/rest/v1/registrations/count?days=30&caen_prefix=62 \
  -H "Authorization: Bearer af_live_..."

Responses:

CodeWhat it means
200The number of companies.
400A parameter is missing or not valid; detail says which.
401The API key is missing or not valid.
429The limit per minute or the month's number of requests has been exceeded. Does not count as a request.

The 200 response is a RegistrationsCount object:

FieldTypeDescription
countintegerThe number of companies that match the filter.
filterobjectThe filter applied, with the resulting period.
upgrade_required_for_recordsbooleanWhether the list of these companies needs a higher plan than the key's.

BNR exchange rates

The reference exchange rate of the National Bank of Romania (BNR), since 2005.

GET /rest/v1/fx/latest

The latest published rate.

curl https://api.apifirme.dev/rest/v1/fx/latest \
  -H "Authorization: Bearer af_live_..."

Responses:

CodeWhat it means
200The rates of the last banking day.
401The API key is missing or not valid.
404Does not exist: an unregistered CUI, a natural person, or no data for the day or year requested.
429The limit per minute or the month's number of requests has been exceeded. Does not count as a request.

The 200 response is a FxDay object:

FieldTypeDescription
datedateThe requested day.
effective_datedateThe banking day for which the rate was published.
basestringThe currency the rates are expressed in: RON.
ratesobjectFor each currency: rate, in lei for multiplier units of the currency.
sourceobjectThe source of the rate and when it was retrieved.

GET /rest/v1/fx/{date}

The rate of one day. For a day on which BNR does not publish (a weekend, a public holiday) the rate of the last banking day before it is returned; effective_date says which day that is.

ParameterWhereDescription
datein the path, requiredThe day, for example 2026-10-02.
curl https://api.apifirme.dev/rest/v1/fx/2026-10-02 \
  -H "Authorization: Bearer af_live_..."

Responses:

CodeWhat it means
200The rates valid on that day.
400A parameter is missing or not valid; detail says which.
401The API key is missing or not valid.
404Does not exist: an unregistered CUI, a natural person, or no data for the day or year requested.
429The limit per minute or the month's number of requests has been exceeded. Does not count as a request.

The 200 response is a FxDay object:

FieldTypeDescription
datedateThe requested day.
effective_datedateThe banking day for which the rate was published.
basestringThe currency the rates are expressed in: RON.
ratesobjectFor each currency: rate, in lei for multiplier units of the currency.
sourceobjectThe source of the rate and when it was retrieved.

GET /rest/v1/fx/series

A currency's rate over a period.

ParameterWhereDescription
currencyin the query, requiredThe currency code, for example EUR.
fromin the query, requiredThe first day.
toin the query, requiredThe last day.
curl https://api.apifirme.dev/rest/v1/fx/series?currency=EUR&from=2026-09-01&to=2026-09-30 \
  -H "Authorization: Bearer af_live_..."

Responses:

CodeWhat it means
200The rate of every banking day of the period.
400A parameter is missing or not valid; detail says which.
401The API key is missing or not valid.
429The limit per minute or the month's number of requests has been exceeded. Does not count as a request.

The 200 response is a FxSeries object:

FieldTypeDescription
currencystringThe currency.
basestringRON.
fromdateThe first day of the period.
todateThe last day of the period.
seriesarrayFor each banking day: date, rate and multiplier.

GET /rest/v1/fx/convert

Conversion between two currencies.

ParameterWhereDescription
fromin the query, requiredThe currency of the amount, for example EUR.
toin the query, requiredThe currency of the result, for example RON.
amountin the query, requiredThe amount.
datein the queryThe day of the rate. Today by default.
curl https://api.apifirme.dev/rest/v1/fx/convert?from=EUR&to=RON&amount=100 \
  -H "Authorization: Bearer af_live_..."

Responses:

CodeWhat it means
200The amount converted at BNR's rate.
400A parameter is missing or not valid; detail says which.
401The API key is missing or not valid.
404Does not exist: an unregistered CUI, a natural person, or no data for the day or year requested.
429The limit per minute or the month's number of requests has been exceeded. Does not count as a request.

The 200 response is a FxConversion object:

FieldTypeDescription
fromstringThe currency of the amount.
tostringThe currency of the result.
amountnumberThe amount.
resultnumberThe converted amount.
ratenumberThe rate used, from from to to.
datedateThe requested day.
effective_datedateThe banking day of the rate used.

Validation

Checks that need no key.

GET /rest/v1/validate/cui/{cui}

Check a CUI. Checks the form and the check digit. Does not say whether a company with this CUI exists. No key, free of charge.

Needs no key.

ParameterWhereDescription
cuiin the path, requiredThe unique registration code (CUI), with or without the RO prefix, for example 13548146.
curl https://api.apifirme.dev/rest/v1/validate/cui/13548146

Responses:

CodeWhat it means
200The result of the check.

The 200 response is a CuiValidation object:

FieldTypeDescription
cuiinteger or stringThe CUI as a number, if it is valid; otherwise the text received.
validbooleanWhether the form and the check digit are correct.

Webhooks

Plans that include the list of new companies can receive every new company at an address of their own, without asking. The address (https only) and the filters are registered in the account, where the secret the messages are signed with is shown, once. The account also shows the latest deliveries, with how each one ended.

POST company.registered

Sent to the address registered in the account, a few minutes after a new company that matches the webhook's filters has entered our database. The X-Apifirme-Signature header has the form t=<Unix time>,v1=<signature>; the signature is HMAC-SHA256, in hexadecimal, over <t>.<request body>, with the webhook's secret as the key. Any 2xx answer within ten seconds confirms receipt; otherwise the delivery is retried up to eight times, with ever longer pauses, for almost a day. The same company always has the same id, so a repeated delivery can be recognised, and each webhook receives a company only once: the first time it matches its filters. After five deliveries in a row have been given up on, the webhook is switched off and can be switched on again in the account. A test message (test: true) can be sent from the account at any time.

The body is a RegistrationEvent object. Verifying the signature, for example in a shell:

printf '%s.%s' "$t" "$body" | openssl dgst -sha256 -hmac "$secret"

The result must be equal to v1 from the header; a t older than a few minutes can be rejected.

Structures

The objects the responses above refer to.

Company

FieldTypeDescription
cuiintegerThe unique registration code (CUI).
denumirestring or nullThe name.
nr_reg_comstring or nullThe registration number in the trade register.
euidstring or nullThe European unique identifier (source: ONRC, the trade register).
sediu_secundarbooleanWhether it is the secondary seat of a company, registered at ANAF with a CUI of its own.
forma_juridicastring or nullThe legal form as ANAF writes it.
forma_juridica_codstring or nullThe legal form from the trade register: SRL, SA, ...
starestring or nullThe status, in one word: FUNCTIUNE (in operation), SUSPENDARE (suspended), REORGANIZARE JUDICIARA (judicial reorganisation), INSOLVENTA (insolvency), DIZOLVARE (dissolution), LICHIDARE (liquidation), FALIMENT (bankruptcy), RADIERE (struck off).
stari_registruarrayAll statuses and remarks from the trade register, each with cod (code) and denumire (name).
caeninteger or nullThe CAEN code of the main activity (source: ANAF). CAEN is the Romanian classification of economic activities, aligned with NACE.
caen_denumirestring or nullThe name of the CAEN code, in the classification in force.
caen_autorizatearray or nullThe activities the company is authorised for, from the trade register's open data: each with cod (code), versiune (the version of the CAEN classification it was declared in: 3 is the one of 2025, 2 the one of 2008, 1 the one of 2003, 0 the one of 1998) and denumire (name), the newest classification first. The register also keeps what was declared in the old classifications, so the same activity can appear with codes of several versions. null when they are not known (the company is not in the register's dataset), which does not mean that it has none.
data_inregistraredate or nullThe date of fiscal registration (source: ANAF).
data_inmatricularedate or nullThe date of entry in the trade register (source: ONRC).
webstring or nullThe web address declared to the trade register.
judetstring or nullThe county code of the registered office: SB, B, ...
localitatestring or nullThe locality of the registered office.
adresa_completastring or nullThe address of the registered office, as one text.
cod_postalstring or nullThe postal code.
telefonstring or nullThe telephone number declared to ANAF.
scp_tvabooleanWhether it is registered for VAT.
data_inceput_tvadate or nullSince when it has been registered for VAT.
data_sfarsit_tvadate or nullUntil when it was registered, if it no longer is.
tva_incasarebooleanWhether it applies VAT on collection.
split_tvabooleanWhether it applies split VAT payment.
status_inactivbooleanWhether it is declared fiscally inactive.
data_inactivaredate or nullSince when it has been inactive.
e_facturabooleanWhether it is in the RO e-Factura register.
updated_atdate-time or nullWhen something in the company's data last changed.
checked_atdate-time or nullWhen ANAF was last asked about the company; null if not yet.
sourcesarray of SourceWhich sources the company's data comes from, and since when.

Source

FieldTypeDescription
sourcestringThe source's key: anaf_ws, onrc_bulk, mf_financials.
namestringThe source's name.
publisherstringThe institution that publishes the data.
urlstringThe source's address.
licencestring or nullThe licence under which the data is published, where one is stated.
datasetstring or nullThe dataset the information was last taken from, for the sources that publish files.
dataset_urlstring or nullThe dataset's page (for financial statements).
published_atdate-time or nullWhen the institution published the file (for financial statements).
first_retrieved_atdate-time or nullWhen the source first supplied the information.
last_retrieved_atdate-time or nullWhen it last supplied it.
import_run_idinteger or nullThe import run that brought the information.

Event

FieldTypeDescription
typestringThe kind of change: vat_registered, vat_deregistered, vat_on_collection_started, vat_on_collection_ended, split_vat_started, split_vat_ended, inactivated, reactivated, efactura_registered, efactura_deregistered, struck_off, status_changed, name_changed, address_changed, caen_changed.
oldobject or nullThe value before, under the name of the field that changed (denumire, adresa_completa, stare, caen); null when the event is a beginning or an end.
newobject or nullThe value after, likewise.
occurred_ondate or nullThe day the source gives for the change, where it gives one (for example the beginning of the VAT period).
detected_atdate-timeWhen we observed the change.
sourcestringThe key of the source in whose answer the change appeared: anaf_ws.

Statement

FieldTypeDescription
cuiintegerThe company's CUI.
anintegerThe year of the financial statement.
tip_raportarestringThe Ministry of Finance's reporting type: UU (abbreviated balance sheet), BL_BS_SL, IR (IFRS), ONG (non-profit organisations), ...
tip_raportare_descrierestring or nullWhat kind of taxpayers file this type.
caeninteger or nullThe CAEN code from the financial statement.
caen_denumirestring or nullThe name of the code, in the classification in force in that year.
active_imobilizateinteger or nullFixed assets, total. In whole lei; null if the ministry does not publish the value.
active_circulanteinteger or nullCurrent assets, total. In whole lei; null if the ministry does not publish the value.
stocuriinteger or nullInventories. In whole lei; null if the ministry does not publish the value.
creanteinteger or nullReceivables. In whole lei; null if the ministry does not publish the value.
casa_bancainteger or nullCash and bank accounts. In whole lei; null if the ministry does not publish the value.
cheltuieli_avansinteger or nullPrepaid expenses. In whole lei; null if the ministry does not publish the value.
datoriiinteger or nullLiabilities. In whole lei; null if the ministry does not publish the value.
venituri_avansinteger or nullDeferred income. In whole lei; null if the ministry does not publish the value.
provizioaneinteger or nullProvisions. In whole lei; null if the ministry does not publish the value.
capitaluri_totalinteger or nullEquity, total. In whole lei; null if the ministry does not publish the value.
capital_socialinteger or nullSubscribed and paid-up share capital. In whole lei; null if the ministry does not publish the value.
patrimoniul_regieiinteger or nullPatrimony of the autonomous state enterprise (regie). In whole lei; null if the ministry does not publish the value.
cifra_afaceriinteger or nullNet turnover. In whole lei; null if the ministry does not publish the value.
venituri_totaleinteger or nullTotal income. In whole lei; null if the ministry does not publish the value.
cheltuieli_totaleinteger or nullTotal expenses. In whole lei; null if the ministry does not publish the value.
profit_brutinteger or nullGross profit. In whole lei; null if the ministry does not publish the value.
pierdere_brutainteger or nullGross loss. In whole lei; null if the ministry does not publish the value.
profit_netinteger or nullNet profit. In whole lei; null if the ministry does not publish the value.
pierdere_netainteger or nullNet loss. In whole lei; null if the ministry does not publish the value.
nr_mediu_salariatiinteger or nullAverage number of employees. In whole lei; null if the ministry does not publish the value.
alti_indicatoriarrayThe indicators this reporting type has in addition, each with cod (code), denumire (name) and valoare (value).
updated_atdate-timeWhen the statement last changed in our database.
sourcesarray of SourceThe dataset the statement comes from, when the ministry published it and when we retrieved it.

Registration

FieldTypeDescription
cuiintegerThe unique registration code (CUI).
denumirestring or nullThe name.
nr_reg_comstring or nullThe registration number in the trade register.
euidstring or nullThe European unique identifier (source: ONRC, the trade register).
sediu_secundarbooleanWhether it is the secondary seat of a company, registered at ANAF with a CUI of its own.
forma_juridicastring or nullThe legal form as ANAF writes it.
forma_juridica_codstring or nullThe legal form from the trade register: SRL, SA, ...
starestring or nullThe status, in one word: FUNCTIUNE (in operation), SUSPENDARE (suspended), REORGANIZARE JUDICIARA (judicial reorganisation), INSOLVENTA (insolvency), DIZOLVARE (dissolution), LICHIDARE (liquidation), FALIMENT (bankruptcy), RADIERE (struck off).
stari_registruarrayAll statuses and remarks from the trade register, each with cod (code) and denumire (name).
caeninteger or nullThe CAEN code of the main activity (source: ANAF). CAEN is the Romanian classification of economic activities, aligned with NACE.
caen_denumirestring or nullThe name of the CAEN code, in the classification in force.
caen_autorizatearray or nullThe activities the company is authorised for, from the trade register's open data: each with cod (code), versiune (the version of the CAEN classification it was declared in: 3 is the one of 2025, 2 the one of 2008, 1 the one of 2003, 0 the one of 1998) and denumire (name), the newest classification first. The register also keeps what was declared in the old classifications, so the same activity can appear with codes of several versions. null when they are not known (the company is not in the register's dataset), which does not mean that it has none.
data_inregistraredate or nullThe date of fiscal registration (source: ANAF).
data_inmatricularedate or nullThe date of entry in the trade register (source: ONRC).
webstring or nullThe web address declared to the trade register.
judetstring or nullThe county code of the registered office: SB, B, ...
localitatestring or nullThe locality of the registered office.
adresa_completastring or nullThe address of the registered office, as one text.
cod_postalstring or nullThe postal code.
telefonstring or nullThe telephone number declared to ANAF.
scp_tvabooleanWhether it is registered for VAT.
data_inceput_tvadate or nullSince when it has been registered for VAT.
data_sfarsit_tvadate or nullUntil when it was registered, if it no longer is.
tva_incasarebooleanWhether it applies VAT on collection.
split_tvabooleanWhether it applies split VAT payment.
status_inactivbooleanWhether it is declared fiscally inactive.
data_inactivaredate or nullSince when it has been inactive.
e_facturabooleanWhether it is in the RO e-Factura register.
updated_atdate-time or nullWhen something in the company's data last changed.
checked_atdate-time or nullWhen ANAF was last asked about the company; null if not yet.
sourcesarray of SourceWhich sources the company's data comes from, and since when.
registered_ondate or nullThe registration date: the entry in the trade register where it is known, otherwise the fiscal registration at ANAF.
discovered_atdate-timeThe company's place in the order of discovery: the moment it entered our database or, if its CAEN code, county or legal form became known later, that moment.

RegistrationEvent

FieldTypeDescription
idstringIdentifies the event: company.registered: followed by the CUI. The same on every retry.
typestringThe kind of event: company.registered.
testbooleantrue for a test message requested from the account: it has the form of a real one, with some company, and an id that starts with test:.
created_atdate-timeWhen the event was created.
dataRegistrationThe company, exactly as GET /rest/v1/registrations returns it.

Problem

FieldTypeDescription
typestringThe address that identifies the kind of error.
titlestringThe error, in short.
statusintegerThe HTTP status code.
detailstringWhat exactly went wrong.