NorScout API
Search companies, start an enrichment job and poll for email and phone. Poll unlocked radar events for companies you monitor.
Authentication
Create an API key in /dashboard/settings and send it as a bearer token on every request.
Enrichment endpoints require enrichment:read or enrichment:write.
Required header
Authorization: Bearer <api-key>Request format
Content-Type: application/jsonCompany search
/api/v1/companies/searchSearches companies with the same public filter surface as NorScout search. Use any active NorScout API key.
Request body
Company country. Defaults to NO when omitted.
Company name or organization number. Maximum 200 characters.
NACE industry codes, for example 62.010.
locationsobject[]Locations in the same shape used by NorScout search.
Locations in the same shape used by NorScout search.
Optional location country. Defaults to NO if omitted and must match the top-level country.
Location kind. Use region only with country NO.
Location value. Use a city or municipality name, a county code such as 03, or one of the Norwegian region keys: sornorge, vestlandet, nordnorge.
Minimum revenue in full local-currency values. Use 0 or a positive number. Use 10000000 for 10 million.
Maximum revenue in full local-currency values. Use 0 or a positive number. Must be greater than or equal to min_revenue.
Minimum employee count. Use 0 or a positive integer.
Maximum employee count. Use 0 or a positive integer.
Exclude holding companies.
Exclude Norwegian sole proprietorships. Ignored for Sweden.
Sort field.
Sort direction.
Page size. Defaults to 10. The API returns at most 100 rows.
Zero-based result offset inside the accessible result window. Use 0 or a positive integer.
[
{ "type": "city", "name": "OSLO" },
{ "type": "municipality", "name": "ASKER" },
{ "country": "NO", "type": "county", "name": "03" },
{ "country": "NO", "type": "region", "name": "vestlandet" }
]Response fields
companiesobject[]Company rows returned for this page.
Company rows returned for this page.
NorScout company ID.
Company organization number.
Company legal name.
CEO or general manager name when available.
Chairman name when available.
Contact person name when available.
Primary industry name.
Registered business city.
Registered business municipality.
Registered business address.
Registered business country code.
Registered employee count.
Latest available revenue.
Start date for the financial period behind revenue.
End date for the financial period behind revenue.
Company website.
Company email address.
Company phone number.
Date when the company was registered.
paginationobjectPage metadata.
Page metadata.
Page size used for this response.
Offset used for this response.
True only when more rows are available inside the allowed window.
Number of matching companies available within the current plan and quota window.
Raw number of companies matching the filters before plan and quota caps.
usageobjectShared monthly company data allowance across CSV exports and API search.
Shared monthly company data allowance across CSV exports and API search.
Monthly company data allowance for the account.
Rows already used by CSV exports in this billing period.
Rows already returned by API company search in this billing period.
Rows remaining after this request.
Request identifier.
Required filters
Add at least one of query, industries, locations, revenue range, or employee range. Exclusion-only searches are rejected.
Quota and pagination
- CSV exports and API company search share the same monthly company data allowance.
total_matchingis the raw match count before caps.totalis what this account can access inside the current plan and quota window.limitdefaults to 10 and is capped at 100 rows per request.- When the monthly allowance is exhausted, the API returns
402withexternal_api_export_limit_exceeded.
curl -X POST 'https://www.norscout.com/api/v1/companies/search' \
-H "Authorization: Bearer $NORSCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"country": "NO",
"industries": ["62.010"],
"locations": [
{
"country": "NO",
"type": "city",
"name": "OSLO"
}
],
"min_revenue": 10000000,
"limit": 50,
"offset": 0
}'{
"companies": [
{
"id": 123,
"org_number": "123456789",
"name": "Acme AS",
"ceo_name": "Kari Nordmann",
"chairman_name": null,
"contact_person_name": null,
"industry": "Computer programming activities",
"business_city": "Oslo",
"business_municipality": "Oslo",
"business_address": "Dronning Eufemias gate 1",
"business_country_code": "NO",
"number_of_employees": 24,
"revenue": 18400000,
"period_from": "2025-01-01T00:00:00.000Z",
"period_to": "2025-12-31T00:00:00.000Z",
"website": "https://acme.no",
"email": "post@acme.no",
"phone": "+47 22 00 00 00",
"registered_in_registry_date": "2018-03-12T00:00:00.000Z"
}
],
"pagination": {
"limit": 50,
"offset": 0,
"has_more": true
},
"total": 5000,
"total_matching": 12840,
"usage": {
"limit": 5000,
"exports_used": 50,
"company_search_rows_used": 200,
"remaining": 4750
},
"request_id": "req_123456789"
}Start a job
/api/v1/enrichmentStarts an enrichment job and returns a jobId and statusUrl immediately.
Request body
Requested fields. Supported values: email, phone, or both.
rowsobject[]requiredPeople to enrich. The limit is 100 rows per minute.
People to enrich. The limit is 100 rows per minute.
Company name for the contact.
2-letter ISO country code, for example NO or SE.
Full name of the person to enrich.
Role or title. Improves matching quality.
Company domain or URL. Improves matching quality.
Optional organization number. Improves company matching quality.
Public HTTPS endpoint. Norscout posts the final result payload there when the job finishes. Omit it if you want to poll the status URL instead.
Optional caller-defined label. Returned in the start response when supplied.
Get the results with polling
Read statusUrl from the POST response, then call it every few seconds until status becomescompleted, failed, or cancelled. The final response includes row-level results in submitted order.
Get the results with a webhook
Add webhook_url to the POST body to receive the result automatically when the job finishes. Your webhook endpoint must accept POST requests. The payload uses the same row order as your request.
Email results
Email enrichment looks for a direct work email for the person you submitted. Generic company inboxes like post@, info@, and kontakt@ are not returned as person email results. If no direct email is found, email is null and notes.email explains the result when available.
Limits
- 100 rows per minute per user.
- Credits are reserved when the job starts.
curl -X POST 'https://www.norscout.com/api/v1/enrichment' \
-H "Authorization: Bearer $NORSCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"output": ["email", "phone"],
"webhook_url": "https://example.com/api/webhooks/enrichment",
"rows": [
{
"company_name": "Acme AS",
"country_code": "NO",
"person_name": "Kari Nordmann"
}
]
}'{
"jobId": 91234,
"status": "queued",
"statusUrl": "/api/v1/enrichment/91234",
"requestId": "req_123456789",
"requestedOutput": ["email", "phone"],
"receivedRows": 1,
"credits": { "reserved": 2, "charged": 0 }
}Check a job
/api/v1/enrichment/{jobId}Returns only the current job status and final row-level results.
Response fields
Current job state. Poll again while it is active. Read rows when it reaches a final state.
rowsobject[]Final row-level results in the same order as the rows you submitted. Empty while the job is still active.
Final row-level results in the same order as the rows you submitted. Empty while the job is still active.
Per-row result state.
Resolved email value when email was requested.
Resolved phone value when phone was requested.
Per-output explanation keyed by email and phone when a value is missing, partial, or failed.
Polling
- Use the returned
statusUrlfrom the POST response. - Poll every 2-5 seconds while
statusisactive. The limit is 60 status checks per minute per user. - If you receive
429, wait for theRetry-Aftervalue before polling again. - Use
rowsafterstatusbecomescompleted,failed, orcancelled.
Webhooks
Add webhook_url when starting a job. Your endpoint must accept POST requests. NorScout sends the result there when the job finishes. If you omit webhook_url, poll this endpoint instead.
{
"status": "active",
"rows": []
}{
"status": "completed",
"rows": [
{
"status": "completed",
"email": "kari@acme.no",
"phone": "+47 90 12 34 56",
"notes": {
"email": null,
"phone": null
}
}
]
}Radar feed
/api/v1/radar/feedReturns unlocked radar events. Use locked_count to see how many locked events match the same filters.
Query params
Page size. Defaults to 50. Maximum 100.
Opaque cursor from pagination.next_cursor in the previous response.
Filter by one radar signal type.
Filter by company organization number.
Only return events with detected_at greater than or equal to this ISO 8601 datetime.
Response fields
Unlocked radar events. Locked events are not included.
Number of locked events matching the same filters. Counts raw rows; events may deduplicate address_changes.
paginationobjectCursor pagination metadata for the feed.
Cursor pagination metadata for the feed.
Pass this value as cursor on the next request to fetch older events.
True when more unlocked events are available.
The page size used for this response.
Request identifier.
Polling
- Poll every 1-5 minutes.
- Pass
sincefor incremental sync. - Pass
cursorfrompagination.next_cursorfor older pages. - If
locked_countis greater than 0, unlock those events in NorScout to include them inevents.
curl 'https://www.norscout.com/api/v1/radar/feed?limit=50' \
-H "Authorization: Bearer $NORSCOUT_API_KEY"{
"events": [
{
"id": 2011,
"company": {
"name": "Acme AS",
"org_number": "123456789"
},
"signal_type": "news_pr",
"title": "Office move to Nedre Vollgate 5",
"summary": "Acme AS moved its office to Nedre Vollgate 5.",
"detected_at": "2026-06-07T10:00:00.000Z",
"event_date": "2026-06-07",
"sources": [
{
"url": "https://example.com/article",
"title": "Example article",
"published_at": "2026-06-07T09:30:00.000Z"
}
]
}
],
"locked_count": 0,
"pagination": {
"next_cursor": null,
"has_more": false,
"limit": 50
},
"request_id": "req_123456789"
}Radar subscriptions
/api/v1/radar/subscriptionsReturns active radar subscriptions and tracked_companies (companies with active monitoring).
curl 'https://www.norscout.com/api/v1/radar/subscriptions' \
-H "Authorization: Bearer $NORSCOUT_API_KEY"{
"subscriptions": [
{
"id": 1,
"company": {
"name": "Acme AS",
"org_number": "123456789"
},
"signal_type": "job_openings",
"status": "active",
"tracking_status": "active",
"last_event_at": "2026-06-07T10:00:00.000Z",
"created_at": "2026-05-01T08:00:00.000Z"
}
],
"tracked_companies": 1,
"request_id": "req_123456789"
}Rate limits
Reference limits
60 requests per minute per API key. Each request returns at most 100 rows.
100 rows per minute per user.
60 status checks per minute per user. If you receive 429, wait for the Retry-After value before polling again.
60 requests per minute.
Errors
Common errors
Invalid request body, unsafe webhook URL, or invalid query params.
Invalid or inactive API key.
Not enough credits for enrichment, or the monthly company data allowance is exhausted.
Job not found.
Rate limit reached.