{
  "openapi": "3.0.1",
  "info": {
    "title": "Håndværker.dk Scraper - Danish Tradesperson Leads with CVR",
    "description": "$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.",
    "version": "0.1",
    "x-build-id": "0jBIiLmOJLTTaH0Hd"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~haandvaerker-dk-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-haandvaerker-dk-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/scrapersdelight~haandvaerker-dk-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-haandvaerker-dk-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/scrapersdelight~haandvaerker-dk-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-haandvaerker-dk-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "trades": {
            "title": "Trades",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string",
              "enum": [
                "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"
              ]
            }
          },
          "postcodes": {
            "title": "Postcodes",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            }
          },
          "cities": {
            "title": "Cities",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            }
          },
          "searchText": {
            "title": "Free-text search",
            "type": "string",
            "description": "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": {
            "title": "Only firms with a phone number",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "requireEmail": {
            "title": "Only firms with an email address",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "onlyPayingMembers": {
            "title": "Only paying Håndværker.dk members",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "minReviews": {
            "title": "Minimum number of reviews",
            "minimum": 0,
            "type": "integer",
            "description": "Only firms with at least this many customer recommendations on Håndværker.dk. 3,131 firms have one or more. 0 = no filter.",
            "default": 0
          },
          "minRating": {
            "title": "Minimum average rating (1-5)",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Only reviewed firms whose average rating is at least this. 0 = no filter. Setting it excludes firms with no reviews.",
            "default": 0
          },
          "includeUndisplayedContacts": {
            "title": "Include contacts the profile page does not show",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "includeProfileDetails": {
            "title": "Add profile-page details",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "maxResults": {
            "title": "Maximum firms",
            "minimum": 0,
            "type": "integer",
            "description": "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.",
            "default": 40
          },
          "concurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "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.",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "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.",
            "default": {
              "useApifyProxy": false
            }
          },
          "debugSaveRaw": {
            "title": "Save raw responses (debugging)",
            "type": "boolean",
            "description": "Save the first 12 raw search responses and profile pages to the key-value store as RAW_* records, exactly as received. For troubleshooting only.",
            "default": false
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}