Romania CUI Check & Watch: ANAF VAT, e-Factura, Inactive avatar

Romania CUI Check & Watch: ANAF VAT, e-Factura, Inactive

Pricing

Pay per event

Go to Apify Store
Romania CUI Check & Watch: ANAF VAT, e-Factura, Inactive

Romania CUI Check & Watch: ANAF VAT, e-Factura, Inactive

Check Romanian companies by CUI in bulk and get notified when their status changes: VAT registration, inactive status, split VAT, e-Factura registry. Uses ANAF's public web service; source and retrieval time on every record. Pay per CUI checked and per change detected.

Pricing

Pay per event

Rating

0.0

(0)

Developer

PPFTEC S.R.L

PPFTEC S.R.L

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

Categories

Share

Romania CUI Status Check: ANAF VAT, Inactive, e-Factura

Check Romanian companies by CUI (CIF) against ANAF's public VAT-status web service (PlatitorTvaRest v9): VAT registration, VAT on cash (TVA la încasare), inactive taxpayer, struck-off date, split VAT and the RO e-Factura registry. Optional watch mode tells you only when one of those statuses changes.

For finance and invoicing teams, e-Factura and ERP software, and onboarding / KYB teams who need to know whether a counterparty is VAT-registered, inactive or struck off before they issue or pay an invoice.

Status: v0.1.4, private build. Not yet published on the Apify Store (the public listing waits for a legal check, DECISIONS D6). Watch mode is built and tested but switched off on Apify until then.

Quick start

Lookup of three companies (status today, Europe/Bucharest):

{ "mode": "lookup", "cuis": ["RO16054368", "9900000010", "9900000029"] }

Lookup on a past date, without addresses:

{ "mode": "lookup", "cuis": ["16054368"], "queryDate": "2026-01-15", "includeAddresses": false }

Watch your counterparties (schedule this daily or weekly in Apify; a run between 02:00 and 06:00 Bucharest time is a courtesy to ANAF):

{ "mode": "watch", "cuis": ["RO16054368", "9900000010"] }

Validate a list without sending anything to ANAF and without being charged:

{ "cuis": ["RO 16.054.368", "14841555", "9900000010"], "dryRun": true }

9900000010 and 9900000029 are synthetic test codes; replace them with your own CUIs.

Output

One record per valid CUI in lookup mode (synthetic example):

{
"record_type": "ro-company-status",
"cui": "9900000010",
"input": "RO9900000010",
"query_date": "2026-10-05",
"found": true,
"name": "TEST SINTETIC SRL",
"entity_kind": "legal-entity",
"registration_status": "INREGISTRAT din data 01.03.2004",
"registration_date": "2004-03-01",
"trade_register_no": "J40/0000/2004",
"caen_code": "6201",
"legal_form": "SOCIETATE COMERCIALA CU RASPUNDERE LIMITATA",
"organisation_form": "PERSOANA JURIDICA",
"ownership_form": "PROPR.PRIVATA-CAPITAL PRIVAT AUTOHTON",
"tax_office": "TEST",
"e_invoice_registered": true,
"vat": { "registered": true, "periods": [{ "from": "2004-03-01", "to": null, "cancellation_recorded_on": null, "message": null }] },
"vat_on_cash": { "active": false, "from": null, "to": null, "updated": null, "published": null, "act_type": null },
"inactive": { "is_inactive": false, "inactivated_on": null, "reactivated_on": null, "published_on": null, "deregistered_on": null },
"split_vat": { "active": false, "from": null, "cancelled_on": null },
"registered_office": { "street": "Str. Test", "number": "1", "locality": "Sector 1 Mun. Bucuresti", "locality_code": "1", "county": "MUNICIPIUL BUCURESTI", "county_code": "40", "county_auto_code": "B", "country": null, "details": null, "postal_code": "012345" },
"fiscal_domicile": null,
"redacted_fields": [],
"insolvency": null,
"privacy_notice_url": "https://clearsource.ppftec.com/privacy",
"provenance": {
"envelope_version": "1.0.0",
"source_id": "anaf-ws-platitor-tva-v9",
"source_url": "https://webservicesp.anaf.ro/api/PlatitorTvaRest/v9/tva",
"source_request": { "method": "POST", "body_sha256": "3b1f6c1fd7a1d5e0b0c1c3f4f6a7e8d9c0b1a2f3e4d5c6b7a8f9e0d1c2b3a4f5", "page": "1" },
"source_record_url": null,
"retrieved_at": "2026-10-05T04:12:03.512Z",
"source_version": { "api_version": "v9", "doc_sha256": "9346a0f7435234fa9ddf73e9e72c43ae354577d6a7db3b44fa5ef54ad31ae185" },
"producer": { "name": "ro-company-status", "version": "0.1.4", "build": null, "run_id": null, "adapter": "anaf-v9" },
"record_hash": "sha256:5e0c2b7d3a1f4e6b8c9d0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d",
"licence": {
"id": "LicenseRef-ANAF-public-ws",
"url": "https://static.anaf.ro/static/10/Anaf/Informatii_R/Servicii_web/doc_WS_V9.txt",
"attribution": "Sursa: ANAF (Agenția Națională de Administrare Fiscală). Information only; the ANAF response is authoritative."
},
"personal_data": "none"
}
}

