Innovadata API Reference (Swagger) Get API key

Innovadata API

Query verified company data across 8 countries: Estonia, Latvia, Lithuania, Norway, Finland, Poland, Sweden and Spain. One simple REST API.

Filter by industry, location, size, financials, contact details and more, then pull the matching companies. Everything is JSON over HTTPS.

Start free: new business accounts get 30 credits (€30 of data) on completing registration (personal profiles start with 10), enough for ≈ 750 Estonian company rows or hundreds of counterparty checks. No card required; credits are valid for 30 days.

Base URL

BASE https://app.innovadata.eu

Each country exposes a slightly different filter set (e.g. Estonia has employee & turnover data; Sweden and Spain don't). The filters endpoint tells your app exactly which filters apply per country, so you never hardcode them.

Quick example
curl https://app.innovadata.eu/api/v1/data/companies?country=EE&page_size=3 \
  -H "Authorization: Bearer YOUR_API_KEY"

Authentication

Every request needs an API key, sent as a Bearer token:

HEADER Authorization: Bearer <your key>

Create a key in your dashboardAPI keys → Create API key. The full key (ik_live_…) is shown once. Store it securely. Keep keys server-side; never embed them in a browser or mobile app.

Requests without a valid key return 401 Unauthorized.
Authenticated request
curl https://app.innovadata.eu/api/v1/data/countries \
  -H "Authorization: Bearer ik_live_xxx"

Quickstart

From zero to data in three calls:

1 · See which filters a country supports

Returns the filter list for the country and the exact query params to send.

2 · Check how many companies match

A cheap count (1 credit) to size your query before pulling rows.

3 · Pull the companies

Page through the results. You're charged per returned row.

curl
# 1: filters for Estonia
curl ".../api/v1/data/filters?country=EE" -H "$AUTH"

# 2: count manufacturers with email
curl ".../api/v1/data/count?country=EE&has_email=true" -H "$AUTH"

# 3: pull 50 of them
curl ".../api/v1/data/companies?country=EE&has_email=true&page_size=50" \
  -H "$AUTH"

Credits & metering

Programmatic access (REST API + MCP) is a subscription: unlimited for €1,500/month, 1-day free trial. Start it from your dashboard. The per-row credit prices below apply to the in-app Search product (buying export sets in the portal).

1 credit = €1. Rows are priced per country: Estonia €0.04 per row, the other countries €0.10–0.24 (the same prices as the main site; they can change, so treat the meta block in each response as authoritative).

  • Search reserves page_size × row price up front and refunds the unused portion based on rows actually returned.
  • Company detail costs one row's per-country price (e.g. €0.04 for an Estonian company).
  • Discovery and sizing are FREE: countries, filters, activities, locations and count cost nothing, so you can size a query before spending.
  • New business accounts get 30 free credits on completing registration (personal profiles start with 10; valid 30 days). Admin/integration keys are unlimited.

Top up or check your balance in the dashboard (top-ups from €20). Each metered response includes a meta block with credits charged and your remaining balance.

meta in every metered response
{
  "meta": {
    "rows_returned": 50,
    "credits_charged": 2.0,
    "credits_reserved": 2.0,
    "credit_balance": 78.0
  }
}

Errors & limits

Standard HTTP status codes. Error bodies are { "detail": "…" }.

CodeMeaning
200OK
401Missing or invalid API key
402Payment required: no active API & MCP subscription/trial (or, for in-app Search, insufficient credits)
404Not found (e.g. unknown company)
422Invalid parameter (e.g. unsupported country)
429Rate limit exceeded

Standard keys are rate-limited per key; admin/integration keys are unlimited.

402 example
{
  "detail": "insufficient credits: have 10, need 50"
}

MCP for AI agents

POST /mcp

Innovadata is also a remote MCP server (Model Context Protocol, Streamable HTTP). Connect it to Claude Code, Claude Desktop or any MCP-capable agent and it gets tools to count, search and look up companies across all 8 countries directly. Authenticate with your ik_live_… key as a Bearer token.

Access is a subscription. The MCP server and the full REST API are unlimited on the API & MCP plan, €1,500/month, with a 1-day free trial. Start the trial or subscribe from your dashboard, create an API key, then connect below. Keys without an active trial or subscription get 402.

Tools exposed: list_countries, list_filters, list_activities, count_companies, search_companies, get_company (single-company KYC lookup by registration code). All unlimited while your subscription is active.

Claude Code
claude mcp add innovadata https://app.innovadata.eu/mcp \
  --transport http \
  --header "Authorization: Bearer ik_live_…"
Claude API (MCP connector)
{
  "mcp_servers": [{
    "type": "url",
    "url": "https://app.innovadata.eu/mcp",
    "name": "innovadata",
    "authorization_token": "ik_live_…"
  }],
  "tools": [{ "type": "mcp_toolset",
              "mcp_server_name": "innovadata" }]
}

List countries FREE

GET /api/v1/data/countries

Returns the countries you can query.

Response
{
  "countries": [
    {"code":"EE","name":"Estonia"},
    {"code":"LV","name":"Latvia"},
    … LT, NO, FI, PL, SE, ES
  ]
}

Filters per country FREE

GET /api/v1/data/filters?country=EE

The heart of the API: returns the filter set for a country, exactly like the website's filter panel. Each filter tells you the param to send to search, its type, and (for tree filters) an options_url.

FieldMeaning
paramquery param to send (or param_min/max, param_from/to)
typetext · select · tree · number_range · date_range · boolean
options_urlwhere to fetch choices (tree filters)

Differences are real: EE uses ehak_kood + EMTAK + employees/turnover; LT uses lt_locations; NO/SE/ES use free-text location; FI/NO/PL/SE add vat_active; NO/PL/ES add share capital.

Response (excerpt, EE)
{
  "country":"EE", "industry_system":"EMTAK",
  "filters":[
   {"param":"emtak_codes","type":"tree",
    "options_url":"/api/v1/data/activities?country=EE"},
   {"param":"ehak_kood","type":"tree",
    "options_url":"/api/v1/data/locations?country=EE"},
   {"param_min":"last_quarter_employees_min",
    "param_max":"last_quarter_employees_max","type":"number_range"},
   {"param":"has_email","type":"boolean"}
  ]
}

Activity codes FREE

GET /api/v1/data/activities?country=EE&lang=en

The activity-classification tree for a country (EMTAK for EE, NACE/PKD/EVRK/SNI/CNAE for the others). Use the leaf code values as emtak_codes when searching.

Response (excerpt)
[
  {"code":"C","label":"Manufacturing",
   "children":[
     {"code":"10","label":"Food products"}
   ]}
]

Locations FREE

GET /api/v1/data/locations?country=EE

Location tree for EE, LV, LT, FI, PL. Use codes as ehak_kood (EE/LV/FI/PL) or lt_locations (LT). NO, SE and ES have no tree; they use the free-text location filter, so this endpoint returns 400 for them.

Response (excerpt, EE)
[
  {"code":"0784","label":"Tartu linn"},
  {"code":"0037","label":"Haabersti, Tallinn"}
]

Count companies FREE

GET /api/v1/data/count

Exact count of companies matching your filters. Call this first to size a query before spending credits. Accepts the same filters as search.

Request & response
curl ".../api/v1/data/count?country=EE&has_email=true" -H "$AUTH"
{ "country":"EE", "count":354244, "count_mode":"exact" }

Company detail METERED

GET /api/v1/data/companies/{registrikood}?country=EE

Full record for one company: contacts, activities and people. Costs one credit; refunded if the company isn't found (404).

ParamTypeNotes
registrikood pathstrregistration code
country requiredenumwhich country it belongs to
Request
curl ".../api/v1/data/companies/10000018?country=EE" \
  -H "$AUTH"
Response (excerpt)
{
  "data":{
    "registrikood":"10000018",
    "arinimi":"Acme OÜ",
    "contacts":[…], "emtak":[…], "people":[…]
  },
  "meta":{"credits_charged":1,"credit_balance":4997}
}