Canonical
GET /api/companies
Search and filter the Nordic company universe. Cursor-paginated.
Request
GET /api/companies
Free-tier keys must supply at least one filter. Responses include the latest two financial records and active roles per company.
| Parameter | Type | Required | Description |
|---|---|---|---|
country |
"NO" | "FI" | "SE" |
no | 2-letter ISO, uppercased. Scopes the search to one registry. See Brreg, YTJ, Bolagsverket. |
q |
string | no | Case-insensitive name match. |
nace |
string | no | NACE code or prefix (e.g. 56.3). |
orgForm |
string | no | Legal form code (AS, ASA, ENK, AB, OY, …). |
municipality |
string | no | 4-digit municipality number (NO). |
county |
string | no | 2-digit county code (NO). |
minEmployees |
integer | no | Inclusive lower bound. |
maxEmployees |
integer | no | Inclusive upper bound. |
minRevenue |
number | no | NOK. Filters on latest financial. |
maxRevenue |
number | no | NOK. |
isBankrupt |
boolean | no | true or false. |
isInGroup |
boolean | no | true or false. |
hasParent |
boolean | no | true when parentOrgNumber is set. |
hasTechnology |
string | no | Exact technology name (e.g. WordPress, Shopify). See enrichment source. |
hasAnyAdPixel |
boolean | no | true to return only companies running an ad pixel. |
include |
"context" |
no | Appends SSB aggregate context per row. |
sort |
"name" | "employeeCount" | "foundingDate" | "updatedAt" |
no | Default name. |
order |
"asc" | "desc" |
no | Default asc. |
limit |
integer | no | 1–100. Tier-capped (free: 20). Default 20. |
cursor |
string | no | Pagination cursor from a prior response. |
Response
{
"data": [
{
"orgNumber": "912345678",
"name": "Example AS",
"country": "NO",
"employeeCount": 42,
"_sources": {
"attribution": ["Brønnøysundregistrene", "SSB Klass"],
"fields": {
"companyCore": "Brønnøysundregistrene",
"industryLabel": "SSB Klass",
"orgFormLabel": "SSB Klass"
}
}
}
],
"nextCursor": "clx...",
"hasMore": true
}Each row carries the same firmographic fields as single-company lookup, plus the last two financials, active roles, and a _sources block scoped to that row. Klass labels (naceName, orgFormName, countryName) are attached alongside the raw codes — see SSB Klass. Use cursor for the next page; stop when hasMore is false.
Examples
curl
curl -H "Authorization: Bearer $ORAKEL_KEY" \
"https://orakel.cloud/api/companies?country=NO&nace=56.3&minEmployees=5"JavaScript
const params = new URLSearchParams({
country: "NO",
nace: "56.3",
minEmployees: "5",
});
const res = await fetch(`https://orakel.cloud/api/companies?${params}`, {
headers: { Authorization: `Bearer ${process.env.ORAKEL_KEY}` },
});
const { data, nextCursor, hasMore } = await res.json();Error modes
| Status | Meaning | Action |
|---|---|---|
| 400 | Invalid parameters, or free-tier request with no filter | Inspect details[] in response body |
| 401 | Missing or invalid API key | Check the Authorization header |
| 429 | Rate, cursor-depth, or quota limit hit | Back off; respect Retry-After |
| 500 | Query failed | Retry |
Rate limits
Per-key RPM per tier as above. A cursor-depth guard limits one key to 50 consecutive cursor follows per 5-minute window — designed to cap bulk downloads. When hit, the response is 429 with Retry-After.
Typical use cases
- ICP filtering:
country,nace,minEmployees,minRevenueto build prospect lists. - Technology prospecting:
hasTechnology=Shopifyto find Shopify merchants. - Change watch:
sort=updatedAt&order=descto see recently updated records (prefer/api/updatesfor incremental sync).