# Romania Company Financials – Revenue, Profit, CUI (`matikitli/ro-company-financials`) Actor

Romanian company financials from official Ministry of Finance data and ANAF: revenue, profit, assets, equity, debt, cash and employees by CUI, in RON and EUR, with ratios, 10-year history and a monitor for new figures. $0.01 per company-year.

- **URL**: https://apify.com/matikitli/ro-company-financials.md
- **Developed by:** [Mateusz Kitlinski](https://apify.com/matikitli) (community)
- **Stats:** 4 total users, 4 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 company years

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Romania Company Financials do?

**Romania Company Financials** turns Romanian fiscal codes (**CUI / CIF**, with or without the **RO** VAT prefix) into clean, English-keyed **annual financial figures** from official sources: the yearly financial-statement datasets of the **Romanian Ministry of Finance** (data.gov.ro) and the public web services of **ANAF**.

For every company you get one row per financial year with:

- **Identity** from the ANAF taxpayer registry: name, legal form, trade-register number, registration date, CAEN activity code, registered office with county, VAT status, and inactive / deregistration status.
- **Key figures in RON and EUR**: revenue (net turnover), profit before tax, net profit, total assets, equity, liabilities and cash — the same field names as our Slovak financials actor, so rows from both countries stack in one table. Every figure states the official indicator it comes from.
- **All published indicators**: fixed and current assets, inventories, receivables, provisions, deferred income, paid-in capital, total revenue and expenses, gross profit/loss, net profit/loss, **average number of employees**.
- **Ratios**: equity ratio, debt ratio, net margin, revenue per employee, and year-on-year change of revenue and net profit.

Choose the **latest year** or up to **10 years of history** (FY2016–FY2025 today). Companies that filed late and are missing from the published dataset are checked **live at ANAF** for the latest two years. A **monitor mode** returns only company-years that are new or changed since your last run — perfect for a monthly schedule when a new financial year is published.

Official sources only, company-level data only: sole traders (PFA), individual and family enterprises are never processed.

### Who is it for?

- **KYB, credit-risk and compliance teams** screening Romanian suppliers, customers and counterparties.
- **B2B sales, M\&A and market analysts** who need revenue, profitability, headcount and growth for Romanian companies at a glance.
- **Portfolio monitoring**: schedule it monthly and get only companies with new or corrected figures.
- **AI agents** (via the Apify MCP server): "get the last 5 years of revenue, profit and employees for CUI 14399840".

### How to use it

1. Paste **fiscal codes** (CUI), one per line: `14399840`, `RO 1590082`, `RO18189442`. Spaces, dots and the RO prefix are fine.
2. Choose **Years of history** (1–10), or an explicit **From / To financial year** range.
3. Run it. Use the **Overview** or **History and growth** table, or download JSON, CSV or Excel.
4. To **find companies** instead, leave the identifiers empty and use the **Search** filters: CAEN prefix, county, legal form, employees and turnover range. Example: all software companies (`62`) in Cluj (`CJ`) with at least 50 employees.

### Input

```json
{
  "identifiers": ["14399840", "RO 1590082", "18189442"],
  "historyYears": 5,
  "monitor": false
}
```

| Field | Default | Description |
|---|---|---|
| `identifiers` | — | CUI with or without `RO`, up to 10,000 |
| `historyYears` | 1 | 1 = latest published year, up to 10 |
| `yearFrom` / `yearTo` | — | explicit range of financial years instead of `historyYears` |
| `maxLiveLookups` | 300 | cap on live ANAF checks for late filers (one per company-year, ~1 per second) |
| `monitor` / `resetMonitor` | `false` | only company-years new or changed since the last run |
| `caenCodes`, `counties`, `legalFormCategories`, `employeesMin/Max`, `revenueMinRon/MaxRon` | — | search mode (when no identifiers are given): companies that filed in the latest year |
| `maxItems` | 100 | search mode: maximum companies, largest turnover first |

### Output

One record per company-year (real data, shortened):

```json
{
  "status": "ok",
  "country": "RO",
  "company": {
    "cui": "14399840",
    "vatId": "RO14399840",
    "name": "DANTE INTERNATIONAL SA",
    "legalForm": "SOCIETATE COMERCIALĂ PE ACŢIUNI",
    "legalFormCategory": "JSC",
    "tradeRegisterNumber": "J2002000372404",
    "registeredAt": "2002-01-23",
    "caenCode": "4754",
    "caenLabel": "Comerț cu amănuntul al articolelor și aparatelor electrocasnice",
    "address": { "city": "Sector 6 Mun. Bucureşti", "county": "București", "countyCode": "B", "postalCode": "60787" },
    "registryStatus": { "inactive": false, "deregisteredAt": null, "vatSince": "2002-02-01" }
  },
  "statement": { "year": 2025, "periodFrom": "2025-01", "periodTo": "2025-12", "filerFormat": "full", "currency": "RON", "source": "bulk" },
  "kpis": {
    "revenue": { "value": 8706154345, "source": { "table": "indicators", "fields": ["netTurnover"], "lines": [13] } },
    "profitBeforeTax": { "value": -290554064, "source": { "fields": ["grossProfit", "grossLoss"], "lines": [16, 17], "op": "diff" } },
    "netProfit": { "value": -370680444, "source": { "fields": ["netProfitReported", "netLossReported"], "lines": [18, 19], "op": "diff" } },
    "totalAssets": { "value": 4802549657, "source": { "fields": ["fixedAssets", "currentAssets", "prepaidExpenses"], "op": "sum" } },
    "equity": { "value": 2041323091 },
    "liabilities": { "value": 2512599434 },
    "cash": { "value": 344191865 },
    "operatingProfit": { "value": null, "source": { "reason": "not published by source" } }
  },
  "kpisEur": { "revenue": 1726592748, "netProfit": -73512844, "totalAssets": 952435149, "equity": 404832433, "liabilities": 498295320, "cash": 68259665 },
  "fx": { "currency": "RON", "rateEurRon": 5.0424, "basis": "annual-average", "year": 2025, "source": "ECB EXR" },
  "figures": { "employees": 2889, "inventories": 1172475902, "receivables": 534044275, "provisions": 132860846, "…": "…" },
  "ratios": { "equityRatioPct": 42.5, "debtRatioPct": 52.3, "netMarginPct": -4.3, "revenueChangePct": -3.2, "revenuePerEmployee": 3013553, "revenuePerEmployeeEur": 597644 },
  "historyIndex": 0,
  "sources": { "anafUrl": "https://webservicesp.anaf.ro/bilant?an=2025&cui=14399840" }
}
```

Other statuses (all free): `invalid_input` (bad control digit), `not_found`, `out_of_scope` (natural person — fiscal code only), `unsupported_filer_type` (bank, insurer, NGO …), `no_statements`, `empty_statement` (every figure zero, typically dormant), `source_unavailable`. Each run also writes an `OUTPUT` summary to the key-value store (counts, dataset versions used, live lookups, charges).

### Pricing

Pay per event: you pay only for company-years delivered.

| Event | Price | When |
|---|---|---|
| Company-year | **$0.01** | the latest delivered year of each company |
| History year | **$0.0025** | each older year (5 years = $0.01 + 4 × $0.0025 = **$0.02** per company; 10 years = $0.0325) |

Never charged: problem rows, natural persons, empty (all-zero) statements, duplicates of a company already in the same run, and company-years skipped by monitor mode.

**Worked example:** 100 companies with 5 years of history = 100 × $0.02 = **$2.00**. Set *Maximum cost per run* to cap a run; it stops cleanly and the summary says so.

### Data sources and legal

- **Ministerul Finanțelor — situații financiare** (data.gov.ro): yearly datasets for all commercial companies (full, abbreviated and IFRS formats), **CC BY 4.0** (older years OGL-ROU). The factory keeps a read-only, sharded copy of these files so that lookups are fast; every row names the dataset version it came from.
- **ANAF** public web services: taxpayer / VAT registry (identity and status) and `bilant` (live figures for late filers).
- **ECB** annual average EUR/RON reference rate for the EUR values; CAEN labels and, for search, legal form and county from the trade register's (ONRC) open data, CC BY 4.0.
- Company-level data only. A fiscal code that is not clearly a company (sole traders, individual and family enterprises, entries without an organisation type that never filed a balance sheet) gets a free `out_of_scope` row with the fiscal code only; names, addresses and figures are never processed.

### Limits

- Commercial companies only: banks, insurers, non-bank lenders, pension and investment funds, and NGOs use other statement layouts and are not covered in v1 (`unsupported_filer_type`).
- The sources publish the 20 balance-sheet / P\&L indicators of the annual statement, not the full statements: operating revenue and operating profit are not published and stay `null`.
- Financial years are calendar years (the Romanian standard); history covers the latest 10 published years.
- No name search: the official sources cannot be searched by name. Search by activity, county, legal form, size and turnover covers companies that filed a balance sheet in the latest published year; county and legal form come from the trade register's open data and are unknown for a minority of companies (those never match a county or legal-form filter).
- A new financial year is published by the Ministry around June of the following year; late filers of the latest two years are checked live at ANAF.

### FAQ

#### Why do bulk numbers sometimes differ from what a company published later?

Companies can file late or correct a statement. The Ministry re-publishes updated datasets (`_actualizat`), and the index always uses the newest one; for the latest two years missing companies are checked live at ANAF. `statement.source` and `statement.datasetVersion` tell you where each row came from.

#### Why is the profit negative?

Romanian statements publish profit and loss as two separate positive numbers. This actor gives one signed value: a loss is a negative `profitBeforeTax` / `netProfit`. The original two numbers are in `figures`.

#### How is EUR calculated?

RON amounts divided by the ECB annual average EUR/RON rate of the same financial year (stated in `fx`), rounded to whole euros.

#### Can I use it from my code, Zapier, Make or an AI agent?

Yes: through the Apify API, any Apify integration, or the Apify MCP server.

### Pe scurt, în română

Situațiile financiare ale firmelor din România din surse oficiale (Ministerul Finanțelor, data.gov.ro și ANAF): cifra de afaceri, profit, active, capitaluri, datorii, numerar și număr mediu de salariați după CUI, în lei și euro, cu indicatori și istoric pe 10 ani. Persoanele fizice (PFA, II, IF) nu sunt procesate.

### Other actors from this developer

- [Slovakia Company Financials](https://apify.com/matikitli/sk-company-financials): RÚZ statements with the same key-figure fields.
- [Polish Company Dossier](https://apify.com/matikitli/pl-company-dossier): KRS, VAT white list and risk signals for Polish companies.
- [Polish Public Tenders](https://apify.com/matikitli/pl-public-tenders): BZP + EU TED tenders and contract winners.

# Changelog

This Actor's version history is a separate document: https://apify.com/matikitli/ro-company-financials/changelog.md

# Actor input Schema

## `identifiers` (type: `array`):

Romanian fiscal codes, 2–10 digits, with or without the RO VAT prefix; spaces and dots are fine. One per line, up to 10,000. Example: 14399840, RO 1590082.

## `historyYears` (type: `integer`):

1 = latest published financial year only. Up to 10 = the latest ten years, newest first, with year-on-year changes. Example: 5.

## `yearFrom` (type: `integer`):

Optional explicit range instead of 'Years of history' (max 10 years). Example: 2019.

## `yearTo` (type: `integer`):

Optional end of the explicit range. Example: 2025.

## `caenCodes` (type: `array`):

Find companies instead of listing CUIs: CAEN prefixes (1–4 digits), e.g. 62 or 4711. Search covers companies that filed in the latest published year.

## `counties` (type: `array`):

Search: registered-office county. Example: CJ (Cluj).

## `legalFormCategories` (type: `array`):

Search: legal form. Example: LLC (SRL).

## `employeesMin` (type: `integer`):

Search: average number of employees in the latest year, at least.

## `employeesMax` (type: `integer`):

Search: upper bound (inclusive).

## `revenueMinRon` (type: `integer`):

Search: net turnover in the latest year (RON), at least.

## `revenueMaxRon` (type: `integer`):

Search: upper bound (inclusive).

## `maxItems` (type: `integer`):

Maximum companies returned by a search (1–10,000).

## `maxLiveLookups` (type: `integer`):

Companies missing from the published yearly dataset (filed late) are checked live at ANAF, one request per company-year at ~1/s. This caps the checks per run (0–2,000).

## `monitor` (type: `boolean`):

Return only company-years that are new or changed since the previous run with the same input (e.g. after a new financial year is published). Schedule it monthly.

## `resetMonitor` (type: `boolean`):

Forget what monitor mode delivered for this input and start again.

## Actor input object example

```json
{
  "identifiers": [
    "14399840",
    "RO 1590082",
    "18189442"
  ],
  "historyYears": 1,
  "maxItems": 100,
  "maxLiveLookups": 300,
  "monitor": false,
  "resetMonitor": false
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset items (one per company-year, or one problem row per input).

## `history` (type: `string`):

Year-by-year key figures with year-on-year changes.

## `summary` (type: `string`):

Counts by status, source status, dataset versions, live lookups, charges.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "identifiers": [
        "14399840",
        "RO 1590082",
        "18189442"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("matikitli/ro-company-financials").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "identifiers": [
        "14399840",
        "RO 1590082",
        "18189442",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("matikitli/ro-company-financials").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "identifiers": [
    "14399840",
    "RO 1590082",
    "18189442"
  ]
}' |
apify call matikitli/ro-company-financials --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,matikitli/ro-company-financials"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/PdbXf7tXwplR0EEkK/builds/7dTLFfhzcL1L2MYi1/openapi.json
