# Håndværker.dk Scraper - Danish Tradesperson Leads with CVR (`scrapersdelight/haandvaerker-dk-scraper`) Actor

$3 per 1,000 firms with the contacts their profile shows; $8 per 1,000 with the phone and email the site holds but hides. Danish tradespeople from Håndværker.dk (105,000+): phone, email, CVR, address, trade, rating. Filter by 24 trades, postcode, city; all-Denmark sweep.

- **URL**: https://apify.com/scrapersdelight/haandvaerker-dk-scraper.md
- **Developed by:** [Scrapers Delight](https://apify.com/scrapersdelight) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 per tradesperson firm returneds

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

## 🔨 Håndværker.dk Scraper — Danish Tradesperson Leads with Phone, Email and CVR

Export Danish tradesperson firms from **[Håndværker.dk](https://www.haandvaerker.dk)** — Denmark's largest craftsman directory, which lists **105,414 firms** in its search index (measured 2026-09-23). Every row is one firm with its **CVR number**, **phone and email**, street address, postcode, city, coordinates, trade, rating and review count. Switch on profile details to add the **advertising-protection flag (Reklamebeskyttet)**, company status, contact person, Sikkerhedsstyrelsen **authorisation numbers** and the firm's reviews.

**Two prices, you choose:**

- **$3 per 1,000 firms** (default) — contacts as the site shows them: phone and email only where the firm's profile page displays them.
- **$8 per 1,000 firms** for firms delivered with a contact their profile page does not show — switch on `includeUndisplayedContacts` to get the phone and email Håndværker.dk holds for every firm.

No start fee. No proxy needed.

### What does Håndværker.dk Scraper do?

It reads the same search index the site's own "Find håndværker" pages use, so it can filter by any of the site's **24 trades**, by **postcode** or **city**, by free text, by review count or rating, and by paying membership, and it can walk **all of Denmark**: a query larger than the index's 5,000-hit ceiling is swept postcode by postcode automatically, plus the firms with no postcode or a postcode the site's own list lacks, so a full sweep is complete by construction and **checked against the index's own totals** in every run.

Each firm is **delivered and charged once**, keyed on Håndværker.dk's numeric firm id.

### Who uses this data

- **Building-supply chains and manufacturer reps** — every active VVS installer, electrician or carpenter in a sales territory, with a phone and email to reach them.
- **Nordic trades-management SaaS** (job management, quoting, invoicing) — prospect lists by trade and region, with firm size (employees) and founding year.
- **Home-insurance claims networks** — authorised plumbers, electricians and drain contractors by postcode, with their Sikkerhedsstyrelsen authorisation numbers.
- **B2B telemarketing / dialer teams** — clean 8-digit Danish numbers with the firm's CVR number.

### What you get — every field

**Contact fields first.** Which phone and email a row carries depends on `includeUndisplayedContacts` (see *Displayed vs. all contacts* below).

| Field | Example | What it is |
|---|---|---|
| 📞 `phone` | `32514559` | Option off: the phone the profile page displays (`null` if it shows none). Option on: the phone Håndværker.dk holds for the firm in its search data, **exactly as printed** (99.5% are a bare 8-digit number). |
| 📞 `phoneInternational` | `+45 32514559` | The same number as `+45 XXXXXXXX` — only when the printed value is exactly one 8-digit number. Values holding two numbers or a suffix are never reformatted. |
| ✉️ `email` | `finlow@finlow.dk` | Option off: the email the profile page displays (profile pages rarely show one). Option on: the email held in the search data, lower-cased; `null` when the value is not a well-formed address (it is never repaired). |
| 👁️ `phoneDisplayedOnProfile`, `emailDisplayedOnProfile` | `true`, `false` | Whether the firm's profile page shows a phone / its email to a visitor. |
| 🔓 `undisplayedContactIncluded` | `true` | This row carries a phone or email its profile page does not show (billed the $0.005 add-on). Always `false` with the option off. |
| 📞 `profilePhone` | `+45 32514559` | The phone the profile page itself publishes — the firm's own LocalBusiness record, picked by its `@id`, never a neighbouring firm's. Can differ from the search-data phone. |
| `contactSource` | `profile-display` | `profile-display` (option off) or `search-index` (option on). |
| 🏢 `cvr` | `17284509` | Danish CVR number, exactly as printed (8 digits). |
| ✅ `cvrChecksumValid` | `true` | CVR mod-11 check on the printed number (a check, never a correction). |
| 🏷️ `companyName`, `trade` | `FINLOW VVS A/S`, `VVS` | Name and the site's own trade label (never translated). |
| 📍 `streetAddress`, `postalCode`, `city` | `Hornevej 13`, `2770`, `Kastrup` | Registered address. |
| 🗺️ `latitude`, `longitude` | `55.625`, `12.597` | Coordinates from the index. |
| ⭐ `rating`, `reviewCount`, `hasReviews` | `4.7`, `2263`, `true` | Håndværker.dk recommendations. `rating` is `null` (not 0) when there are no reviews. |
| 📅 `yearEstablished`, 👷 `employees` | `1993`, `30` | As listed. |
| 💳 `isPayingMember` | `true` | Pays for a Håndværker.dk membership (833 firms). |
| 🏆 `monthlyCraftsmanBadge`, `prizeWinnerBadge`, `climateBadge` | `true` | Site badges ("Månedens håndværker", "Håndværker.dk Prisen" winner, KlimaBadge). |
| 📝 `description`, `coverImageUrl`, `profileUrl` | | Profile text, image and the profile link. |
| 🔎 `searchPartition`, `scrapedAt` | `ZipCode 8000` | Which query found the row, and when. |
| `profileDetailsStatus` | `ok` | `ok`, `profile-gone` or `unreachable` for the firm's profile page. |

**With `includeProfileDetails` on** (no extra time, no extra charge — the profile page is already read for every firm):

| Field | Example | What it is |
|---|---|---|
| 🚫 `advertisingProtected` | `true` | The **Reklamebeskyttet** status from the CVR header on unclaimed profiles. `null` on the member-style template, where the label is printed on every profile and cannot be read per firm. |
| 🏛️ `companyStatus` | `AKTIV`, `NORMAL`, `OPHØRT`, `UNDER TVANGSOPLØSNING` | Company status from the CVR header, as printed. |
| 👤 `contactPersons` | `["Frank Jensen / Sacha Jensen / Marianne"]` | Named contact(s) on the profile. |
| 📅 `foundingDate`, `legalName` | `1993-09-27` | Full founding date and legal name. |
| 🪪 `authorisations` | `[{issuer:"Sikkerhedsstyrelsen", type:"Vvs-installatørvirksomhed", number:"VFUL-00347", updated:"17 sep. 26"}]` | Sikkerhedsstyrelsen authorisations shown on the profile. |
| 🧰 `serviceTags` | `["VVS","TV-inspektion","Kloakmester",…]` | The services the firm lists. |
| 📊 `subRatingsPct` | `{"Leverer kvalitetsarbejde":95,…}` | Rating breakdown (member profiles with reviews). |
| 💬 `reviews` | `[{author, rating, title, text}]` | The reviews embedded in the profile page (up to 5). |

### Example row (real, from a verified run)

```json
{
  "firmId": 15857,
  "companyName": "FINLOW VVS A/S",
  "trade": "VVS",
  "phone": "32514559",
  "phoneInternational": "+45 32514559",
  "email": "finlow@finlow.dk",
  "cvr": "17284509",
  "cvrChecksumValid": true,
  "streetAddress": "Hornevej 13",
  "postalCode": "2770",
  "city": "Kastrup",
  "latitude": 55.62500611,
  "longitude": 12.59730598,
  "rating": 4.7,
  "reviewCount": 2263,
  "hasReviews": true,
  "yearEstablished": 1993,
  "employees": 30,
  "isPayingMember": true,
  "monthlyCraftsmanBadge": true,
  "prizeWinnerBadge": true,
  "climateBadge": true,
  "profileUrl": "https://www.haandvaerker.dk/profil/firma/finlow-vvs-as/15857",
  "phoneDisplayedOnProfile": true,
  "emailDisplayedOnProfile": false,
  "profilePhone": "+45 32514559",
  "undisplayedContactIncluded": true,
  "contactSource": "search-index",
  "advertisingProtected": null,
  "companyStatus": null,
  "contactPersons": ["Frank Jensen / Sacha Jensen / Marianne"],
  "foundingDate": "1993-09-27",
  "legalName": "FINLOW VVS A/S",
  "authorisations": [
    { "issuer": "Sikkerhedsstyrelsen", "type": "Vvs-installatørvirksomhed", "holder": "Finlow Vvs A/S", "number": "VFUL-00347", "updated": "17 sep. 26" },
    { "issuer": "Sikkerhedsstyrelsen", "type": "Kloakmestervirksomhed", "holder": "Finlow Vvs A/S", "number": "KFUL-03592", "updated": "17 sep. 26" }
  ],
  "subRatingsPct": { "Leverer kvalitetsarbejde": 95, "Overholder budgettet": 93, "Rydder godt op efter sig": 95, "Overholder aftaler": 96, "Er god til at lytte til kunden": 95, "Vil du anbefale os": 95 },
  "profileDetailsStatus": "ok"
}
```

(The same firm from two verified runs: the contact fields from a run with `includeUndisplayedContacts` on, the profile-detail fields from a run with `includeProfileDetails` on; `description`, `coverImageUrl`, `serviceTags` and `reviews` trimmed here for length. The email is not displayed on the profile page, so this row was billed $0.003 + $0.005.)

### Quick start

Every plumbing/heating firm in Denmark that has a phone (all contacts, $0.008 per firm with a hidden contact):

```json
{ "trades": ["VVS"], "requirePhone": true, "includeUndisplayedContacts": true, "maxResults": 0 }
```

Electricians and drain contractors in Aarhus C and Copenhagen Ø, with profile details:

```json
{ "trades": ["Elektriker", "Kloakmester"], "postcodes": ["8000", "2100"], "includeProfileDetails": true, "maxResults": 0 }
```

All of Denmark, every trade (about 105,000 firms, swept postcode by postcode):

```json
{ "maxResults": 0 }
```

### Inputs

| Input | Default | What it does |
|---|---|---|
| `trades` | all | Any of the site's 24 trade labels: Tømrer, Rådgivning, Rengøring og ejendomsservice, Murer, Diverse kategorier, Anlægsgartner/Belægninger, Maler, Elektriker, VVS, Smed, Gulvlægger, Kloakmester, Hovedentreprenør, Tagdækker, Nedrivning, Glarmester, Handymand, Isolatør, Jord og beton, Kølefirma, Gulvafsliber, Varmepumpeinstallatør, Tækkemand, Tagmaler. An unknown label stops the run before any request (nothing charged). |
| `postcodes` | all | Danish 4-digit postcodes (exact match on the firm's postcode). |
| `cities` | all | Exact city names as the site spells them (e.g. "Aarhus C"). |
| `searchText` | — | Free text matched by the site's own search (name and profile text). |
| `includeUndisplayedContacts` | off | Off: phone/email only where the profile page shows them ($0.003 per firm). On: the phone/email held in the site's search data; a firm carrying a contact its page hides costs $0.008 in total. |
| `requirePhone` / `requireEmail` | off | Skip firms whose row carries no phone / email (after the option above). With the option off, `requireEmail` removes almost every firm. Skipped firms are never charged. |
| `onlyPayingMembers` | off | Only the 833 paying members. |
| `minReviews` / `minRating` | 0 | Review-count and rating floors. |
| `includeProfileDetails` | off | Add the profile-page fields above (no extra time, no extra charge). |
| `maxResults` | 40 | Stop after this many firms; `0` = no limit. |
| `concurrency` | 3 | Parallel requests (the site rate-limits around 12). |
| `proxyConfiguration` | none | Not needed; direct connections were measured. Falls back to direct if a proxy fails to start. |

### Displayed vs. all contacts

Håndværker.dk holds a phone and email for most firms in its search data, but a firm's profile page shows a visitor only some of them: unclaimed profiles hide the phone, and profile pages almost never print an email. The actor reads every firm's profile page and lets you choose:

| | `includeUndisplayedContacts` **off** (default) | `includeUndisplayedContacts` **on** |
|---|---|---|
| Phone | Only where the profile page shows one | The phone in the site's search data |
| Email | Only where the profile page shows one | The email in the site's search data |
| Price per firm | **$0.003** | **$0.003**, or **$0.008** when the row carries a contact its page hides |
| Measured: 150 firms, postcodes 5000/9000/6700 | phone 34.0%, email 0% | phone 94.7%, email 78.7% — 146 of 150 carried a hidden contact |
| Measured: top 100 VVS firms | phone 50%, email 0% | phone 100%, email 97% — 100 of 100 carried a hidden contact |

`phoneDisplayedOnProfile`, `emailDisplayedOnProfile` and `undisplayedContactIncluded` on every row show exactly what the page displays and what you were billed for.

### Pricing

| What | Price |
|---|---|
| Each distinct firm delivered (contacts as displayed) | **$0.003** ($3 per 1,000) |
| Add-on, only with `includeUndisplayedContacts` on, per firm whose row carries a phone or email its profile page does not show | **$0.005** (so that firm costs $0.008 in total) |
| Firms whose contacts are all displayed, with the option on | $0.003 — no add-on |
| Firm whose profile page could not be read | $0.003 — never the add-on |
| Run start | $0 |
| Profile details | $0 |
| Firms removed by `requirePhone` / `requireEmail` | $0 |
| Duplicates across overlapping queries | $0 (delivered once) |

An empty-input run delivers the default 40 firms for **$0.12**. One trade such as VVS (3,920 firms) is $11.76 with contacts as displayed, or up to $31.36 with all contacts.

### Measured numbers (2026-09-23)

- **Index size:** 105,414 firms = 105,286 across the site's 1,373 postcodes + 124 with no postcode + 4 at a postcode the site's list lacks.
- **Search-data contact fill, full census of 103,640 firms:** phone **76.9%**, email **76.1%**, CVR **100%**, address 99.9%, coordinates 100%. Reviews: only 3,131 firms (3.0%) have any.
- **Displayed contacts** (profile pages): phone 34–50% of firms depending on the frame (above); email 0 of 250 firms on live runs.
- **Completeness:** an Anlægsgartner/Belægninger sweep collected 6,363 unique firms against an index total of 6,363 across 1,376 partitions; VVS collected 3,920 of 3,920.
- **Profile details** (two frames): 40 paying members — `authorisations` 37.5%, `serviceTags`/`subRatingsPct`/`reviews` 100%. 120 firms from postcodes 5000/9000/6700 — `advertisingProtected` known for 106 of 116 unclaimed profiles (56 `true`), `companyStatus` 75.8%, `contactPersons` 99.2%.
- **Speed:** every firm needs its profile page, so a run delivers about 2.7 firms per second at the default 3 parallel requests: 20 firms in 8–14 s, 100 in 37 s, 150 in 54 s. One trade of ~4,000 firms takes about 25 minutes; all of Denmark about 11 hours.

### Data limits

- **Search-data phone and email:** for the ~100,000 profiles the site built from the CVR register they mirror the CVR contact, which is sometimes a registration agent or accountant: one address is on 84 firms and another on 65. The same number can appear on several related firms.
- **`profilePhone` can differ from the search-data phone** (11 of 40 paying members; 5 of 120 unclaimed firms). Both are shipped; neither is merged into the other.
- **The profile's "Ring …" button is Håndværker.dk's switchboard or a tracking number**, not the firm's; it is never shipped.
- **`advertisingProtected` is `null` on member-style profiles**: that template prints "Reklamebeskyttet" on all 41 profiles sampled, so it cannot be read per firm.
- **`employees` is 1 on 76% of firms** — for unclaimed profiles that looks like a default rather than a count. `yearEstablished` is missing on 26%.
- **No website field:** neither the search data nor the profile pages publish one.
- **98 phones carry a suffix** such as `-0` and a few emails end in `-0`: phones ship as printed without `phoneInternational`; such emails are `null`, never trimmed into an address.
- **Reviews:** only the ones embedded in the profile page (up to 5), not the full paginated history.

### FAQ

**How many firms are on Håndværker.dk?** 105,414 in the search index on 2026-09-23 (the homepage title said "+105.858 håndværkere tilknyttet" the same day).

**Can I get every firm in Denmark?** Yes — leave filters empty and set `maxResults` to 0. The actor sweeps all 1,373 postcodes plus the two remainder groups and reports completeness in `RUN_SUMMARY`.

**Why a postcode sweep?** The search index answers at most 5,000 hits per query. The densest postcode holds 1,814 firms, so postcode partitions are always complete.

**Which option should I pick?** Off ($0.003) gives what a visitor of each profile page sees; on gives the phone and email the site holds for the firm, at $0.008 for each firm that carries one its page hides.

**What does `RUN_SUMMARY` tell me?** The index's own total for your filter, unique firms collected, duplicates skipped, rows removed by your phone/email requirement, how many rows carried hidden phones/emails and whether they were withheld or included, profile fetch outcomes, and the charged counts per event.

**Do I pay for duplicates?** No. A firm is charged once per run, keyed on the site's firm id.

**Do I pay for firms without a phone when `requirePhone` is on?** No — they are never delivered.

**What if my maximum charge runs out mid-run?** A row that would need the add-on but only the base fits is delivered with its displayed contacts only; nothing is delivered that was not paid for.

**Do I need a proxy?** No. The actor ran every test on Apify's own network with no proxy.

**What are the trade labels?** The site's own Danish labels (VVS, Elektriker, Tømrer, …), copied from the site's data, not translated.

**Is the CVR number validated?** Each one gets a mod-11 check (`cvrChecksumValid`); 99.8–99.9% pass. A failing number ships as printed — it is never corrected.

**What is `advertisingProtected`?** The CVR register's "Reklamebeskyttet" status as printed on the firm's profile header.

**Why is `rating` null for most firms?** Only 3.0% of firms have reviews; a firm with no reviews has no rating, not a rating of 0.

**How fresh is the data?** Live — every run reads the site's current search data and profile pages.

### Related

Other statutory-register and trade-directory lead actors by the same developer cover the UK (NICEIC), Canada (RBQ Québec, HCRA Ontario, HomeStars) and Germany (Impressum contacts).

# Actor input Schema

## `trades` (type: `array`):

Only firms whose Håndværker.dk trade is one of these. The labels are the site's own (field partnergrouptext), copied from its bytes, never translated - VVS = plumbing/heating, Elektriker = electrician, Tømrer = carpenter, Kloakmester = drain contractor, Maler = painter. Leave empty for every trade.

## `postcodes` (type: `array`):

Only firms registered at these Danish 4-digit postcodes (exact match on the firm's own postcode, not a radius). Leave empty for all of Denmark - a query that matches more than the index's 5,000-hit ceiling is then swept postcode by postcode automatically.

## `cities` (type: `array`):

Only firms whose city is exactly one of these, as the site spells it (e.g. "Aarhus C", "København Ø", "Odense C"). Postcodes are the more reliable filter; this one is exact-match.

## `searchText` (type: `string`):

Optional text the site's own search box matches against firm name and profile text (e.g. "varmepumpe", "tagrender", a company name). Combines with every filter above.

## `requirePhone` (type: `boolean`):

Skip firms whose row would carry no phone (after the display rule above). Skipped firms are never delivered or charged. In the search data 76.9% of the 103,640 firms have a phone; far fewer display one on their profile page.

## `requireEmail` (type: `boolean`):

Skip firms whose row would carry no email (after the display rule above). With 'Include contacts the profile page does not show' OFF this removes almost every firm, because profile pages rarely show an email. Skipped firms are never delivered or charged.

## `onlyPayingMembers` (type: `boolean`):

Only the 833 firms that pay for a Håndværker.dk membership (claimed, maintained profiles). Everyone else is a profile the site built from the public CVR register.

## `minReviews` (type: `integer`):

Only firms with at least this many customer recommendations on Håndværker.dk. 3,131 firms have one or more. 0 = no filter.

## `minRating` (type: `number`):

Only reviewed firms whose average rating is at least this. 0 = no filter. Setting it excludes firms with no reviews.

## `includeUndisplayedContacts` (type: `boolean`):

OFF (default, $0.003 per firm): phone and email follow the site's own display rule - you get them only where the firm's profile page shows them to a visitor (unclaimed profiles hide them; emails are almost never shown). ON: you also get the phone and email Håndværker.dk holds for the firm in its search data; each firm that carries a contact its page hides costs $0.005 extra ($0.008 in total). Firms whose contacts are all displayed never pay the extra.

## `includeProfileDetails` (type: `boolean`):

Add the rest of the profile page to each row: the advertising-protection flag (Reklamebeskyttet) and company status from the CVR header, contact person(s), full founding date, Sikkerhedsstyrelsen authorisations (number + type), the site's service tags, rating breakdown and the reviews embedded in the page. The page is fetched for every firm anyway (to apply the display rule), so this adds no time and no charge.

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

Stop after this many firms have been delivered (and charged). 0 = no limit (the whole index is about 104,000 firms). The default keeps a run with no input to a few cents.

## `concurrency` (type: `integer`):

How many requests run at once. The site answers HTTP 429 at about 12 in parallel; 3 ran a full national sweep with zero retries.

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

Not needed: the site answers Apify's own network directly, which is how this actor was measured. Offered in case that changes; if a proxy fails to start, the run falls back to a direct connection.

## `debugSaveRaw` (type: `boolean`):

Save the first 12 raw search responses and profile pages to the key-value store as RAW\_\* records, exactly as received. For troubleshooting only.

## Actor input object example

```json
{
  "trades": [
    "VVS",
    "Elektriker"
  ],
  "postcodes": [
    "2100",
    "8000"
  ],
  "cities": [
    "Aarhus C"
  ],
  "requirePhone": false,
  "requireEmail": false,
  "onlyPayingMembers": false,
  "minReviews": 0,
  "minRating": 0,
  "includeUndisplayedContacts": false,
  "includeProfileDetails": false,
  "maxResults": 20,
  "concurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "debugSaveRaw": false
}
```

# Actor output Schema

## `items` (type: `string`):

One row per distinct Håndværker.dk firm, keyed on the site's numeric firm id: company, trade, phone, email, CVR (with mod-11 check), street, postcode, city, coordinates, rating, review count, membership and badges - plus, if you asked for them, profile details (advertising-protection flag, company status, contact person, authorisations, reviews).

## `runSummary` (type: `string`):

RUN\_SUMMARY: the index's own total for your filter vs unique firms collected (completeness), duplicates skipped, rows excluded by your phone/email requirement, profile fetch outcomes, failures and the billing reconciliation (delivered == charged).

# 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 = {
    "trades": [
        "VVS"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/haandvaerker-dk-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 = {
    "trades": ["VVS"],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/haandvaerker-dk-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 '{
  "trades": [
    "VVS"
  ],
  "maxResults": 20
}' |
apify call scrapersdelight/haandvaerker-dk-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapersdelight/haandvaerker-dk-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/QmLR9f4hZpTiieAQV/builds/0jBIiLmOJLTTaH0Hd/openapi.json
