ICPHub Enterprise API
Programmatic access to Norwegian company and contact enrichment data.
Introduction
The ICPHub Enterprise API provides programmatic access to Norwegian company and contact enrichment data. All company information is sourced from BRREG (Brønnøysundregistrene), Norway's official business registry, and enriched with verified contact details.
https://api.icphub.no/api/v12026-03-26{"data": {...}, "meta": {...}}Authentication
All API requests require a valid API key sent in the Authorization header as a Bearer token.
Header
Authorization: Bearer ich_live_a3f9b2c1...Key prefixes
ich_live_*Production key — requests are billed against your credit balance.ich_test_*Sandbox key — returns real data but charges 0 credits. Ideal for development and testing.Create and manage your API keys from Dashboard → Settings → API Keys.
API keys should be used server-side only. Never expose them in client-side JavaScript, mobile apps, or public repositories.
Quick Start
Enrich your first company in 30 seconds. Replace YOUR_API_KEY with a key from your dashboard.
Request
curl -X POST https://api.icphub.no/api/v1/enrich/company \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"orgnr": "923609016"}'Response
{
"data": {
"orgnr": "923609016",
"name": "EQUINOR ASA",
"ceo_name": "Anders Opedal",
"website": "https://www.equinor.com",
"phone": "51 99 00 00",
"email": "post@equinor.com",
"nace_code": "06.100",
"nace_description": "Utvinning av råolje",
"employees": 22000,
"revenue_nok": 1095262000000,
"address": "Forusbeen 50",
"postal_code": "4035",
"city": "STAVANGER",
"municipality": "Stavanger",
"county": "Rogaland",
"established_date": "1972-09-18",
"org_form": "ASA",
"credit_rating": null
},
"meta": {
"request_id": "req_7f3a1b2c",
"api_version": "2026-03-26",
"processing_time_ms": 23,
"credits_charged": 1,
"is_sandbox": false,
"rate_limit_remaining": 299
}
}/api/v1/enrich/companyEnrich Company
Retrieve comprehensive company data for a Norwegian organization. Returns business details, financials, contact information, and industry classification.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
| orgnr | string | Yes | 9-digit Norwegian organization number |
Response fields
| Parameter | Type | Required | Description |
|---|---|---|---|
| orgnr | string | - | Organization number |
| name | string | null | - | Registered company name |
| ceo_name | string | null | - | Name of the CEO (daglig leder) |
| website | string | null | - | Company website URL |
| phone | string | null | - | Company phone number |
| string | null | - | Company email address | |
| nace_code | string | null | - | NACE industry classification code |
| nace_description | string | null | - | Human-readable industry description |
| employees | integer | null | - | Number of employees |
| revenue_nok | number | null | - | Annual revenue in NOK |
| address | string | null | - | Street address |
| postal_code | string | null | - | Postal code |
| city | string | null | - | City name |
| municipality | string | null | - | Municipality (kommune) |
| county | string | null | - | County (fylke) |
| established_date | string | null | - | Date of establishment (YYYY-MM-DD) |
| org_form | string | null | - | Organization form (AS, ASA, ENK, etc.) |
| credit_rating | string | null | - | Credit rating if available |
Request
curl -X POST https://api.icphub.no/api/v1/enrich/company \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"orgnr": "923609016"}'Response
{
"data": {
"orgnr": "923609016",
"name": "EQUINOR ASA",
"ceo_name": "Anders Opedal",
"website": "https://www.equinor.com",
"phone": "51 99 00 00",
"email": "post@equinor.com",
"nace_code": "06.100",
"nace_description": "Utvinning av råolje",
"employees": 22000,
"revenue_nok": 1095262000000,
"address": "Forusbeen 50",
"postal_code": "4035",
"city": "STAVANGER",
"municipality": "Stavanger",
"county": "Rogaland",
"established_date": "1972-09-18",
"org_form": "ASA",
"credit_rating": null
},
"meta": {
"request_id": "req_7f3a1b2c",
"api_version": "2026-03-26",
"processing_time_ms": 23,
"credits_charged": 1,
"is_sandbox": false,
"rate_limit_remaining": 299
}
}/api/v1/enrich/contactEnrich Contact
Retrieve contact information for a specific role at a Norwegian company. Supports a range of business roles from CEO to board members.
Request body
| Parameter | Type | Required | Description |
|---|---|---|---|
| orgnr | string | Yes | 9-digit Norwegian organization number |
| role | string | No (default: "ceo") | Role to look up. See allowed values below. |
Allowed roles
ceostyrelederstyremedlemcfoctohrsalesmarketingoperationsgenericResponse fields
| Parameter | Type | Required | Description |
|---|---|---|---|
| orgnr | string | - | Organization number |
| contact_name | string | null | - | Full name of the contact |
| phone | string | null | - | Phone number |
| string | null | - | Email address | |
| role | string | null | - | Role code (e.g. "ceo") |
| role_display_name | string | null | - | Localized role name (e.g. "Daglig leder") |
| company_name | string | null | - | Company name |
| source | string | null | - | Data source identifier |
Request
curl -X POST https://api.icphub.no/api/v1/enrich/contact \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"orgnr": "923609016", "role": "ceo"}'Response
{
"data": {
"orgnr": "923609016",
"contact_name": "Anders Opedal",
"phone": "51 99 00 00",
"email": "post@equinor.com",
"role": "ceo",
"role_display_name": "Daglig leder",
"company_name": "EQUINOR ASA",
"source": null
},
"meta": {
"request_id": "req_8d4e2f1a",
"api_version": "2026-03-26",
"processing_time_ms": 18,
"credits_charged": 1,
"is_sandbox": false,
"rate_limit_remaining": 297
}
}/api/v1/company/{orgnr}/rolesCompany Roles
Retrieve all current roles (board members, CEO, etc.) for a Norwegian company. Only active (non-resigned) roles are returned.
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| orgnr | string | Yes | 9-digit Norwegian organization number |
Response fields (array)
| Parameter | Type | Required | Description |
|---|---|---|---|
| role_type | string | - | Role code (e.g. "DAGL", "LEDE", "MEDL") |
| role_description | string | null | - | Human-readable role description |
| name | string | null | - | Person name |
| start_date | string | null | - | Role start date (YYYY-MM-DD) |
| is_resigned | boolean | - | Always false (only active roles returned) |
Request
curl https://api.icphub.no/api/v1/company/923609016/roles \
-H "Authorization: Bearer YOUR_API_KEY"Response
{
"data": [
{
"role_type": "DAGL",
"role_description": "Daglig leder",
"name": "Anders Opedal",
"start_date": "2020-11-02",
"is_resigned": false
},
{
"role_type": "LEDE",
"role_description": "Styrets leder",
"name": "Jon Erik Reinhardsen",
"start_date": "2018-05-15",
"is_resigned": false
},
{
"role_type": "MEDL",
"role_description": "Styremedlem",
"name": "Hilde Merete Aasheim",
"start_date": "2023-05-10",
"is_resigned": false
}
],
"meta": {
"request_id": "req_2c8f4a1b",
"api_version": "2026-03-26",
"processing_time_ms": 12,
"credits_charged": 0,
"is_sandbox": false,
"rate_limit_remaining": 298
}
}/api/v1/company/{orgnr}/role-changesRole Changes
Retrieve the history of role changes for a company. Useful for tracking leadership transitions and board changes. Results are cursor-paginated.
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| orgnr | string | Yes | 9-digit Norwegian organization number |
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | integer | No | Results per page. Default 50, max 100. |
| cursor | string | No | Pagination cursor from previous response meta.next_cursor. |
Response fields (array)
| Parameter | Type | Required | Description |
|---|---|---|---|
| orgnr | string | - | Organization number |
| role_type | string | - | Role code (e.g. "DAGL") |
| old_name | string | null | - | Previous person in the role |
| new_name | string | null | - | New person in the role |
| changed_at | string | - | ISO 8601 timestamp of the change |
Pagination: check meta.has_more and use meta.next_cursor for the next page.
Request
curl "https://api.icphub.no/api/v1/company/923609016/role-changes?limit=10" \
-H "Authorization: Bearer YOUR_API_KEY"Response
{
"data": [
{
"orgnr": "923609016",
"role_type": "DAGL",
"old_name": "Eldar Sætre",
"new_name": "Anders Opedal",
"changed_at": "2020-11-02T00:00:00Z"
}
],
"meta": {
"request_id": "req_5e9b3d7f",
"api_version": "2026-03-26",
"processing_time_ms": 9,
"credits_charged": 0,
"is_sandbox": false,
"rate_limit_remaining": 296,
"has_more": false,
"next_cursor": null,
"limit": 10
}
}/api/v1/credits/balanceCredits Balance
Check your organization's current credit balance and usage for the billing period.
Response fields
| Parameter | Type | Required | Description |
|---|---|---|---|
| organization_id | string | - | Your organization ID |
| credits_balance | integer | - | Credits remaining |
| credits_used_this_period | integer | - | Credits consumed in current billing period |
| period_start | string | null | - | Billing period start (ISO 8601) |
| period_end | string | null | - | Billing period end (ISO 8601) |
Request
curl https://api.icphub.no/api/v1/credits/balance \
-H "Authorization: Bearer YOUR_API_KEY"Response
{
"data": {
"organization_id": "org_a1b2c3d4",
"credits_balance": 4750,
"credits_used_this_period": 250,
"period_start": "2026-03-01T00:00:00Z",
"period_end": "2026-03-31T23:59:59Z"
},
"meta": {
"request_id": "req_1a2b3c4d",
"api_version": "2026-03-26",
"processing_time_ms": 5,
"credits_charged": 0,
"is_sandbox": false,
"rate_limit_remaining": 295
}
}/api/v1/usageUsage History
Retrieve detailed API usage logs for your organization. Supports date filtering and cursor-based pagination.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | integer | No | Results per page. Default 50, max 100. |
| cursor | string | No | Pagination cursor from previous response meta.next_cursor. |
| since | string | No | Filter entries from this date (ISO 8601). |
| until | string | No | Filter entries up to this date (ISO 8601). |
Response fields (array)
| Parameter | Type | Required | Description |
|---|---|---|---|
| endpoint | string | - | API endpoint called (e.g. "/enrich/company") |
| orgnr | string | null | - | Organization number used in the request |
| credits_charged | integer | - | Credits deducted for this request |
| response_status | integer | null | - | HTTP status code of the response |
| duration_ms | integer | null | - | Request processing time in milliseconds |
| logged_at | string | - | Timestamp of the request (ISO 8601) |
Request
curl "https://api.icphub.no/api/v1/usage?limit=5&since=2026-03-01T00:00:00Z" \
-H "Authorization: Bearer YOUR_API_KEY"Response
{
"data": [
{
"endpoint": "/enrich/company",
"orgnr": "923609016",
"credits_charged": 1,
"response_status": 200,
"duration_ms": 23,
"logged_at": "2026-03-27T14:32:01Z"
},
{
"endpoint": "/enrich/contact",
"orgnr": "923609016",
"credits_charged": 1,
"response_status": 200,
"duration_ms": 18,
"logged_at": "2026-03-27T14:31:45Z"
}
],
"meta": {
"request_id": "req_6f7g8h9i",
"api_version": "2026-03-26",
"processing_time_ms": 7,
"credits_charged": 0,
"is_sandbox": false,
"rate_limit_remaining": 294,
"has_more": true,
"next_cursor": "10482",
"limit": 5
}
}API Keys
Manage API keys programmatically. Requires the keys:manage scope (not included in default scopes — you must explicitly request it when creating the parent key). You can also manage keys from the dashboard.
/api/v1/api-keysCreate API Key
Creates a new API key. The full key value is returned only once in the response — store it securely. Subsequent requests will only show the masked prefix.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Human-readable key name (1-100 characters) |
| scopes | string[] | No | Permission scopes. Defaults to all except keys:manage. Available: enrich:company, enrich:contact, company:read, credits:read, usage:read, keys:manage. |
| is_sandbox | boolean | No | Create a sandbox key (default: false) |
Request
curl -X POST https://api.icphub.no/api/v1/api-keys \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Production Integration", "is_sandbox": false}'Response (201 Created)
{
"data": {
"key": "ich_live_a3f9b2c1d4e5f6a7b8c9d0e1f2a3b4c5",
"key_info": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Production Integration",
"key_prefix": "ich_live_a3f9b2c1",
"scopes": [
"enrich:company",
"enrich:contact",
"company:read",
"credits:read",
"usage:read"
],
"rate_limit_per_minute": 300,
"is_sandbox": false,
"is_active": true,
"last_used_at": null,
"expires_at": null,
"created_at": "2026-03-27T10:00:00Z"
}
},
"meta": {
"request_id": "req_create_1a2b",
"api_version": "2026-03-26",
"processing_time_ms": 45,
"credits_charged": 0,
"is_sandbox": false,
"rate_limit_remaining": null
}
}/api/v1/api-keysList API Keys
List all API keys for your organization. Key secrets are never included — only the masked prefix is returned.
Request
curl https://api.icphub.no/api/v1/api-keys \
-H "Authorization: Bearer YOUR_API_KEY"/api/v1/api-keys/{key_id}Revoke API Key
Permanently deactivate an API key. Any integrations using this key will immediately stop working. This action cannot be undone.
| Parameter | Type | Required | Description |
|---|---|---|---|
| key_id | string (UUID) | Yes | The ID of the API key to revoke |
Request
curl -X DELETE https://api.icphub.no/api/v1/api-keys/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer YOUR_API_KEY"Errors
The API uses standard HTTP status codes and returns errors in a consistent JSON envelope.
| Status | Code | Description |
|---|---|---|
| 401 | unauthorized | Missing or invalid API key |
| 402 | insufficient_credits | Not enough credits to complete the request |
| 403 | missing_scope | API key lacks the required scope for this endpoint |
| 404 | not_found | Company or contact not found |
| 409 | duplicate_name | API key name already exists |
| 422 | validation_error | Invalid request body (Pydantic validation) |
| 422 | invalid_orgnr | Organization number must be exactly 9 digits |
| 422 | key_limit_reached | Maximum active API keys per organization exceeded |
| 429 | rate_limit_exceeded | Too many requests — check Retry-After header |
| 429 | too_many_attempts | Too many failed authentication attempts |
| 500 | billing_error | Credit deduction failed — retry the request |
| 503 | service_unavailable | Database temporarily unreachable — retry with backoff |
Error response shape
{
"error": {
"code": "not_found",
"message": "Selskap med orgnr 999999999 ikke funnet",
"type": "not_found",
"request_id": "req_abc123"
}
}Rate Limits
Rate limits are enforced per API key and vary by plan. When you exceed the limit, you will receive a 429 response.
| Plan | Requests per minute |
|---|---|
| Free | 60 |
| Plus | 120 |
| Pro | 300 |
| Enterprise | 1,000 |
| Sandbox keys | 10 |
Response headers
RateLimit-RemainingIncluded in enrichment and data endpoint responses. Shows remaining requests in the current window.Retry-AfterIncluded in 429 responses. Number of seconds to wait before retrying.Credits & Billing
API requests that perform enrichment consume credits from your organization's balance. Read-only endpoints are free.
| Endpoint | Credit cost |
|---|---|
| POST /enrich/company | 1 credit |
| POST /enrich/contact | 1 credit |
| GET /company/{orgnr}/roles | Free |
| GET /company/{orgnr}/role-changes | Free |
| GET /credits/balance | Free |
| GET /usage | Free |
| POST /api-keys | Free |
| GET /api-keys | Free |
| DELETE /api-keys/{key_id} | Free |
Billing rules
- •Sandbox keys (
ich_test_*) always charge 0 credits, regardless of endpoint. - •Atomic deduction — credits are deducted only on successful enrichment. If the request fails or the company is not found (404), no credit is charged.
- •Idempotent retries — send an
X-Request-IDheader with your own unique ID. If a request is retried with the same ID, credits are charged only once. - •Need more credits? View pricing plans.
Ready to get started?
Create your API key and start enriching Norwegian company data in minutes.