A CUI that ANAF does not know comes back with "found": false and every status field null.

In watch mode the dataset holds only change records:

{
"record_type": "ro-company-status-change",
"cui": "9900000010",
"name": "TEST SINTETIC SRL",
"entity_kind": "legal-entity",
"query_date": "2026-10-05",
"checked_at": "2026-10-05T04:12:03.512Z",
"watch_status": "changed",
"changed_fields": ["inactive", "inactivated_on"],
"previous": { "found": true, "registration_status": "INREGISTRAT din data 01.03.2004", "vat_registered": true, "vat_period_from": "2004-03-01", "vat_period_to": null, "vat_on_cash": false, "inactive": false, "inactivated_on": null, "reactivated_on": null, "deregistered_on": null, "split_vat": false, "e_invoice_registered": true },
"current": { "found": true, "registration_status": "INREGISTRAT din data 01.03.2004", "vat_registered": true, "vat_period_from": "2004-03-01", "vat_period_to": null, "vat_on_cash": false, "inactive": true, "inactivated_on": "2026-10-02", "reactivated_on": null, "deregistered_on": null, "split_vat": false, "e_invoice_registered": true },
"previously_checked_at": "2026-10-04T04:11:58.020Z",
"privacy_notice_url": "https://clearsource.ppftec.com/privacy",
"provenance": {
"envelope_version": "1.0.0",
"source_id": "anaf-ws-platitor-tva-v9",
"source_url": "https://webservicesp.anaf.ro/api/PlatitorTvaRest/v9/tva",
"retrieved_at": "2026-10-05T04:12:03.512Z",
"source_version": { "api_version": "v9", "doc_sha256": "9346a0f7435234fa9ddf73e9e72c43ae354577d6a7db3b44fa5ef54ad31ae185" },
"producer": { "name": "ro-company-status", "version": "0.1.4", "adapter": "anaf-v9" },
"record_hash": "sha256:5e0c2b7d3a1f4e6b8c9d0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d",
"licence": { "id": "LicenseRef-ANAF-public-ws", "attribution": "Sursa: ANAF (Agenția Națională de Administrare Fiscală). Information only; the ANAF response is authoritative." },
"personal_data": "none"
}
}

A sole trader in a watch list produces a status-free record with "watch_status": "not-watched-natural-person-business", name, previous and current set to null, and no charge.

Run-level files in the default key-value store: INVALID_INPUTS (list index and reason; 13-digit values are never stored), FAILED_INPUTS, RUN_SUMMARY (counts only), DRIFT_REPORT, CLASSIFICATION_STATS (legal forms and counts, no names, no CUIs), DRY_RUN.

