Canonical
GET /api/companies/:orgNumber
Fetch a single company record with embedded financials, roles, and sub-units.
Request
GET /api/companies/:orgNumber
| Parameter | Type | Required | Description |
|---|---|---|---|
orgNumber |
string | yes | Path parameter. 9-digit Norwegian org number. For Finnish (NNNNNNN-N) or Swedish (10-digit) records, pass the base number plus country. |
country |
"NO" | "FI" | "SE" | "DK" |
no | Default "NO". Selects the registry. See Brreg, YTJ, Bolagsverket, CVR. |
include |
"context" |
no | When context, appends SSB aggregate context (municipality population, industry wage averages) to the response. |
On a Norwegian cache miss the handler fetches the record live from Brreg and stores it. Non-NO misses return 404 — load those universes via their bulk sync jobs.
Response
{
"orgNumber": "923609016",
"country": "NO",
"name": "EQUINOR ASA",
"orgFormCode": "ASA",
"employeeCount": 22000,
"_sources": {
"attribution": ["Brønnøysundregistrene", "Regnskapsregisteret", "SSB Klass"],
"fields": {
"companyCore": "Brønnøysundregistrene",
"roles": "Brønnøysundregistrene",
"financials": "Regnskapsregisteret",
"financialRatios": { "source": "Regnskapsregisteret", "computed": true },
"industryLabel": "SSB Klass",
"orgFormLabel": "SSB Klass",
"countryLabel": "SSB Klass"
}
}
}The full response also includes address fields (including geocoded businessAddressLat/businessAddressLng), NACE codes, parentOrgNumber, registry flags (isBankrupt, isInGroup, isBeingDissolved), enrichment fields (primaryDomain, linkedinHandle, technologies), the new enrichment scalars (description, descriptionKeywords, trafficRank, sizeClass, digitalizationIndex, socialIndex), an array of financials with computed ratios (profitMargin, returnOnEquity, equityRatio, grossMargin, ebitda, revenueGrowthYoY), an array of active roles (board, CEO, auditor — for NO and DK roles also carry ownershipPercent on EIER/EJER entries), and an array of subUnits (with geocoded addressLat/addressLng). Klass labels are attached alongside the raw codes: naceName (NACE description), orgFormName (org form description), countryName — see SSB Klass. Every response also carries _sources — a per-field attribution block for rendering source credits. Full field catalogue: Fields.
For NO companies on keys with financial history enabled, the response also includes pdfHistoryStatus: "available" (multi-year history is present), "fetching" (first-call extraction is running in the background — poll again in ~60 s), or "not_enabled" (feature not active for this key).
Examples
curl
curl -H "Authorization: Bearer $ORAKEL_KEY" \
https://orakel.cloud/api/companies/923609016JavaScript
const res = await fetch("https://orakel.cloud/api/companies/923609016", {
headers: { Authorization: `Bearer ${process.env.ORAKEL_KEY}` },
});
const company = await res.json();Swedish record
curl -H "Authorization: Bearer $ORAKEL_KEY" \
"https://orakel.cloud/api/companies/5560000000?country=SE"Error modes
| Status | Meaning | Action |
|---|---|---|
| 400 | orgNumber is not 9 digits |
Check the path segment |
| 401 | Missing or invalid API key | Check the Authorization: Bearer … header |
| 404 | Company not found (cache miss and Brreg returned 404, or non-NO miss) | Verify the org number and country |
| 429 | Rate or quota exceeded | Back off; see Rate limits |
| 502 | Brreg upstream error | Retry |
Rate limits
Per-key RPM applies (tier default: free 20/min, pro 60/min, enterprise 120/min). Per-IP 20 failed auth attempts per 15 min. Daily and monthly quotas are tier-scoped.
Typical use cases
- CRM enrichment on a single record (
orgNumber→ full company). - Live refresh of a stale row — NO cache misses trigger a fresh Brreg pull.
- Embedding market context with
?include=contextfor sales briefings.