Integrations

TypeScript and Python SDKs

Typed clients for the Prometiam API. They return the API's own envelope, retry on 429 and 5xx, page through results and send batch calls in one request.

TypeScript

Node 18 or newer, Deno, Bun and browsers.

npm install prometiam-risk-api
import { PrometiamClient } from 'prometiam-risk-api'

const api = new PrometiamClient({ apiKey: process.env.PROMETIAM_API_KEY! })

const { data } = await api.companies.search({ name: 'Inditex', country: 'ES' })
console.log(data[0].company_name, data[0].company_number)

const detail = await api.companies.get(data[0].id, { include: 'risk_flags,insolvency' })

Python

Python 3.9 or newer.

pip install prometiam-risk-api
import os
from prometiam_risk_api import Client

api = Client(api_key=os.environ["PROMETIAM_API_KEY"])

page = api.companies_search(name="Inditex", country="ES")
first = page["data"][0]
print(first["company_name"], first["company_number"])

detail = api.company(first["id"], include="risk_flags,insolvency")

Errors

A 403 upgrade_required becomes an UpgradeRequiredError that carries the plan, the price and the trial allowance. A 429 becomes a RateLimitError with the retry delay, and a batch that does not fit says how many items would (max_items_now).

Every item of a batch counts as one request. An over-quota batch is refused up front with 429 batch_exceeds_quota.

Authenticate and make a first call

Get a key with the 14-day free trial (card required, nothing charged for 14 days) and keep it in an environment variable. Both clients send it as a Bearer token to https://api.prometiam.com/functions/v1/risk-api; set baseUrl (TypeScript) or base_url (Python) only to go through a proxy. The quick start above prints its first match:

INDUSTRIA DE DISEÑO TEXTIL, S.A A15075062

Every method returns the API’s own envelope, so nothing is renamed or hidden. Besides the data array, that first call returned a pagination object and a meta object; meta.rate_limit carries rpm_remaining and daily_remaining.

{
  "data": [ ... ],
  "pagination": { "count": 1, "has_more": true, "next_cursor": "o:1" },
  "meta": { "query_ms": 116, "search_mode": "name", "country": "ES" }
}

What each client wraps

Every endpoint of the API has a method. TypeScript groups them by resource; Python uses flat names.

TaskTypeScriptPython
Search companiesapi.companies.search({ name, country })api.companies_search(name=…, country=…)
One company, with optional blocksapi.companies.get(id, { include })api.company(id, include=…)
Look up a list (up to 100)api.companies.lookup(items)api.companies_lookup(items)
Financial statementsapi.companies.financials(id, params)api.company_financials(id, **params)
Insolvency check for a list (up to 100)api.insolvency.check(items)api.insolvency_check(items)
Sanctions screen for many names (beta)api.sanctions.screenBatch(names)api.sanctions_screen_batch(names)
Plan, limits and usageapi.account()api.account()
Anything not wrappedapi.request('GET', '/coverage')api.request("GET", "/coverage")

Pagination, batches and replays

List endpoints return a cursor in pagination.next_cursor. paginate follows it and hands you one page at a time, so a long result is a loop and not a cursor to manage:

for await (const page of api.paginate('/people/search', { name: 'garcia', country: 'ES', limit: 50 })) {
  for (const person of page) console.log(person.full_name)
}
for page in api.paginate("/people/search", {"name": "garcia", "country": "ES", "limit": 50}):
    for person in page:
        print(person["full_name"])

The batch methods send a whole list in one HTTP call: up to 100 companies for a lookup or an insolvency check, up to 50 names for a sanctions screen. Every item counts as one request and costs what the same single call costs. A batch that does not fit in the credits you have left is refused up front with a RateLimitError (batch_exceeds_quota) whose maxItemsNow (max_items_now in Python) says how many items would fit. Items that did not finish come back with status timeout: send them again. In Python, idempotency_key replays the same batch safely for 24 hours without using credits again.

Typed errors and retries

ErrorWhen it is thrown
AuthError401, or 403 for a country the key cannot access.
UpgradeRequiredError403 upgrade_required: the scope is not in your plan, or the free trial allowance is used up. It carries the plan that includes it, the price, the upgrade URL and the trial allowance.
RateLimitError429. Retried automatically, up to two times by default, waiting for Retry-After; it carries retryAfter and, for batches, maxItemsNow.
ValidationError400: a malformed parameter, such as a company number that fails its check digit.
NotFoundError404.
PrometiamErrorAnything else, with status, code and body on every error.

Retries cover 429 and 5xx. Set maxRetries (max_retries in Python) to 0 to handle them yourself; the default timeout is 30 seconds. A call that fails costs no credits.

Credits, limits and countries

The SDKs add no cost and no limit of their own: they spend your plan’s credits exactly like a raw request. A successful call costs 1 credit for a company search or record, 2 for events, people, the director network and insolvency, 3 per name for a sanctions screen and 25 for a company’s financial statements; errors are free. Starter includes 1,000 credits a month at 60 requests a minute, Professional 10,000 credits at 120 and Scale 50,000 credits at 300; the free trial has 500 credits in total at 10 requests a minute. account() returns what is left.

Coverage is the API’s. What shows up in code:

  • Person records and the director network exist for Spain, France, the United Kingdom and Norway. Poland has its boards and representation rule on the company record (natural persons masked by the register). Every other country is company records only, so a people search returns an empty list for it.
  • Ireland, Poland and Norway have register-change events only (name, status, legal form, registered address), none before 14 October 2026, and no gazette: events returns an empty list until a change is seen.
  • Insolvency notices are corporate only, in sixteen markets; consumer insolvency is never returned. Sanctions screening is beta, and PEP hits are beta and Spain only.
  • Financial statements need the Scale plan or above (25 credits a call); Starter, Professional and trial keys get 10 such calls a month.

Which integration fits

  • Your own service in TypeScript or Python: the SDK, for retries, cursors and typed errors.
  • A no-code or low-code flow: the n8n node.
  • Trying requests by hand or sharing examples: the Postman collection.
  • Questions put to an AI assistant: the MCP server.
  • Any other language: the API is plain REST with an OpenAPI 3.0 file that generators read.

Questions

Which runtimes and versions are supported?

The TypeScript client needs Node 18 or newer and runs on Deno, Bun and in browsers (any runtime with fetch). The Python client needs Python 3.9 or newer and uses httpx.

Can I call the API from browser code?

The client runs there, but a key in browser code is visible to every visitor. Call the API from your server and give your front end only what it needs.

Does the client retry failed calls?

Yes, for 429 and 5xx responses, up to two times by default, waiting for Retry-After when the API sends it. Other errors are thrown at once as typed errors.

Are the types complete?

The TypeScript types are generated from the public OpenAPI file and exported as paths, components and operations, so a response type can be named from the spec. The Python methods return dictionaries shaped like the API envelope.

Is there a client for my language?

Not an official one. The API is REST with an OpenAPI 3.0 file, so any language can call it or generate a client from the file.

Limits that apply everywhere

  • Sanctions screening is beta. PEP screening is beta and Spain only.
  • Insolvency notices are corporate only, in sixteen markets.
  • Monitoring covers every live country except France and Chile.
  • Officers are served for Spain, France, the United Kingdom, Norway and Poland (Polish natural persons are masked by the register). Every other country is company records only.

Contains CVR data (Erhvervsstyrelsen), CC BY 4.0.

More

Start your 14-day free trial →Card required. Nothing charged for 14 days.