Fields

FieldMeaning (ANAF source field)
foundfalse when ANAF lists the CUI as not found
registration_status, registration_datestare_inregistrare, data_inregistrare
vat.registered, vat.periods[]VAT registration under art. 316 Codul fiscal (scpTVA, perioade_TVA)
vat_on_cashVAT on cash system (inregistrare_RTVAI)
inactiveInactive taxpayer; deregistered_on is the struck-off date (dataRadiere)
split_vatSplit VAT (inregistrare_SplitTVA)
e_invoice_registeredRO e-Factura registry (statusRO_e_Factura)
registered_office, fiscal_domicileAddress blocks; reduced for sole traders
entity_kindlegal-entity, natural-person-business or unknown (treated like a sole trader)
insolvencyalways null: no lawful open source is used

All statuses are as at query_date, as ANAF answers for that date.

Watch mode

  • State is kept in your own Apify account, in a key-value store with the fixed name ro-company-status-watch. Per CUI it holds only: status hash, last check time, schema version and the status fields listed above. No name, address, phone, fax, IBAN, trade register number or CAEN code.
  • One watch list per account, at most 5,000 CUIs. Larger lists are refused before any request, without charge.
  • Each company (legal entity) is queried at most once per calendar day (Europe/Bucharest); a second run the same day skips it free of charge. Sole traders and unclassifiable forms are not stored (see below), so they are queried again on every run, but never charged and never reported with status data.
  • The first run stores a baseline and emits nothing. CUIs you remove from the list are deleted from the store on the next run; entries not checked for 90 days are deleted. "resetWatch": true deletes the store; it always works, even while the actor is switched off by the maintainer, because it only deletes your own state (no ANAF request, no charge).
  • A company that disappears from ANAF is re-checked once in the same run before a change is reported.
  • Delivery is at least once: a crash between output and state write can repeat one change on the next run. Do not start two watch runs at once (the second one stops).

Sole traders (PFA, II, IF, liberal professions)

In lookup records the street, number, details and postal code of their addresses are removed (county and locality stay) and provenance.personal_data is public-register-natural-person. Phone, fax and IBAN are never output for anyone. Sole traders are not watched; check them in lookup mode instead. Objections: contact the operator (below); an accepted objection removes the CUI from all output within 24 hours.

Pricing (pay per event)

EventPriceCharged when
company-check$0.003lookup: per CUI answered by ANAF (found or not found)
watch-check$0.001watch: per company answered by ANAF (baseline, unchanged or changed)
status-change$0.01watch: per change record

Not charged: invalid, duplicate or unavailable CUIs, failed requests, dry runs, skipped (already checked today) and sole-trader records. Examples: 500 CUIs looked up once = $1.50. 500 companies watched daily ≈ $15 per month plus $0.01 per change; weekly ≈ $2.15 per month.

Limits

ANAF allows one request per second per client. All users of this actor share one queue spaced 1.5 s apart (100 CUIs per request): at most about 4,000 CUIs per minute for everyone together. Your run may wait when others are running. Per run: 10,000 CUIs in lookup, 5,000 in watch, 150 ANAF requests, 55 minutes, 256 MB.

A queue slot is used only if asking for it took at most 400 ms; a slower answer is discarded and a new slot is requested, and after 3 slow answers the run stops without calling ANAF. If the shared rate-limit service is unavailable the run stops before calling ANAF, lists the unchecked CUIs in FAILED_INPUTS and charges nothing for them.

Data source and licence

ANAF web service PlatitorTvaRest v9, documentation https://static.anaf.ro/static/10/Anaf/Informatii_R/Servicii_web/doc_WS_V9.txt (sha256 9346a0f7…ae185). Attribution on every record: "Sursa: ANAF (Agenția Națională de Administrare Fiscală). Information only; the ANAF response is authoritative." This actor is not affiliated with or endorsed by ANAF. DISCLAIMER: this output is not official, not certified and not OGL-licensed; it is not real-time, does not contain insolvency information and keeps no status history.

