Job Bank Scraper
Pricing
from $0.50 / 1,000 job postings
You can access the Job Bank Scraper programmatically from your own applications by using the Apify API. You can also choose the language preference from below. To use the Apify API, you’ll need an Apify account and your API token, found in API & Integrations in Apify Console.
{ "openapi": "3.0.1", "info": { "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 } } } } } } } } }}OpenAPI is a standard for designing and describing RESTful APIs, allowing developers to define API structure, endpoints, and data formats in a machine-readable way. It simplifies API development, integration, and documentation.
OpenAPI is effective when used with AI agents and GPTs by standardizing how these systems interact with various APIs, for reliable integrations and efficient communication.
By defining machine-readable API specifications, OpenAPI allows AI models like GPTs to understand and use varied data sources, improving accuracy. This accelerates development, reduces errors, and provides context-aware responses, making OpenAPI a core component for AI applications.
You can download the OpenAPI definitions for Job Bank Scraper from the options below:
If you’d like to learn more about how OpenAPI powers GPTs, read our blog post.
You can also check out our other API clients: