{
  "openapi": "3.0.1",
  "info": {
    "title": "Job Bank Canada Scraper [💰$0.89] — Jobs, Salaries & Employers",
    "description": "Scrape jobbank.gc.ca — records. Every record carries email, salary and address the source publishes. Address and city is included where the source lists it. Structured rows ready to import into a CRM or a spreadsheet with one row per Job Bank posting.",
    "version": "0.1",
    "x-build-id": "vmZTR9Vqm1tvK7FFg"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/blackfalcondata~gc-ca-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-blackfalcondata-gc-ca-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/blackfalcondata~gc-ca-scraper/runs": {
      "post": {
        "operationId": "runs-sync-blackfalcondata-gc-ca-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/blackfalcondata~gc-ca-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-blackfalcondata-gc-ca-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": {
          "query": {
            "title": "🔍 Search Term(s)",
            "type": "string",
            "description": "Job title, skill or keyword, e.g. \"administrative assistant\" or \"welder\". Required if no startUrls provided. Use a JSON array for several searches in one run, e.g. [\"welder\",\"millwright\"]."
          },
          "location": {
            "title": "📍 Location",
            "type": "string",
            "description": "City or province/territory in Canada, e.g. \"Toronto, ON\", \"Calgary\" or \"Alberta\". A city is looked up in Job Bank's own city list, so you get that city and its area. Leave empty to search all of Canada. Use a JSON array for several locations in one run."
          },
          "searches": {
            "title": "🗂️ Batch searches",
            "type": "array",
            "description": "Several keyword + location searches in one run, one row per search, e.g. carpenter in Calgary and welder in Alberta. Leave Keyword or Location empty to search by the other only. Rows are searched as given (not combined with each other), the filters below apply to every row, and results are merged and deduplicated. Ignored when Start URLs are given.",
            "items": {
              "type": "object",
              "properties": {
                "keyword": {
                  "type": "string",
                  "title": "Keyword",
                  "description": "Job title, skill or employer, e.g. carpenter.",
                  "editor": "textfield"
                },
                "location": {
                  "type": "string",
                  "title": "Location",
                  "description": "City or province, e.g. Calgary or Alberta.",
                  "editor": "textfield"
                }
              }
            }
          },
          "maxResults": {
            "title": "💯 Max Results",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum total results (0 = unlimited).",
            "default": 100
          },
          "startUrls": {
            "title": "🔗 Start URLs",
            "type": "array",
            "description": "Paste raw search URLs from the target site. Each URL becomes its own search task; results are merged and deduped by job ID across all URLs. When provided, startUrls REPLACE the query/location fields (each supported URL becomes one task; unsupported URLs are skipped, and if none is supported the run stops with an input error).",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "date"
            ],
            "type": "string",
            "description": "Order of the results. Applies to keyword/location searches only; filters in pasted Start URLs are kept as they are.",
            "default": "relevance"
          },
          "datePosted": {
            "title": "Date posted",
            "enum": [
              "any",
              "last48h",
              "last30days",
              "older30days"
            ],
            "type": "string",
            "description": "Only jobs posted within this window. Applies to keyword/location searches only; filters in pasted Start URLs are kept as they are.",
            "default": "any"
          },
          "jobTerm": {
            "title": "Job term",
            "type": "array",
            "description": "Permanent, contract, seasonal or casual jobs. Applies to keyword/location searches only; filters in pasted Start URLs are kept as they are.",
            "items": {
              "type": "string",
              "enum": [
                "permanent",
                "term_contract",
                "seasonal",
                "casual"
              ],
              "enumTitles": [
                "Permanent",
                "Term or contract",
                "Seasonal",
                "Casual"
              ]
            }
          },
          "workSchedule": {
            "title": "Work schedule",
            "enum": [
              "any",
              "full_time",
              "part_time"
            ],
            "type": "string",
            "description": "Full-time or part-time jobs. Applies to keyword/location searches only; filters in pasted Start URLs are kept as they are.",
            "default": "any"
          },
          "workplace": {
            "title": "Workplace",
            "type": "array",
            "description": "Remote, hybrid and other work arrangements. Applies to keyword/location searches only; filters in pasted Start URLs are kept as they are.",
            "items": {
              "type": "string",
              "enum": [
                "remote",
                "hybrid",
                "on_the_road",
                "frequent_relocation",
                "exclude_remote"
              ],
              "enumTitles": [
                "Remote work",
                "Hybrid work",
                "On the road",
                "Frequent relocation",
                "Exclude remote work"
              ]
            }
          },
          "lmia": {
            "title": "LMIA",
            "type": "array",
            "description": "Jobs with a Labour Market Impact Assessment (LMIA) requested or approved, or exclude them. Applies to keyword/location searches only; filters in pasted Start URLs are kept as they are.",
            "items": {
              "type": "string",
              "enum": [
                "requested",
                "approved",
                "exclude_requested",
                "exclude_approved"
              ],
              "enumTitles": [
                "LMIA requested",
                "LMIA approved",
                "Exclude LMIA requested",
                "Exclude LMIA approved"
              ]
            }
          },
          "language": {
            "title": "Job language",
            "type": "array",
            "description": "Language of the job posting. Applies to keyword/location searches only; filters in pasted Start URLs are kept as they are.",
            "items": {
              "type": "string",
              "enum": [
                "english",
                "french",
                "bilingual"
              ],
              "enumTitles": [
                "English",
                "French",
                "English and French"
              ]
            }
          },
          "yearlySalary": {
            "title": "Yearly salary",
            "type": "array",
            "description": "Jobs paying a yearly salary in these bands. Applies to keyword/location searches only; filters in pasted Start URLs are kept as they are.",
            "items": {
              "type": "string",
              "enum": [
                "20-40k",
                "40-60k",
                "60-80k",
                "80-100k",
                "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 over"
              ]
            }
          },
          "hourlySalary": {
            "title": "Hourly wage",
            "type": "array",
            "description": "Jobs paying an hourly wage in these bands. Applies to keyword/location searches only; filters in pasted Start URLs are kept as they are.",
            "items": {
              "type": "string",
              "enum": [
                "under-20",
                "20-29.99",
                "30-39.99",
                "40-49.99",
                "50+"
              ],
              "enumTitles": [
                "Up to $19.99",
                "$20.00 to $29.99",
                "$30.00 to $39.99",
                "$40.00 to $49.99",
                "$50.00 and over"
              ]
            }
          },
          "jobSource": {
            "title": "Job source",
            "enum": [
              "any",
              "verified",
              "external_boards"
            ],
            "type": "string",
            "description": "Jobs posted directly on Job Bank (verified) or on external job boards. Applies to keyword/location searches only; filters in pasted Start URLs are kept as they are.",
            "default": "any"
          },
          "employerType": {
            "title": "Employer type",
            "type": "array",
            "description": "Filter by type of employer. Applies to keyword/location searches only; filters in pasted Start URLs are kept as they are.",
            "items": {
              "type": "string",
              "enum": [
                "exclude_placement_agencies",
                "federal_government",
                "provincial_government",
                "municipal_government"
              ],
              "enumTitles": [
                "Exclude placement agencies",
                "Federal government",
                "Provincial or territorial government",
                "Municipal government"
              ]
            }
          },
          "jobType": {
            "title": "Job type",
            "type": "array",
            "description": "Student, apprentice, internship, green jobs and ongoing recruitment. Applies to keyword/location searches only; filters in pasted Start URLs are kept as they are.",
            "items": {
              "type": "string",
              "enum": [
                "exclude_student",
                "student",
                "exclude_apprentice",
                "apprentice",
                "ongoing_recruitment",
                "internship",
                "green_job"
              ],
              "enumTitles": [
                "Exclude student jobs",
                "Student jobs",
                "Exclude apprentice jobs",
                "Apprentice jobs",
                "Ongoing recruitment",
                "Internships",
                "Green jobs"
              ]
            }
          },
          "equityGroups": {
            "title": "Hiring groups",
            "type": "array",
            "description": "Jobs aimed at specific groups of candidates. Applies to keyword/location searches only; filters in pasted Start URLs are kept as they are.",
            "items": {
              "type": "string",
              "enum": [
                "indigenous",
                "disabilities",
                "newcomers",
                "older_workers",
                "veterans",
                "youth",
                "visible_minority",
                "canadians_authorized",
                "international_candidates"
              ],
              "enumTitles": [
                "Indigenous people",
                "Persons with disabilities",
                "Newcomers to Canada",
                "Older workers",
                "Veterans",
                "Youth",
                "Visible minorities",
                "Canadians and authorized workers",
                "Canadians and international candidates"
              ]
            }
          },
          "nocCodes": {
            "title": "NOC codes",
            "type": "array",
            "description": "5-digit National Occupational Classification (NOC 2021) codes, e.g. 21232. Invalid codes are skipped with a warning. Applies to keyword/location searches only; filters in pasted Start URLs are kept as they are.",
            "items": {
              "type": "string"
            }
          },
          "includeDetails": {
            "title": "📋 Include Full Details",
            "type": "boolean",
            "description": "Fetch full job details.",
            "default": true
          },
          "includeApplyInfo": {
            "title": "Include how to apply (email, mail, phone, URL)",
            "type": "boolean",
            "description": "Reads each Job Bank posting's 'How to apply' block - application email, mailing address, phone, apply URL, required documents and screening questions. One extra request per Job Bank posting. Needs Include Full Details.",
            "default": true
          },
          "enrichEmails": {
            "title": "Find employer contact emails",
            "type": "boolean",
            "description": "For postings without an application email that list an employer website, reads the website's home page and its contact page to find a contact email. Adds contactEmail and contactWebsite. Makes extra requests to the employer's site, only when enabled. Needs Include Full Details.",
            "default": false
          },
          "descriptionMaxLength": {
            "title": "✂️ Description Max Length",
            "minimum": 0,
            "type": "integer",
            "description": "Truncate description to N chars. 0 = no truncation.",
            "default": 0
          },
          "compact": {
            "title": "📦 Compact Output",
            "type": "boolean",
            "description": "Core fields only (for AI-agent/MCP workflows).",
            "default": false
          },
          "descriptionFormat": {
            "title": "📝 Description Format",
            "enum": [
              "all",
              "text",
              "html",
              "markdown"
            ],
            "type": "string",
            "description": "Which description representations to emit. `all` keeps description + descriptionText + descriptionHtml + descriptionMarkdown (default, back-compat). `text` / `html` / `markdown` keep only one variant — typically halves output size.",
            "default": "all"
          },
          "excludeEmptyFields": {
            "title": "🧹 Exclude Empty Fields",
            "type": "boolean",
            "description": "Drop null / empty-string / empty-array fields (and fully-null nested objects like socialProfiles) from each output record. Off by default to preserve dataset schema compatibility; turn on to slim output for LLM / agent consumption.",
            "default": false
          },
          "incrementalMode": {
            "title": "♻️ Incremental Mode",
            "type": "boolean",
            "description": "Compare against previous run state. stateKey is optional — defaults to a value derived from search inputs (queries, locations, startUrls) so different filter sets never share state.",
            "default": false
          },
          "stateKey": {
            "title": "🔑 State Key",
            "type": "string",
            "description": "Optional. Stable identifier for the tracked search universe. Leave empty to auto-generate from search inputs."
          },
          "emitUnchanged": {
            "title": "♻️ Emit Unchanged",
            "type": "boolean",
            "description": "Also emit jobs that have not changed since the last run (incrementalMode only).",
            "default": false
          },
          "emitExpired": {
            "title": "⚰️ Emit Expired",
            "type": "boolean",
            "description": "Also emit jobs that have disappeared since the last run (incrementalMode only).",
            "default": false
          },
          "skipReposts": {
            "title": "🚫 Skip Reposts",
            "type": "boolean",
            "description": "When incremental, skip jobs whose content matches an expired job from a prior run (cross-run repost detection).",
            "default": false
          },
          "notifyOnlyChanges": {
            "title": "🔄 Notify Only New/Updated",
            "type": "boolean",
            "description": "When Incremental Mode is on, only send notifications for NEW and UPDATED jobs. Has no effect outside incremental mode.",
            "default": false
          },
          "notificationLimit": {
            "title": "📊 Max Jobs Per Notification",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum number of jobs included in each notification message (1–20).",
            "default": 5
          },
          "telegramToken": {
            "title": "🔑 Telegram Bot Token",
            "type": "string",
            "description": "Telegram bot token (from @BotFather). Required for Telegram notifications."
          },
          "telegramChatId": {
            "title": "💬 Telegram Chat ID",
            "type": "string",
            "description": "Telegram chat or channel ID (e.g. \"-100123456789\"). Required when telegramToken is set."
          },
          "discordWebhookUrl": {
            "title": "🎮 Discord Webhook URL",
            "type": "string",
            "description": "Discord incoming webhook URL. Server Settings → Integrations → Webhooks → New Webhook."
          },
          "slackWebhookUrl": {
            "title": "💼 Slack Webhook URL",
            "type": "string",
            "description": "Slack incoming webhook URL. api.slack.com/messaging/webhooks."
          },
          "whatsappPhoneNumberId": {
            "title": "📞 WhatsApp Phone Number ID",
            "type": "string",
            "description": "Your WhatsApp Business phone-number ID (numeric, from Meta dashboard). Required when whatsappAccessToken is set."
          },
          "whatsappAccessToken": {
            "title": "📱 WhatsApp Access Token",
            "type": "string",
            "description": "WhatsApp Cloud API permanent access token (System User token from Meta Business). Recipient must have messaged the business number within the last 24h (service-conversation window — free since Nov 2024)."
          },
          "whatsappTo": {
            "title": "📲 WhatsApp Recipient",
            "type": "string",
            "description": "Recipient phone in E.164 format without + (e.g. \"436641234567\"). Recipient must have messaged your business number within last 24h."
          },
          "webhookUrl": {
            "title": "🪝 Generic Webhook URL",
            "type": "string",
            "description": "Receives a JSON POST with {metadata, items} after each run. Universal escape hatch for n8n / Make / Zapier / custom backends."
          },
          "webhookHeaders": {
            "title": "📋 Webhook Headers",
            "type": "object",
            "description": "Optional JSON object of custom headers (e.g. {\"Authorization\":\"Bearer ...\"})."
          },
          "appConnector": {
            "title": "Send results to a connected app",
            "type": "string",
            "description": "Optional. Pick a connected app under Settings → API & Integrations to receive your results (including any contact details). Best-effort across MCP connectors as Apify expands its catalog."
          },
          "mcpIssueTeam": {
            "title": "Issue tracker team",
            "type": "string",
            "description": "Only when the connected app is an issue tracker: the team (name or ID) the summary issue is created under, if that app requires one."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}