API Reference

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.

Base URLhttps://api.icphub.no/api/v1
API Version2026-03-26
FormatJSON. All responses use the envelope {"data": {...}, "meta": {...}}
EncodingUTF-8

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
  }
}
POST/api/v1/enrich/company

Enrich Company

Retrieve comprehensive company data for a Norwegian organization. Returns business details, financials, contact information, and industry classification.

1 credit per request

Request body

ParameterTypeRequiredDescription
orgnrstringYes9-digit Norwegian organization number

Response fields

ParameterTypeRequiredDescription
orgnrstring-Organization number
namestring | null-Registered company name
ceo_namestring | null-Name of the CEO (daglig leder)
websitestring | null-Company website URL
phonestring | null-Company phone number
emailstring | null-Company email address
nace_codestring | null-NACE industry classification code
nace_descriptionstring | null-Human-readable industry description
employeesinteger | null-Number of employees
revenue_noknumber | null-Annual revenue in NOK
addressstring | null-Street address
postal_codestring | null-Postal code
citystring | null-City name
municipalitystring | null-Municipality (kommune)
countystring | null-County (fylke)
established_datestring | null-Date of establishment (YYYY-MM-DD)
org_formstring | null-Organization form (AS, ASA, ENK, etc.)
credit_ratingstring | 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
  }
}
POST/api/v1/enrich/contact

Enrich Contact

Retrieve contact information for a specific role at a Norwegian company. Supports a range of business roles from CEO to board members.

1 credit per request

Request body

ParameterTypeRequiredDescription
orgnrstringYes9-digit Norwegian organization number
rolestringNo (default: "ceo")Role to look up. See allowed values below.

Allowed roles

ceostyrelederstyremedlemcfoctohrsalesmarketingoperationsgeneric

Response fields

ParameterTypeRequiredDescription
orgnrstring-Organization number
contact_namestring | null-Full name of the contact
phonestring | null-Phone number
emailstring | null-Email address
rolestring | null-Role code (e.g. "ceo")
role_display_namestring | null-Localized role name (e.g. "Daglig leder")
company_namestring | null-Company name
sourcestring | 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
  }
}
GET/api/v1/company/{orgnr}/roles

Company Roles

Retrieve all current roles (board members, CEO, etc.) for a Norwegian company. Only active (non-resigned) roles are returned.

Free

Path parameters

ParameterTypeRequiredDescription
orgnrstringYes9-digit Norwegian organization number

Response fields (array)

ParameterTypeRequiredDescription
role_typestring-Role code (e.g. "DAGL", "LEDE", "MEDL")
role_descriptionstring | null-Human-readable role description
namestring | null-Person name
start_datestring | null-Role start date (YYYY-MM-DD)
is_resignedboolean-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
  }
}
GET/api/v1/company/{orgnr}/role-changes

Role Changes

Retrieve the history of role changes for a company. Useful for tracking leadership transitions and board changes. Results are cursor-paginated.

Free

Path parameters

ParameterTypeRequiredDescription
orgnrstringYes9-digit Norwegian organization number

Query parameters

ParameterTypeRequiredDescription
limitintegerNoResults per page. Default 50, max 100.
cursorstringNoPagination cursor from previous response meta.next_cursor.

Response fields (array)

ParameterTypeRequiredDescription
orgnrstring-Organization number
role_typestring-Role code (e.g. "DAGL")
old_namestring | null-Previous person in the role
new_namestring | null-New person in the role
changed_atstring-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
  }
}
GET/api/v1/credits/balance

Credits Balance

Check your organization's current credit balance and usage for the billing period.

Free

Response fields

ParameterTypeRequiredDescription
organization_idstring-Your organization ID
credits_balanceinteger-Credits remaining
credits_used_this_periodinteger-Credits consumed in current billing period
period_startstring | null-Billing period start (ISO 8601)
period_endstring | 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
  }
}
GET/api/v1/usage

Usage History

Retrieve detailed API usage logs for your organization. Supports date filtering and cursor-based pagination.

Free

Query parameters

ParameterTypeRequiredDescription
limitintegerNoResults per page. Default 50, max 100.
cursorstringNoPagination cursor from previous response meta.next_cursor.
sincestringNoFilter entries from this date (ISO 8601).
untilstringNoFilter entries up to this date (ISO 8601).

Response fields (array)

ParameterTypeRequiredDescription
endpointstring-API endpoint called (e.g. "/enrich/company")
orgnrstring | null-Organization number used in the request
credits_chargedinteger-Credits deducted for this request
response_statusinteger | null-HTTP status code of the response
duration_msinteger | null-Request processing time in milliseconds
logged_atstring-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.

POST/api/v1/api-keys

Create 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.

ParameterTypeRequiredDescription
namestringYesHuman-readable key name (1-100 characters)
scopesstring[]NoPermission scopes. Defaults to all except keys:manage. Available: enrich:company, enrich:contact, company:read, credits:read, usage:read, keys:manage.
is_sandboxbooleanNoCreate 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
  }
}
GET/api/v1/api-keys

List 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"
DELETE/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.

ParameterTypeRequiredDescription
key_idstring (UUID)YesThe 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.

StatusCodeDescription
401unauthorizedMissing or invalid API key
402insufficient_creditsNot enough credits to complete the request
403missing_scopeAPI key lacks the required scope for this endpoint
404not_foundCompany or contact not found
409duplicate_nameAPI key name already exists
422validation_errorInvalid request body (Pydantic validation)
422invalid_orgnrOrganization number must be exactly 9 digits
422key_limit_reachedMaximum active API keys per organization exceeded
429rate_limit_exceededToo many requests — check Retry-After header
429too_many_attemptsToo many failed authentication attempts
500billing_errorCredit deduction failed — retry the request
503service_unavailableDatabase 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.

PlanRequests per minute
Free60
Plus120
Pro300
Enterprise1,000
Sandbox keys10

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.

EndpointCredit cost
POST /enrich/company1 credit
POST /enrich/contact1 credit
GET /company/{orgnr}/rolesFree
GET /company/{orgnr}/role-changesFree
GET /credits/balanceFree
GET /usageFree
POST /api-keysFree
GET /api-keysFree
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-ID header 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.

Privacy Policy Terms of Service