# Gulesider Scraper — Norwegian Business Leads (Bedrifter) (`worktech/gulesider-scraper`) Actor

Scrape Norwegian business leads from gulesider.no: company name, phone, email, address, postal code, city and website. Search by keyword and city (elektriker Oslo) and export B2B leads to JSON, CSV or Excel. Pay per result — $2 per 1,000 records.

- **URL**: https://apify.com/worktech/gulesider-scraper.md
- **Developed by:** [Per Schondell](https://apify.com/worktech) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 business records

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Gulesider Scraper — Norwegian Business Directory Leads (Bedrifter)

The **gulesider scraper** that turns gulesider.no — Norway's largest business directory — into a clean B2B lead list: company name, **phone number, address, postal code, city, website** and (optionally) **email** for any business category in any Norwegian town. A true **Norwegian business directory scraper** and a practical **1881.no alternative** for lead generation: type `elektriker` + `Oslo`, press Start, export **Norway B2B leads** to JSON, CSV, or Excel.

**Business listings only** — the actor collects company records, not private persons.

### What can you do with it?

- **Get Norwegian business leads with phone numbers** — *finn bedrifter med telefonnummer* — every record carries the phone shown on gulesider.no, normalized for dialers and CRMs
- **Export gulesider.no search results to CSV or Excel** — *last ned bedriftsliste til Excel* — one clean row per company, stable columns, ready for import
- **Build B2B prospect lists by trade and city** — *finn alle elektrikere i Oslo* — `rørlegger` in Bergen, `regnskapsfører` in Trondheim, `snekker` nationwide
- **Scrape company websites and addresses** — *hent nettadresse og besøksadresse for bedrifter* — the company's own website comes straight off the result page, no extra cost
- **Enrich leads with email** — *finn e-postadresse til bedrifter* — opt-in mode opens each company's detail page, where gulesider keeps the email
- **Feed AI agents and pipelines** — structured JSON output via API, webhooks, or the Apify MCP server, so agents can call this scraper as a tool

### Pricing

**$2 per 1,000 business records** ($0.002 per record). You pay only for records actually delivered to your dataset — a blocked or empty search costs nothing.

| Scenario | Records | Run cost |
|----------|---------|----------|
| Electricians in Oslo | ~500 | ~$1 |
| One trade across the 20 largest Norwegian cities | ~3,000 | ~$6 |
| Nationwide category sweep | ~10,000 | ~$20 |

#### Listing mode vs enriched mode — read this before switching on email

Residential proxy traffic is billed by Apify on **your** account, separately from the actor price. The two modes are worlds apart there (measured on the sibling eniro.se actor, which runs the identical platform):

| Mode | Fields | Proxy data | Approx. proxy cost |
|------|--------|-----------|--------------------|
| **Listing** (default) | name, phone, address, postal code, city, **website**, profile URL | ~0.017 MB/record | **~$0.45 per 1,000 records** |
| **Enriched** (`fetchContactDetails: true`) | + email from each company's detail page | ~1.89 MB/record | **~$18.75 per 1,000 records** |

Enriched mode is fully supported but **opt-in**, and it costs far more in proxy traffic than the actor itself. Most people do not need it: **the company website is already in listing mode**, because gulesider.no puts it on the result page. Switch on **Fetch email & website** only when you specifically need email addresses, and cap `maxResultsPerSearch` for the first enriched run.

### How to scrape gulesider.no (step by step)

1. Click **Try for free** — you need a free Apify account.
2. Enter one or more **Search terms** in Norwegian (e.g. `elektriker`, `rørlegger`).
3. Enter **Locations** (e.g. `Oslo`, `Bergen`, `Tromsø`) — or leave empty to search all of Norway.
4. Optionally adjust **Max results per search**. Leave **Fetch email & website** off unless you need emails (see the proxy-cost table above — roughly $18.75 per 1,000 records of proxy traffic on your account).
5. Click **Start**, then open the **Dataset** tab and export as JSON, CSV, Excel, HTML, or XML.

Prefer pasting URLs? Put gulesider.no listing pages straight into **Start URLs** instead of search terms.

#### Input example

```json
{
  "searchTerms": ["elektriker", "rørlegger"],
  "locations": ["Oslo", "Bergen"],
  "maxResultsPerSearch": 200,
  "requestDelayMs": 5000,
  "fetchContactDetails": false,
  "includeSoleTraders": false
}
```

#### Output example (one dataset record)

```json
{
  "name": "ElektrikerOslo",
  "phone": "40000001",
  "email": null,
  "address": "Gjerdrums vei 8",
  "postalCode": "0484",
  "city": "Oslo",
  "categories": ["elektriker"],
  "website": "https://www.elektrikeroslo.no/",
  "profileUrl": "https://www.gulesider.no/elektrikeroslo+oslo/301841990/bedrift",
  "site": "gulesider.no",
  "sourceUrl": "https://www.gulesider.no/elektriker+oslo/bedrifter",
  "searchTerm": "elektriker",
  "location": "Oslo",
  "scrapedAt": "2026-08-18T10:30:00+00:00"
}
```

Missing values are explicit `null`, so CSV and Excel exports always have the same columns.

### Use it from code or AI agents

```bash
curl -X POST "https://api.apify.com/v2/acts/worktech~gulesider-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms":["elektriker"],"locations":["Oslo"],"maxResultsPerSearch":100}'
```

The actor also works with n8n, Make, Zapier, webhooks, and the **Apify MCP server** — its structured output is designed to be consumed by AI agents directly.

### Why this scraper?

- **The URL scheme that actually works** — gulesider.no silently ignores `?where=` and `?page=` query parameters and serves the same national top-25 regardless. This actor uses the path-based scheme (`/elektriker+oslo/bedrifter/2`) that the site's own `rel="canonical"` and `rel="next"` tags declare, so city filtering and pagination really apply.
- **Websites at listing price** — most competing directory scrapers only give you a name and a phone unless you pay for detail-page enrichment. Here the company's own website is matched to each company straight off the result page, in the cheap default mode.
- **Pagination that actually stops** — this platform advertises a "next page" on every result page, even the last one. The actor ends a search when a page comes back with no companies, instead of grinding through empty pages on your proxy bill.
- **Cloudflare-aware by design** — anti-detect Firefox (Camoufox) with locale/geo alignment, cookie-consent handling, paced fresh-tab detail fetches, and local exponential backoff on blocks.
- **No silent failures** — if the directory changes its page structure, the run FAILS with a named error instead of quietly handing you an empty dataset and a proxy bill. A blocked search surfaces as a named error in the run summary instead of quietly returning nothing, and a sustained contact-page wall aborts the run rather than delivering half-empty records. You are never billed for records you didn't receive: data is pushed before it is charged.

Also from worktech: [Eniro Scraper](https://apify.com/worktech/eniro-scraper) for Sweden and [Lean Shopify Scraper](https://apify.com/worktech/lean-shopify-scraper).

### FAQ

**Is this a 1881.no alternative for lead generation?**
Yes in outcome: both directories cover Norwegian businesses. This actor scrapes gulesider.no, whose result pages already expose phone, address and the company's own website — which is what makes cheap bulk lead lists possible.

**Do I get email addresses?**
When gulesider.no has one, yes — but only in enriched mode. Email lives on the company detail page, so switch on **Fetch email & website** (adds roughly $18.75 per 1,000 records of residential-proxy cost on your account). Coverage varies by trade — not every Norwegian business publishes an email.

**Do I need enriched mode to get websites?**
No. Company websites come out of the default listing mode at no extra proxy cost. Enriched mode is about **email**.

**Can I export the leads to CSV or Excel?**
Yes. Every run produces a dataset downloadable as CSV, Excel, JSON, HTML, or XML from the Apify Console, or via API.

**Does it collect private persons?**
No. The actor is business-only by policy. Sole-trader businesses listed under a personal name (common for tradespeople) are excluded by default and only included if you switch on **includeSoleTraders**.

**What should I put in Search terms — Norwegian or English?**
Norwegian, matching gulesider.no's own categories: `elektriker` (electrician), `rørlegger` (plumber), `tannlege` (dentist), `regnskapsfører` (accountant), `frisør` (hairdresser).

**Why is the run slower than a plain HTTP scraper?**
gulesider.no sits behind Cloudflare bot protection. The actor uses a real anti-detect browser with human-like pacing — that's what makes the data come out correct and complete. The default listing-only mode is the fast one; enriched mode adds one detail-page load per company.

**Is it legal to scrape gulesider.no?**
The actor collects publicly visible business information (the same data any visitor sees) and no private-person data. Whether scraping fits your use case depends on your jurisdiction and the site's terms — when in doubt, consult a lawyer.

### Limitations

- **Email coverage depends on gulesider.no** — companies without a published email simply have `email: null`, in both modes.
- **Requires Norwegian residential proxies for reliable runs** — the default proxy configuration is Apify residential, country NO. Datacenter proxies will get challenged far more often.
- **Detail-page enrichment (opt-in) adds one page load per company** — expect roughly 3–7 seconds and ~1.89 MB of proxy traffic per enriched record.
- **Hyphenated `El-` names are withheld when ambiguous.** `El-Installasjon` (a trade compound) and `El-Sayed` (a family name) look identical to any rule. When the second part is not a recognised trade word the record is treated as a private person and withheld — publishing an individual is a privacy breach, withholding a company is not. Switch on **includeSoleTraders** to get them.
- **Pagination is capped at 50 pages (~1,250 records) per search combination** as a runaway guard — split very large categories by city to get everything.
- **A search can return companies from neighbouring towns.** gulesider.no expands thin result sets with nearby businesses, so a small-town search may include records from the surrounding region. Each record carries its own `city` and `postalCode` so you can filter after export.

### Status

**v0.1** — sibling of the production Eniro Scraper for Sweden, which runs on the same Eniro Group platform. 155 unit tests pass offline against pages captured live from gulesider.no, including a real Cloudflare challenge page.

# Actor input Schema

## `searchTerms` (type: `array`):

Business categories or keywords to search on gulesider.no, in Norwegian (e.g. elektriker, rørlegger, regnskapsfører). Each term is combined with every location.

## `locations` (type: `array`):

Norwegian cities or towns to search in (e.g. Oslo, Bergen, Tromsø). Leave empty to search all of Norway.

## `startUrls` (type: `array`):

Paste gulesider.no listing URLs directly, e.g. https://www.gulesider.no/elektriker+oslo/bedrifter — used instead of or in addition to search terms.

## `maxResultsPerSearch` (type: `integer`):

Cap on business records per search term x location combination. 0 = no cap (scrapes every result page).

## `requestDelayMs` (type: `integer`):

Politeness delay between paginated listing requests. Lower is faster but raises the chance of Cloudflare rate blocks.

## `fetchContactDetails` (type: `boolean`):

Email lives only on each company's detail page. COST NOTE: this fetches one detail page per company through the residential proxy — measured at roughly 1.89 MB per record, about $18.75 per 1,000 records of Apify proxy cost on YOUR account, on top of the $2/1,000 actor price. Off by default: the listing-only run delivers name, phone, address, postal code, city and (for most companies) the website at roughly $0.45 per 1,000 records of proxy cost.

## `includeSoleTraders` (type: `boolean`):

gulesider.no lists some sole-trader businesses under the owner's personal name (e.g. 'Anders Nordmann' in an electrician search). Off by default: only records with a company-style name are kept.

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

gulesider.no sits behind Cloudflare — Norwegian residential proxies are strongly recommended.

## Actor input object example

```json
{
  "searchTerms": [
    "elektriker"
  ],
  "locations": [
    "Oslo"
  ],
  "maxResultsPerSearch": 100,
  "requestDelayMs": 5000,
  "fetchContactDetails": false,
  "includeSoleTraders": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "NO"
  }
}
```

# Actor output Schema

## `businessRecords` (type: `string`):

No description

# 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 = {
    "searchTerms": [
        "elektriker"
    ],
    "locations": [
        "Oslo"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "NO"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("worktech/gulesider-scraper").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 = {
    "searchTerms": ["elektriker"],
    "locations": ["Oslo"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "NO",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("worktech/gulesider-scraper").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 '{
  "searchTerms": [
    "elektriker"
  ],
  "locations": [
    "Oslo"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "NO"
  }
}' |
apify call worktech/gulesider-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,worktech/gulesider-scraper"
        }
    }
}

```

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/1blCltGLWbZhG4oc6/builds/bNWLb53yQ5SfxR1Xp/openapi.json
