orakel
Docs navigation

Canonical

GET /api/companies

Search and filter the Nordic company universe. Cursor-paginated.

Updated 2026-04-22

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, minRevenue to build prospect lists.
  • Technology prospecting: hasTechnology=Shopify to find Shopify merchants.
  • Change watch: sort=updatedAt&order=desc to see recently updated records (prefer /api/updates for incremental sync).