Privacy

Privacy notice (Art. 14 GDPR, Romanian and English; source, purposes, legitimate interests, retention, objection channel): https://clearsource.ppftec.com/privacy — linked from every record as privacy_notice_url.

We (the developer) keep no copy of your CUIs or results. The only data that leaves your run besides the ANAF request is a request to our rate-limit service, which carries a hash of the run id and the build number, never a CUI. Apify's "Share run data with developers" is opt-in; if you turn it on we can see your input and output, use them only for support, and never copy them. You control what you store.

Use with AI assistants (MCP)

This actor can be called by AI assistants through Apify's MCP server (run by Apify; this actor is an independent product of PPFTEC S.R.L., not affiliated with or endorsed by ANAF). Add it to an MCP client such as Claude, VS Code or Cursor:

{
"mcpServers": {
"clearsource-ro-company-status": {
"url": "https://mcp.apify.com?tools=clearsource/ro-company-status"
}
}
}

On first use your browser asks you to sign in to Apify (OAuth); or send your token as Authorization: Bearer <APIFY_TOKEN>. The assistant reads the input schema, runs a lookup and then fetches the dataset items. Billing is per CUI answered (see Pricing). The answer is the register's status on the query date; it is not legal or tax advice. Details: https://docs.apify.com/platform/integrations/mcp (checked 2026-10-10). Guide: https://clearsource.ppftec.com/guides/romania-cui-vat-check

Guide

Step-by-step guide, including the free manual way: https://clearsource.ppftec.com/guides/romania-cui-vat-check

Terms of use

This actor is offered by PPFTEC S.R.L. under Apify's terms plus our terms of use: https://clearsource.ppftec.com/terms

Stop / takedown

ANAF, a data subject or anyone with a concern can ask us to stop processing a CUI or to stop the actor altogether: write to support@ppftec.com. We answer within 24 hours. An accepted objection removes the CUI from all output and from watch stores (on their next run) within 24 hours; the maintainer kill switch stops all runs before their next ANAF request.

Reliability

Every response is checked against the expected ANAF shape; a missing or retyped field stops the run with SCHEMA DRIFT and a DRIFT_REPORT. Retries back off 5, 10, 20, 40 s and take a new queue slot each time. A maintainer kill switch stops runs before the next ANAF request. See CHANGELOG.md.

Maintainer setup (not for users)

  • Secrets live in the Apify secret store and are referenced from .actor/actor.json (@pdaLimiterSecret, @pdaSuppressionPepper, @pdaHealthToken), never as plain values: apify secrets add pdaLimiterSecret <value> before apify push. Environment variables are frozen into a build; the instant kill switch is the limiter's ANAF_DISABLED (see workers/anaf-limiter/README.md).
  • The central rate limiter is PDA_LIMITER_URL = https://clearsource.ppftec.com/limiter (set in .actor/actor.json; the actor refuses any other host or path and never follows redirects). The run log names the limiter endpoint in use.
  • Pay-per-event pricing must be configured before any run: on Apify the actor refuses to run without it ("pay-per-event pricing is not configured", no ANAF request). For a private test build only, PDA_ALLOW_NO_PPE=1 lifts this; never set it on the public build.
  • Health mode needs PDA_HEALTH_ENABLED=1, the secret PDA_HEALTH_TOKEN (≥ 32 characters) and the same value as the secret input healthToken in the maintainer's scheduled task; optionally PDA_MAINTAINER_USER_ID pins it to our Apify user id. Without all of them the run answers "Invalid input".

Calling via API

curl -X POST "https://api.apify.com/v2/acts/<owner>~ro-company-status/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H 'content-type: application/json' -d '{"mode":"lookup","cuis":["RO16054368"]}'

Operator: PPFTEC S.R.L., https://ppftec.com. Information only, not legal or tax advice.