# Norway Staffing Agency Register Check (Bemanningsforetak) (`highfiddle/norway-staffing-agency-check`) Actor

Check if a Norwegian staffing agency (bemanningsforetak) is approved by Arbeidstilsynet. Verify org numbers and branches, export the register with NACE codes, and monitor approval changes and bankruptcies.

- **URL**: https://apify.com/highfiddle/norway-staffing-agency-check.md
- **Developed by:** [Vincent Vann](https://apify.com/highfiddle) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 organisation checkeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Norway Staffing Agency Register Check (Bemanningsforetak)

Check whether a Norwegian staffing agency (bemanningsforetak) or temporary work agency is approved in Arbeidstilsynet's staffing agency register (Bemanningsforetaksregisteret). Verify any organisation number, including branches, export the full register, and monitor your suppliers for approval changes and bankruptcies. Data is enriched with NACE codes and bankruptcy flags from Brønnøysundregistrene (Brreg).

### Why it matters

Since 1 January 2024, it is illegal in Norway to hire workers from a staffing agency that isn't approved by Arbeidstilsynet. If you hire temporary workers (innleie av arbeidskraft), you need to check that each supplier is a godkjent bemanningsforetak. Staffing of seafarers isn't covered by the approval scheme.

### What it does

- **Check:** verify a list of organisation numbers. Formats like `NO 974 760 673 MVA` are accepted.
- **Search:** find agencies by company name.
- **Export:** download the register, filtered by approval status, county or NACE code.
- **Monitor:** run on a schedule and get a row for every change since the last run.

### Verdicts

| Verdict | Meaning |
|---|---|
| `APPROVED` | Approved by Arbeidstilsynet. |
| `NOT_APPROVED` | Listed in the register, but not approved. |
| `NOT_IN_REGISTER` | The company exists in Brreg but isn't in the staffing register. |
| `NOT_FOUND` | Not found in the staffing register or in Brreg. |
| `NEEDS_REVIEW` | Unknown or inconsistent status, or a branch whose status differs from its main entity. Check manually. |
| `INVALID_ORGNR` | Not a valid Norwegian organisation number (9 digits, MOD11 check). Free. |
| `ERROR` | A source was unavailable, so the status is **not** confirmed. Free. Try again later. |

### Examples

#### Check

Input:

```json
{ "mode": "check", "orgNumbers": ["979540329"] }
```

Output (a branch of Lvero AS, shortened):

```json
{
  "orgNumber": "979540329",
  "name": "LVERO AS",
  "verdict": "APPROVED",
  "approvalStatus": "Godkjent",
  "isSubUnit": true,
  "mainOrgNumber": "998514231",
  "subUnitName": "LVERO AS",
  "subUnitAddress": "Hofsletta 3, 2266 ARNEBERG",
  "county": "Innlandet",
  "naceCodes": ["62.200 Konsulentvirksomhet tilknyttet informasjonsteknologi og forvaltning og drift av it-systemer"],
  "warnings": ["Sub-unit: status taken from main entity 998514231"],
  "sourceFetchedAt": "2026-10-29T12:15:58.98Z",
  "checkedAt": "2026-10-29T12:15:59.10Z"
}
```

#### Search

Input:

```json
{ "mode": "search", "nameQuery": "lvero" }
```

Output: one row per matching agency, in the same format as a check row, plus a `query` field. If nothing matches, you get a single `NO_MATCH` row (free).

#### Export

Input:

```json
{ "mode": "export", "naceCode": "78", "county": "Rogaland", "onlyApproved": true, "includeSubUnits": false }
```

Output: one row per agency, in the same format as a check row. With `includeSubUnits`, each branch gets its own row with its own address. The county filter uses that address.

#### Monitor

Input:

```json
{ "mode": "monitor", "orgNumbers": ["998514231", "979540329"], "monitorStoreName": "my-suppliers" }
```

The first run returns a `BASELINE` row. Later runs return one row per change, for example (shortened):

```json
{
  "type": "STATUS_CHANGED",
  "orgNumber": "998514231",
  "before": { "name": "LVERO AS", "approvalStatus": "Godkjent", "verdict": "APPROVED", "brregWarnings": [] },
  "after": { "name": "LVERO AS", "approvalStatus": "Ikke godkjent", "verdict": "NOT_APPROVED", "brregWarnings": [] },
  "detectedAt": "2026-11-05T06:00:12.34Z"
}
```

Change types: `STATUS_CHANGED`, `BRREG_FLAGS_CHANGED` (bankruptcy or liquidation), `ADDED` and `REMOVED_FROM_REGISTER`. Leave `orgNumbers` empty to watch the whole register.

### Coverage

3,087 main entities (about 2,717 approved and 370 not approved) plus 4,239 sub-units, as of 29 Oct 2026. This includes NUF (Norwegian branches of foreign companies).

### Sub-units

The official API only answers for main entities. Asking it about a branch gives a 404. This actor accepts any branch org number and returns its main entity's status and the branch's own name and address.

### Enrichment

NACE codes and bankruptcy/liquidation warnings come from Brreg. The staffing register doesn't include them.

### Monitoring

Alerts when an agency's approval changes or it becomes bankrupt or enters liquidation. The first run saves a baseline, and later runs report only changes. Use a different monitor name for each watch list.

To set it up:

1. Create a task for this actor with `mode: "monitor"` and your organisation numbers.
2. In **Schedules**, run the task daily.
3. In the task's **Integrations** tab, add an email, Slack or webhook notification for when a run succeeds. Runs with no changes have an empty dataset, so you can filter on that in your webhook.

### Pricing

Pay per event. You only pay for results:

| Event | When | Price |
|---|---|---|
| Organisation checked | Each organisation number checked, or each search result. Invalid numbers and errors are free. | $0.005 |
| Exported agency | Each exported row | $0.001 |
| Monitor run | Each monitor run | $0.03 |
| Status change detected | Each change a monitor run detects | $0.01 |
| Full register download | Once per run that needs the full register: export, search, monitor with more than 25 numbers (or the whole register), check with more than 25 numbers | $0.01 |

Example: checking 10 suppliers costs $0.05. Watching up to 25 suppliers with a daily monitor costs about $0.90 a month plus $0.01 per change.

### Data

- Every row includes `sourceFetchedAt`, the time the data was fetched from Arbeidstilsynet, and `checkedAt`.
- The output contains company data only, no named people or roles.

### Limitations

- **Not legal advice.** For decisions, confirm the status in Arbeidstilsynet's official search on arbeidstilsynet.no.
- About 127 companies have no business address. The county filter falls back to the postal address, but it can still miss some.
- Status is always the main entity's. A branch is never approved on its own.
- Arbeidstilsynet's API blocks cloud and non-Norwegian IP addresses (HTTP 403), so its requests go through Apify's residential proxy in Norway by default (see **Proxy** under Advanced). Don't switch it to datacenter proxy or off on Apify. Brreg is called directly.

### Sources and licence

Data from Arbeidstilsynet (Bemanningsforetaksregisteret) and Brønnøysundregistrene (Enhetsregisteret), under the [NLOD licence](https://data.norge.no/nlod/no/).

This is an independent tool, not affiliated with or endorsed by Arbeidstilsynet or Brønnøysundregistrene. The data is provided as is, without warranty. The author is not liable for decisions made on the basis of the output.

### På norsk

Sjekk om et selskap er et godkjent bemanningsforetak i Arbeidstilsynets register. Siden 1. januar 2024 er det ulovlig å leie inn arbeidskraft fra bemanningsforetak som ikke er godkjent. Bemanning av sjøfolk er ikke omfattet av ordningen.

- **Sjekk** en liste med organisasjonsnumre, også underenheter (avdelinger). Underenheter får hovedenhetens status og sin egen adresse.
- **Søk** etter firmanavn, **eksporter** registeret etter fylke eller næringskode, eller **overvåk** leverandørene dine og få varsel når godkjenningen endres eller et selskap går konkurs eller under avvikling.
- Næringskoder og konkursvarsler hentes fra Brønnøysundregistrene.

Uavhengig verktøy, ikke tilknyttet Arbeidstilsynet eller Brønnøysundregistrene. Ikke juridisk rådgivning. Bekreft alltid status i Arbeidstilsynets offisielle søk før du tar en beslutning.

# Actor input Schema

## `mode` (type: `string`):

check = verify a list of org numbers. search = find agencies by name. export = download the register. monitor = report approval changes since the last run (use with a schedule).

## `orgNumbers` (type: `array`):

9-digit Norwegian org numbers. 'NO 974 760 673 MVA' style is accepted. Used by 'check' and optionally 'monitor' (empty = whole register).

## `nameQuery` (type: `string`):

Part of the company name, e.g. 'bemanning'.

## `onlyApproved` (type: `boolean`):

Export only rows classified as APPROVED.

## `county` (type: `string`):

County name (e.g. 'Oslo') or county number (e.g. '03').

## `naceCode` (type: `string`):

e.g. '78'. NACE codes come from Brreg (the register has none) and match the main entity.

## `includeSubUnits` (type: `boolean`):

Also output each branch (underenhet) as its own row with its own address. Status is always the main entity's.

## `useBrreg` (type: `boolean`):

Confirms the company exists, resolves sub-units and adds bankruptcy/liquidation warnings.

## `maxResults` (type: `integer`):

Upper limit for search and export rows.

## `monitorStoreName` (type: `string`):

Where the last snapshot is stored. Use a different name for each watch list.

## `proxyConfiguration` (type: `object`):

Used only for Arbeidstilsynet, which blocks cloud and non-Norwegian IPs (HTTP 403). Keep Residential proxy with country Norway.

## Actor input object example

```json
{
  "mode": "check",
  "orgNumbers": [
    "998514231"
  ],
  "onlyApproved": true,
  "includeSubUnits": false,
  "useBrreg": true,
  "maxResults": 10000,
  "monitorStoreName": "staffing-agency-monitor",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "NO"
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Check, search and export rows: verdict, approval status, sub-unit details, county and warnings.

## `allFields` (type: `string`):

Every row with all fields, including NACE codes, address, Brreg flags and monitor change rows (before/after).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "orgNumbers": [
        "998514231"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "NO"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("highfiddle/norway-staffing-agency-check").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "orgNumbers": ["998514231"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "NO",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("highfiddle/norway-staffing-agency-check").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "orgNumbers": [
    "998514231"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "NO"
  }
}' |
apify call highfiddle/norway-staffing-agency-check --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,highfiddle/norway-staffing-agency-check"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/zESuCBPNRgCh0uXlD/builds/tNgpNoL2GlyRM3W1q/openapi.json
