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 →
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.
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.
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).
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.
curl -H "X-API-Key: lg_your_key" "https://leadgen.adrianhomelab.com/lookup_business?query=DEDEMAN&max_results=3"
import requests # pip install requests
r = requests.get(
"https://leadgen.adrianhomelab.com/lookup_business",
params={"query": "DEDEMAN", "max_results": 3},
headers={"X-API-Key": "lg_your_key"},
timeout=30,
)
r.raise_for_status()
for firm in r.json()["results"]:
print(firm["cui"], firm["companyName"])// Node 18+ (built-in fetch), run as an ES module (.mjs)
const r = await fetch("https://leadgen.adrianhomelab.com/lookup_business?query=DEDEMAN&max_results=3", {
headers: { "X-API-Key": "lg_your_key" },
});
if (!r.ok) throw new Error(`HTTP ${r.status}`);
const { results } = await r.json();
for (const firm of results) console.log(firm.cui, firm.companyName);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" }
}
}
}In claude.ai or Claude Desktop: Customize → Connectors → + → Add custom connector. Name it Leadgen, paste the URL below, choose No sign in; with a key, add the request header Authorization: Bearer lg_your_key. The connector then works in Claude Desktop and the mobile apps too. (Claude Desktop's claude_desktop_config.json is for local servers only.) Free plans allow one custom connector.
https://leadgen-mcp.adrianhomelab.com/mcp
In ~/.cursor/mcp.json (every project) or .cursor/mcp.json (this project):
{
"mcpServers": {
"leadgen": {
"url": "https://leadgen-mcp.adrianhomelab.com/mcp",
"headers": { "Authorization": "Bearer lg_your_key" }
}
}
}In .vscode/mcp.json (or MCP: Add Server… → HTTP in the command palette). VS Code uses servers and needs "type": "http":
{
"servers": {
"leadgen": {
"type": "http",
"url": "https://leadgen-mcp.adrianhomelab.com/mcp",
"headers": { "Authorization": "Bearer lg_your_key" }
}
}
}Any other client that speaks Streamable HTTP: the endpoint below, header optional. Or install it with Smithery:
https://leadgen-mcp.adrianhomelab.com/mcp
npx @smithery/cli install @oaida-adrian-3qb2/leadgen-mcp
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.
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.
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.
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.
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.
POST /api/subscribe — Start a Pro or Business subscriptionGET /api/billing/intent (u) — What a signed upgrade link names, for the checkout pageGET /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 subscribePOST /api/billing/portal — Open the Stripe Customer Portal for the subscription of the key in X-API-KeyPOST /api/billing/portal-link — Email a one-time link to the subscription portal to an address that has a subscriptionGET /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 EURGET /health — Liveness, plus which ONRC snapshot is being served and how old it isGET /lookup_business (query, max_results, county, fields, compact) — Company search by name or CUIGET /lookup_director (name, max_results, prefix, fields, compact) — Companies by the name of a director or legal representativeGET /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 codePOST /lookup_companies — Many CUIs in one callGET /lookup_companies (cuis, fields, compact) — Many CUIs in one call, as a query stringPOST /match_companies — Match up to 500 records to firmsGET /find_company_by_domain (domain, fields, compact) — The firm behind a website domainGET /extract_contacts (website, max_pages) — Emails, phone numbers and social profiles found on a websiteGET /enrich_company (cui, website, max_pages, refresh) — A whole-firm profileGET /lookup_domain (domain, include_dns, include_security) — WHOIS, DNS records and an SPF/DMARC email-security audit for a domainGET /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 firmGET /topics — The curated topics and the CAEN code sets behind themGET /usage — Your own allowancePOST /register — Issue a free API key for an email addressPOST /delete-data — Delete my dataPOST /recover — Lost your key? Email it to the address it was issued toPOST /rotate-key — My key leakedPOST /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 confirmedDELETE /alerts/email (lang) — Turn this key's email alerts off, or cancel a request still waiting for its confirmationGET /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 callDELETE /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 seenGET /record/{cui} (cui, format, snapshot) — A dated, sourced company record for the filePOST /feedback — Report what is missing or wrong