{
  "openapi": "3.0.1",
  "info": {
    "title": "Nordic Jobs Scraper & Alerts: Norway, Sweden, Finland, Denmark",
    "description": "Scrape job listings from NAV (Norway), Arbetsförmedlingen Platsbanken (Sweden) and EURES (Finland, Denmark, Iceland) via official public APIs. Daily job alerts with only new jobs to Slack, webhook or email. One clean schema, export CSV/JSON.",
    "version": "0.4",
    "x-build-id": "yCTtkxjAOcTsQG6MF"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/tidy-data~nordic-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-tidy-data-nordic-jobs-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/tidy-data~nordic-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-tidy-data-nordic-jobs-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/tidy-data~nordic-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-tidy-data-nordic-jobs-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": {
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "Norway uses NAV Arbeidsplassen, Sweden uses Arbetsförmedlingen's Platsbanken (JobTech open API), Finland, Denmark and Iceland use the EU's EURES job portal.",
            "items": {
              "type": "string",
              "enum": [
                "NO",
                "SE",
                "FI",
                "DK",
                "IS"
              ],
              "enumTitles": [
                "Norway (NAV)",
                "Sweden (Platsbanken)",
                "Finland (EURES)",
                "Denmark (EURES)",
                "Iceland (EURES)"
              ]
            },
            "default": [
              "NO",
              "SE",
              "FI",
              "DK"
            ]
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Keywords such as a job title, skill or company, e.g. \"developer\", \"sykepleier\", \"sjuksköterska\", \"sairaanhoitaja\". Each term is searched in every selected country and results are de-duplicated. Leave empty to get the newest jobs of any kind.",
            "items": {
              "type": "string"
            }
          },
          "keywordMatch": {
            "title": "Keyword must match",
            "enum": [
              "title",
              "fullText",
              "source"
            ],
            "type": "string",
            "description": "How strictly each search term must match. The job sites' own search is loose: EURES, for example, returns any ad that contains \"develop\" somewhere in the text for \"developer\". \"Job title or occupation\" keeps only jobs whose title, standardized job title or occupation contains the term (case-insensitive, plurals and Nordic endings allowed, so \"nurse\" matches \"Nurses\" but not \"Nursery\"; common job words are also matched in Norwegian, Swedish, Finnish and Danish, e.g. developer = utvikler / utvecklare / kehittäjä / udvikler). \"Anywhere in the ad\" re-checks the term in the description too. Jobs that do not match are dropped before they are stored, so you are not charged for them.",
            "default": "title"
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "Optional city, municipality or region, e.g. Oslo, Bergen, Stockholm, Göteborg, Helsinki, Aarhus. Matched against the job's workplace. Leave empty for the whole country."
          },
          "postedWithinDays": {
            "title": "Posted within the last N days",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "Only jobs published in the last N days. Use 1 for a daily monitoring schedule. Leave empty for all open jobs."
          },
          "postedAfter": {
            "title": "Posted after (date)",
            "type": "string",
            "description": "Optional YYYY-MM-DD. Only jobs published on or after this date. If both date filters are set, the later date wins."
          },
          "maxItemsPerCountry": {
            "title": "Max jobs per country",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many jobs in each country (across all search terms). 0 = all available.",
            "default": 100
          },
          "maxItems": {
            "title": "Max jobs in total",
            "minimum": 0,
            "type": "integer",
            "description": "Optional cap for the whole run, across all countries. 0 = no total cap.",
            "default": 0
          },
          "includeDescription": {
            "title": "Include full description and apply link",
            "type": "boolean",
            "description": "Fetch the full job ad (description, apply URL, deadline, employer details). Turn off for a faster, lighter run with search data only (Sweden, Finland, Denmark and Iceland still include the description, because their search results contain it).",
            "default": true
          },
          "includeDescriptionHtml": {
            "title": "Also include description as HTML",
            "type": "boolean",
            "description": "Adds a descriptionHtml field with the original formatting next to the plain-text description.",
            "default": false
          },
          "dedupeByTitleAndCompany": {
            "title": "Remove reposted duplicates",
            "type": "boolean",
            "description": "Skip ads with the same title, company and city in the same country (common for reposted ads). Exact duplicates by job ID are always removed.",
            "default": true
          },
          "skipFinnImportedAds": {
            "title": "Norway: skip ads imported from FINN.no",
            "type": "boolean",
            "description": "Many Norwegian ads on NAV Arbeidsplassen are imported from FINN.no. NAV's open feed does not share their full text, so for these ads you get title, company, location, dates, a short summary and a link to the original ad, but no full description. Turn this on to get only ads with a full description.",
            "default": false
          },
          "redactContacts": {
            "title": "Mask e-mail addresses and phone numbers",
            "type": "boolean",
            "description": "On by default, for GDPR-friendlier datasets. Ad texts often name a contact person with a personal e-mail address or phone number. With this on, e-mail addresses and phone numbers (Nordic and international formats) in the free-text fields (description, summary, title, salary, start date, workplace, keywords and the HTML description) are replaced with [email removed] / [phone removed]. Apply links, ad URLs and company websites are kept, as are dates, salaries, postal codes and organisation numbers. Names of contact persons may still appear in the text. Turn off only if you have a lawful basis to process the contact details.",
            "default": true
          },
          "onlyNewJobs": {
            "title": "Only new jobs (job alert mode)",
            "type": "boolean",
            "description": "Turn this on for scheduled runs. The Actor remembers every job it has delivered for this alert (in a named key-value store in your own Apify account) and returns, and charges for, only jobs it has not delivered before. The first run builds the baseline: it returns the current matching jobs. Every later run returns only new ones. Jobs already delivered are never charged again.",
            "default": false
          },
          "alertName": {
            "title": "Alert name",
            "type": "string",
            "description": "A short name for this alert, e.g. \"oslo-developers\". Each alert remembers its own delivered jobs, so use a different name for every search you schedule. Letters, numbers and dashes. If empty, a name is derived from your countries, search terms and location."
          },
          "resetAlert": {
            "title": "Reset alert memory",
            "type": "boolean",
            "description": "Forget the jobs this alert has delivered and start a new baseline. Turn it off again after one run.",
            "default": false
          },
          "webhookUrl": {
            "title": "Webhook URL (JSON POST)",
            "type": "string",
            "description": "Optional. When a run finds jobs, the Actor POSTs a JSON summary with the job list (up to 500 jobs, without descriptions) to this URL. Works with Zapier, Make, n8n, Pipedream or your own server."
          },
          "slackWebhookUrl": {
            "title": "Slack incoming webhook URL",
            "type": "string",
            "description": "Optional. A Slack incoming webhook (https://hooks.slack.com/services/...). Posts a message with the newest jobs, each linked to its apply page."
          },
          "emailTo": {
            "title": "E-mail notification to",
            "type": "string",
            "description": "Optional. Your e-mail address. Apify's free apify/send-mail Actor only delivers to the e-mail address of your own Apify account (use that address; other addresses are rejected). It runs in your account and adds a tiny platform usage cost (usually well under $0.01 per e-mail)."
          },
          "notifyTopN": {
            "title": "Jobs listed in Slack / e-mail",
            "minimum": 1,
            "maximum": 40,
            "type": "integer",
            "description": "How many of the newest jobs to show in the Slack message and the e-mail. The webhook always gets the full list (up to 500).",
            "default": 10
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Used only for Norway's NAV search, which rate-limits shared cloud IP addresses. Keep the default Apify Proxy (datacenter) for reliable Norwegian results. All other sources connect directly.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}