API reference — Romanian company registry (ONRC)

Every endpoint, with examples you can run from this page. Send your key as the X-API-Key header. Without a key you have 5 lookups a day for each IP address; a free key from /start gives 25; the day resets at 00:00 UTC. Every 401, 402 and 429 answer carries get_a_key. GET /usage shows what you have left (it never counts as a lookup), and every lookup answer carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds to the reset).

Free during launch. Every endpoint and filter is free today, within the daily limit. When the paid plans go live, the full 2008–2025 financial history, ratios, health score and peer percentiles, the revenue / headcount / VAT filters, CSV export and lists longer than 25 rows move to Pro (€9/month ≈ RON 47.96, 500 lookups a day); Business (€29/month ≈ RON 154.53) gives 5,000 lookups a day. Free keeps the company profile, status and risk, ANAF data, the latest year's figures and lists of up to 25 rows. See all plans. The RON amounts are indicative, at the BNR rate of 20 October 2026 (€1 = RON 5.3285); you pay in euros.

Examples: company data by CUI, ONRC and ANAF checks, export by CAEN code →

Batches, matching and compact answers

POST /lookup_companies takes up to 100 CUIs and POST /match_companies up to 500 records (name, county, domain or CUI); each answers one row per input, in order. Each row counts as one lookup: a batch larger than what is left today answers the rows that fit and marks the rest not_processed (not counted; partial: true, processed, remaining: send those rows again after the reset), and rows that are input errors are not counted (metering). With nothing left the batch is refused (429). GET /find_company_by_domain finds the firm behind a website. Add fields=companyName,cui,county,risk or compact=true to a list to get only those fields. /record/{cui} is a dated, sourced record to print or save as PDF (?format=json for the data); every company row links to it as url (null for sole traders and other natural persons), and a lead list carries appUrl, the same list in the app. The MCP tools of the same names count the same way.

Websites and domains

GET /extract_contacts?website= reads up to max_pages pages of a site (1-20, default 5) for emails, phones and social profiles. GET /enrich_company?cui= returns the registry record plus the contacts on the firm's website, each with a confidence and a source (cached; refresh=true reads the site now). GET /lookup_domain?domain= gives WHOIS, DNS and the SPF/DMARC audit. Each call is one lookup. Only public sites are read: localhost, a private IP or an internal name is a 400, and so is a site that cannot be read; neither is counted. The MCP tools of the same names answer the same.

No-code: an n8n workflow

Download the n8n workflow (import it in n8n with Import from file): it reads a CSV or a Google Sheet, sends the rows with a CUI to POST /lookup_companies and the rest (name, county, website) to POST /match_companies, with your key in the X-API-Key header (a Header Auth credential), and writes the list back with each firm's CUI, status, risk, phone, size and the match confidence. Each row counts as one lookup, as above. The steps, in English and Romanian, are in its README (docs/integrations/n8n).

Claude skill

The Leadgen skill for Claude (Agent Skills format; source on GitHub) tells Claude which tool to call for a lead list, a check before a deal, matching a client list or monitoring, and how to answer: cite the snapshot date, say what was not checked, name the data source. claude.ai / Claude Desktop: Settings → Capabilities → Skills → upload the zip. Claude Code: unzip it into ~/.claude/skills/. It works with the MCP server above.

Code examples

curl -H "X-API-Key: lg_your_key" "https://leadgen.adrianhomelab.com/lookup_business?query=DEDEMAN&max_results=3"

Connect an MCP client

Run once in a terminal (add --scope user to have it in every project):

claude mcp add --transport http leadgen https://leadgen-mcp.adrianhomelab.com/mcp
# with a key:
claude mcp add --transport http leadgen https://leadgen-mcp.adrianhomelab.com/mcp --header "Authorization: Bearer lg_your_key"

Or share it with your team in the project's .mcp.json (the "type": "http" line is required):

{
  "mcpServers": {
    "leadgen": {
      "type": "http",
      "url": "https://leadgen-mcp.adrianhomelab.com/mcp",
      "headers": { "Authorization": "Bearer lg_your_key" }
    }
  }
}

Without a key, leave out the header: 5 lookups a day for each IP address. With a free key from leadgen.adrianhomelab.com/en/start (25 lookups/day instead of 5), replace lg_your_key with yours.

Licence and attribution

The company data is open government data, not ours: the Trade Register Office (ONRC) and the Ministry of Finance publish it on data.gov.ro under CC BY 4.0 (the financial statements for 2008–2010 under the OGL-ROU-1.0 licence), and the VAT, e-Factura and inactive flags come from ANAF's public taxpayer service. When you show or ship this data in your product, attribute it with this line:

