{
  "openapi": "3.0.1",
  "info": {
    "title": "Job Bank Scraper",
    "description": "Scrape Canadian job postings from Job Bank with every search filter.",
    "version": "0.1",
    "x-build-id": "de6I6Qovc2PfU4kSc"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/harpoon~jobbank-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-harpoon-jobbank-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/harpoon~jobbank-scraper/runs": {
      "post": {
        "operationId": "runs-sync-harpoon-jobbank-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/harpoon~jobbank-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-harpoon-jobbank-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": {
          "search_queries": {
            "title": "Search queries",
            "uniqueItems": true,
            "type": "array",
            "description": "One or more keywords to search for, e.g. <code>teacher</code>. Add one per line, or paste a list with <b>Bulk edit</b>. Each keyword is one scrape target with its own result cap, and duplicates are removed automatically.<br><br>Leave this empty to search the filters alone and return <b>every</b> matching job.",
            "items": {
              "type": "string"
            }
          },
          "max_results": {
            "title": "Max results per query",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "How many job postings to return for each keyword, e.g. <code>100</code>. The board shows 25 per page, so this is rounded up to whole pages and trimmed to the exact number before saving.",
            "default": 100
          },
          "fetch_details": {
            "title": "Fetch full job details ($)",
            "type": "boolean",
            "description": "Open every posting to collect the full job description, requirements, tasks, benefits, vacancies, expiry date and application link.<br><br><b>Costs one extra request per job</b> and is charged at the higher detail rate. Turn it off for a large, cheap run of listing rows only.",
            "default": true
          },
          "provinces": {
            "title": "Provinces and territories",
            "uniqueItems": true,
            "type": "array",
            "description": "Keep only jobs in these provinces or territories. Leave empty for all of Canada, and select several to combine them, e.g. <code>Ontario</code> + <code>Quebec</code>.",
            "items": {
              "type": "string",
              "enum": [
                "AB",
                "BC",
                "MB",
                "NB",
                "NL",
                "NT",
                "NS",
                "NU",
                "ON",
                "PE",
                "QC",
                "SK",
                "YT"
              ],
              "enumTitles": [
                "Alberta",
                "British Columbia",
                "Manitoba",
                "New Brunswick",
                "Newfoundland and Labrador",
                "Northwest Territories",
                "Nova Scotia",
                "Nunavut",
                "Ontario",
                "Prince Edward Island",
                "Quebec",
                "Saskatchewan",
                "Yukon"
              ]
            }
          },
          "regions": {
            "title": "Economic regions",
            "uniqueItems": true,
            "type": "array",
            "description": "Keep only jobs in these economic regions, which are finer than a province. Selecting a region narrows further still - leave empty and use <b>Provinces</b> instead for a wider net.",
            "items": {
              "type": "string",
              "enum": [
                "25260",
                "25418",
                "25411",
                "25419",
                "25349",
                "25245",
                "25247",
                "25350",
                "29303",
                "29302",
                "25565",
                "29305",
                "29304",
                "29306",
                "29301",
                "25566",
                "29318",
                "29319",
                "29316",
                "29317",
                "29314",
                "29313",
                "29315",
                "11326",
                "25635",
                "27277",
                "27278",
                "15480",
                "25637",
                "27450",
                "26928",
                "26936",
                "27451",
                "25438",
                "25167",
                "25164",
                "26264",
                "27449",
                "6261",
                "8961",
                "27236",
                "27234",
                "8792",
                "6363",
                "8848",
                "9193",
                "27235",
                "9219",
                "27233",
                "3526",
                "25148",
                "0236",
                "0097",
                "25150",
                "3545",
                "25151",
                "0073",
                "25156",
                "25157",
                "2359",
                "0044",
                "25154",
                "25153",
                "25163",
                "0065",
                "25161",
                "29312",
                "29311",
                "29307",
                "29309",
                "29308",
                "29310"
              ],
              "enumTitles": [
                "Alberta - Athabasca-Grande Prairie-Peace River",
                "Alberta - Banff-Jasper-Rocky Mountain House",
                "Alberta - Calgary",
                "Alberta - Camrose-Drumheller",
                "Alberta - Edmonton",
                "Alberta - Lethbridge-Medicine Hat",
                "Alberta - Red Deer",
                "Alberta - Wood Buffalo-Cold Lake",
                "British Columbia - Cariboo",
                "British Columbia - Kootenay",
                "British Columbia - Lower Mainland-Southwest",
                "British Columbia - Nechako",
                "British Columbia - North Coast",
                "British Columbia - Northeast",
                "British Columbia - Thompson-Okanagan",
                "British Columbia - Vancouver Island and Coast",
                "Manitoba - Interlake",
                "Manitoba - North",
                "Manitoba - North Central",
                "Manitoba - Parklands",
                "Manitoba - South Central",
                "Manitoba - Southeast",
                "Manitoba - Southwest",
                "Manitoba - Winnipeg",
                "New Brunswick - Campbellton-Miramichi",
                "New Brunswick - Edmundston-Woodstock",
                "New Brunswick - Fredericton-Oromocto",
                "New Brunswick - Moncton-Richibucto",
                "New Brunswick - Saint John-St. Stephen",
                "Newfoundland and Labrador - Avalon Peninsula",
                "Newfoundland and Labrador - Notre Dame-Central-Bonavista Bay",
                "Newfoundland and Labrador - South Coast-Burin Peninsula",
                "Newfoundland and Labrador - West Coast-Northern Peninsula-Labrador",
                "Nova Scotia - Annapolis Valley",
                "Nova Scotia - Cape Breton",
                "Nova Scotia - Halifax",
                "Nova Scotia - North Shore",
                "Nova Scotia - Southern",
                "Ontario - Hamilton-Niagara Peninsula",
                "Ontario - Kingston-Pembroke",
                "Ontario - Kitchener-Waterloo-Barrie",
                "Ontario - London",
                "Ontario - Muskoka-Kawarthas",
                "Ontario - Northeast",
                "Ontario - Northwest",
                "Ontario - Ottawa",
                "Ontario - Stratford-Bruce Peninsula",
                "Ontario - Toronto",
                "Ontario - Windsor-Sarnia",
                "Quebec - Abitibi-Temiscamingue",
                "Quebec - Bas-Saint-Laurent",
                "Quebec - Capitale-Nationale",
                "Quebec - Centre-du-Quebec",
                "Quebec - Chaudiere-Appalaches",
                "Quebec - Cote-Nord",
                "Quebec - Estrie",
                "Quebec - Gaspesie-Iles-de-la-Madeleine",
                "Quebec - Lanaudiere",
                "Quebec - Laurentides",
                "Quebec - Laval",
                "Quebec - Mauricie",
                "Quebec - Montreal",
                "Quebec - Monteregie",
                "Quebec - Nord-du-Quebec",
                "Quebec - Outaouais",
                "Quebec - Saguenay-Lac-Saint-Jean",
                "Saskatchewan - Northern",
                "Saskatchewan - Prince Albert",
                "Saskatchewan - Regina-Moose Mountain",
                "Saskatchewan - Saskatoon-Biggar",
                "Saskatchewan - Swift Current-Moose Jaw",
                "Saskatchewan - Yorkton-Melville"
              ]
            }
          },
          "location": {
            "title": "City or postal code",
            "type": "string",
            "description": "Keep only jobs in or around one place, e.g. <code>Toronto</code>, <code>Montreal, QC</code> or <code>K1A 0A1</code>. A trailing province code picks the right match when several cities share a name.<br><br>If the place cannot be matched, the run continues without it and says so in the log - it never fails."
          },
          "sort": {
            "title": "Sort by",
            "enum": [
              "best_match",
              "date_posted"
            ],
            "type": "string",
            "description": "Order of the results. <b>Newest first</b> is what you want for a recurring feed; <b>Best match</b> is better for exploring a keyword.",
            "default": "best_match"
          },
          "date_posted": {
            "title": "Date posted",
            "enum": [
              "",
              "last_48_hours",
              "last_7_days",
              "last_30_days",
              "older_than_30_days"
            ],
            "type": "string",
            "description": "Only return jobs posted in this window. Leave empty for any age; choose <b>More than 30 days old</b> to look at older postings that are still open.",
            "default": ""
          },
          "employment_type": {
            "title": "Full time or part time",
            "uniqueItems": true,
            "type": "array",
            "description": "Restrict to full-time or part-time work. Select both to include either.",
            "items": {
              "type": "string",
              "enum": [
                "full_time",
                "part_time"
              ],
              "enumTitles": [
                "Full time",
                "Part time"
              ]
            }
          },
          "work_term": {
            "title": "Period of employment",
            "uniqueItems": true,
            "type": "array",
            "description": "The length of the engagement, e.g. <code>Permanent</code> for a steady job or <code>Seasonal</code> for summer work.",
            "items": {
              "type": "string",
              "enum": [
                "permanent",
                "term_or_contract",
                "seasonal",
                "casual"
              ],
              "enumTitles": [
                "Permanent",
                "Term or contract",
                "Seasonal",
                "Casual"
              ]
            }
          },
          "work_hours": {
            "title": "Hours and shifts",
            "uniqueItems": true,
            "type": "array",
            "description": "The shift pattern the employer advertises. Select several to include any of them, e.g. <code>Day</code> + <code>Evening</code>.",
            "items": {
              "type": "string",
              "enum": [
                "day",
                "early_morning",
                "morning",
                "evening",
                "night",
                "weekend",
                "shift",
                "on_call",
                "flexible_hours",
                "overtime"
              ],
              "enumTitles": [
                "Day",
                "Early morning",
                "Morning",
                "Evening",
                "Night",
                "Weekend",
                "Shift",
                "On call",
                "Flexible hours",
                "Overtime"
              ]
            }
          },
          "language_at_work": {
            "title": "Language at work",
            "uniqueItems": true,
            "type": "array",
            "description": "The language the job is performed in. Leave empty for both languages.",
            "items": {
              "type": "string",
              "enum": [
                "english",
                "french",
                "bilingual"
              ],
              "enumTitles": [
                "English",
                "French",
                "English and French"
              ]
            }
          },
          "education": {
            "title": "Education required",
            "uniqueItems": true,
            "type": "array",
            "description": "The minimum schooling the posting asks for. <b>No education required</b> is the useful one when you want entry-level jobs.",
            "items": {
              "type": "string",
              "enum": [
                "university",
                "college_or_apprenticeship",
                "secondary_school",
                "no_education_required"
              ],
              "enumTitles": [
                "University",
                "College or apprenticeship",
                "Secondary school or job-specific training",
                "No education required"
              ]
            }
          },
          "experience": {
            "title": "Years of experience",
            "uniqueItems": true,
            "type": "array",
            "description": "How much experience the posting requires. <b>No experience</b> is the entry-level filter.",
            "items": {
              "type": "string",
              "enum": [
                "no_experience",
                "less_than_1_year",
                "1_to_3_years",
                "3_years_or_more"
              ],
              "enumTitles": [
                "No experience",
                "Less than 1 year",
                "1 year to less than 3 years",
                "3 years or more"
              ]
            }
          },
          "salary_annual": {
            "title": "Annual salary",
            "uniqueItems": true,
            "type": "array",
            "description": "Yearly pay bands. This is the annual facet - use <b>Hourly salary</b> for postings that quote an hourly rate.",
            "items": {
              "type": "string",
              "enum": [
                "20k_to_40k",
                "40k_to_60k",
                "60k_to_80k",
                "80k_to_100k",
                "over_100k"
              ],
              "enumTitles": [
                "$20,000 to $39,999",
                "$40,000 to $59,999",
                "$60,000 to $79,999",
                "$80,000 to $99,999",
                "$100,000 and up"
              ]
            }
          },
          "salary_hourly": {
            "title": "Hourly salary",
            "uniqueItems": true,
            "type": "array",
            "description": "Hourly pay bands, for postings that quote an hourly wage rather than a salary.",
            "items": {
              "type": "string",
              "enum": [
                "under_20",
                "20_to_30",
                "30_to_40",
                "40_to_50",
                "over_50"
              ],
              "enumTitles": [
                "Minimum to $19.99",
                "$20.00 to $29.99",
                "$30.00 to $39.99",
                "$40.00 to $49.99",
                "$50.00 and up"
              ]
            }
          },
          "workplace": {
            "title": "Work arrangement",
            "uniqueItems": true,
            "type": "array",
            "description": "Where the work happens. <b>Remote</b> is the telework filter; <b>Exclude remote jobs</b> is its inverse.",
            "items": {
              "type": "string",
              "enum": [
                "on_site",
                "remote",
                "hybrid",
                "on_the_road",
                "frequent_relocation",
                "exclude_remote"
              ],
              "enumTitles": [
                "On site",
                "Remote",
                "Hybrid",
                "On the road",
                "Frequent or cyclical relocation",
                "Exclude remote jobs"
              ]
            }
          },
          "job_source": {
            "title": "Job source",
            "uniqueItems": true,
            "type": "array",
            "description": "Jobs posted directly on the board versus collected from partner job boards such as indeed.com or Jobillico.",
            "items": {
              "type": "string",
              "enum": [
                "verified_jobs",
                "external_job_boards"
              ],
              "enumTitles": [
                "Verified jobs",
                "Jobs from external job boards"
              ]
            }
          },
          "employer_type": {
            "title": "Employer type",
            "uniqueItems": true,
            "type": "array",
            "description": "Limit to public-sector employers, or drop staffing agencies from the results.",
            "items": {
              "type": "string",
              "enum": [
                "federal_government",
                "provincial_government",
                "municipal_government",
                "exclude_placement_agencies"
              ],
              "enumTitles": [
                "Federal government",
                "Provincial and territorial governments",
                "Municipal governments",
                "Exclude placement agencies"
              ]
            }
          },
          "job_type": {
            "title": "Job type",
            "uniqueItems": true,
            "type": "array",
            "description": "Special posting categories. Each pair is mutually exclusive: pick <b>Student jobs</b> or <b>Exclude student jobs</b>, not both.",
            "items": {
              "type": "string",
              "enum": [
                "student_jobs",
                "exclude_student_jobs",
                "apprentice_jobs",
                "exclude_apprentice_jobs",
                "ongoing_recruitment",
                "internships",
                "green_jobs"
              ],
              "enumTitles": [
                "Student jobs",
                "Exclude student jobs",
                "Apprentice jobs",
                "Exclude apprentice jobs",
                "Ongoing recruitment",
                "Internships",
                "Green jobs"
              ]
            }
          },
          "lmia": {
            "title": "Labour Market Impact Assessment",
            "uniqueItems": true,
            "type": "array",
            "description": "A requested or approved LMIA is what lets an employer hire a temporary foreign worker. Useful when you are searching from abroad.<br><br>Each pair is mutually exclusive.",
            "items": {
              "type": "string",
              "enum": [
                "lmia_requested",
                "exclude_lmia_requested",
                "approved_lmia",
                "exclude_approved_lmia"
              ],
              "enumTitles": [
                "LMIA requested",
                "Exclude jobs with a requested LMIA",
                "Approved LMIA",
                "Exclude jobs with an approved LMIA"
              ]
            }
          },
          "apprenticeship_level": {
            "title": "Apprenticeship level",
            "uniqueItems": true,
            "type": "array",
            "description": "Training level for apprenticeship postings.",
            "items": {
              "type": "string",
              "enum": [
                "pre_apprenticeship",
                "level_one",
                "level_two",
                "level_three",
                "level_four",
                "level_five"
              ],
              "enumTitles": [
                "Pre-apprenticeship training",
                "Level one",
                "Level two",
                "Level three",
                "Level four",
                "Level five"
              ]
            }
          },
          "employment_groups": {
            "title": "Intended applicants",
            "uniqueItems": true,
            "type": "array",
            "description": "Jobs that actively encourage applications from a specific group. <b>Canadians and authorized workers</b> and <b>Canadians and international candidates</b> are the useful ones when you are looking from outside Canada.",
            "items": {
              "type": "string",
              "enum": [
                "indigenous_people",
                "persons_with_disabilities",
                "newcomers",
                "older_workers",
                "veterans",
                "youth",
                "visible_minority",
                "canadians_and_authorized_workers",
                "canadians_and_international_candidates"
              ],
              "enumTitles": [
                "Indigenous people",
                "Persons with disabilities",
                "Newcomers",
                "Older workers",
                "Veterans",
                "Youth",
                "Visible minority",
                "Canadians and authorized workers",
                "Canadians and international candidates"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}