Source: ONRC and Ministry of Finance (data.gov.ro, CC BY 4.0; financial statements 2008–2010 under OGL-ROU-1.0) and ANAF, via Leadgen (leadgen.adrianhomelab.com)

Every company answer carries the same line in its attribution field (source names the layer: onrc, mfp, anaf), and every CSV export ends with it. The licences ask for this attribution; they do not restrict commercial use. Keep the address at the end of the line: it tells whoever reads your copy where it came from.

What Leadgen does not cover

A first look, not a full check: the insolvency bulletin (BPI), ANAF tax debts, court cases, shareholders, SEAP and Monitorul Oficial are not loaded, and every risk block says so in notChecked. Sources and freshness per source: coverage.

Changelog and breaking changes

Every change is listed with its date in the changelog. A breaking change is announced at least 14 days ahead, there and by email to every key holder who called the affected endpoint in the last 30 days.

Report a gap or a wrong record

Use the feedback page, POST /feedback with {"message", "kind", "cui", "email"} (kinds: gap, wrong_record, bug, idea, other), or the MCP tool report_issue. None of them counts as a lookup. A wrong registry record is corrected at the source (ONRC) and arrives with the next snapshot.

Endpoints

  • POST /api/subscribe — Start a Pro or Business subscription
  • GET /api/billing/intent (u) — What a signed upgrade link names, for the checkout page
  • GET /api/billing/company/{cui} (cui) — A company's invoice details from our own registry (name, address, VAT status) to prefill the checkout, and whether it may subscribe
  • POST /api/billing/portal — Open the Stripe Customer Portal for the subscription of the key in X-API-Key
  • POST /api/billing/portal-link — Email a one-time link to the subscription portal to an address that has a subscription
  • GET /api/fx/eur-ron — The euro in lei at the BNR reference rate and its date, for showing RON next to EUR prices (F100); the charge is always in EUR
  • GET /health — Liveness, plus which ONRC snapshot is being served and how old it is
  • GET /lookup_business (query, max_results, county, fields, compact) — Company search by name or CUI
  • GET /lookup_director (name, max_results, prefix, fields, compact) — Companies by the name of a director or legal representative
  • GET /lookup_by_category (category, topic, county, max_results, legal_form, active_only, has_website, min_revenue, max_revenue, min_employees, max_employees, vat_payer, main_activity_only, exclude_anaf_inactive, sort, format, lang, fields, compact) — Lead list by curated topic or by raw CAEN activity code
  • POST /lookup_companies — Many CUIs in one call
  • GET /lookup_companies (cuis, fields, compact) — Many CUIs in one call, as a query string
  • POST /match_companies — Match up to 500 records to firms
  • GET /find_company_by_domain (domain, fields, compact) — The firm behind a website domain
  • GET /extract_contacts (website, max_pages) — Emails, phone numbers and social profiles found on a website
  • GET /enrich_company (cui, website, max_pages, refresh) — A whole-firm profile
  • GET /lookup_domain (domain, include_dns, include_security) — WHOIS, DNS records and an SPF/DMARC email-security audit for a domain
  • GET /financials/{cui} (cui) — Every annual financial statement on record for one firm (FY2008 onwards)
  • GET /financials/{cui}/ratios (cui) — Financial ratios, a health score and peer percentiles for one firm
  • GET /topics — The curated topics and the CAEN code sets behind them
  • GET /usage — Your own allowance
  • POST /register — Issue a free API key for an email address
  • POST /delete-data — Delete my data
  • POST /recover — Lost your key? Email it to the address it was issued to
  • POST /rotate-key — My key leaked
  • POST /alerts/email — Turn on email digests for the watches of this key (double opt-in)
  • GET /alerts/email — Where this key's watchlist alerts go, and whether they are confirmed
  • DELETE /alerts/email (lang) — Turn this key's email alerts off, or cancel a request still waiting for its confirmation
  • GET /watches — Your key's watches, each with what changed since the last poll, most severe first (a firm that stopped being a lead or left the registry, then a risk, status or ANAF change, then the rest)
  • POST /watches — Watch firms and/or CAEN codes in one call
  • DELETE /watches (kind, target, county) — Stop watching one firm (kind=company&target=<CUI>) or one CAEN code (kind=caen&target=4321[&county=Cluj])
  • POST /watches/seen — Mark every change as seen
  • GET /record/{cui} (cui, format, snapshot) — A dated, sourced company record for the file
  • POST /feedback — Report what is missing or wrong