{
  "openapi": "3.0.1",
  "info": {
    "title": "SEEK Job Scraper - Australia & New Zealand Job Listings",
    "description": "Scrape seek.com.au and seek.co.nz — SEEK's Australian and New Zealand job boards. Salary data, employer profiles, work type filters, and full job descriptions. Incremental mode detects new and changed listings. Compact output for AI agents and MCP workflows.",
    "version": "0.2",
    "x-build-id": "WVOw4AboR8a2fApdH"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/blackfalcondata~seek-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-blackfalcondata-seek-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~seek-scraper/runs": {
      "post": {
        "operationId": "runs-sync-blackfalcondata-seek-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~seek-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-blackfalcondata-seek-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 search keywords (e.g. \"software engineer\", \"accountant\"). Use JSON array for multi-query."
          },
          "country": {
            "title": "🌍 Country",
            "enum": [
              "AU",
              "NZ"
            ],
            "type": "string",
            "description": "Which SEEK market to search.",
            "default": "AU"
          },
          "location": {
            "title": "📍 Location",
            "type": "string",
            "description": "City, state, or region (e.g. \"Sydney\", \"Melbourne VIC\"). Use JSON array for multi-location."
          },
          "startUrls": {
            "title": "🔗 Start URLs",
            "type": "array",
            "description": "Direct SEEK search or job detail URLs. Added on top of any query/location search (not a replacement) — each URL becomes an additional source in the same run. Detail URLs (`/job/<id>`) skip SERP entirely; search URLs paginate like a query. For search URLs, `searchQuery` is derived from `keywords` or `/jobs/<slug>`; filter-only URLs without keywords return `searchQuery: \"\"`.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "💯 Max Results",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum total job listings to emit to the dataset. 0 = unlimited. Applied after post-filters — if you use `includeKeywords` / `excludeKeywords` / `customFilters` / date filters, set this to your final cap, not your collection cap. Memory auto-scales by default (≤100 → 256 MB, ≤200 → 512 MB, 200+ → 1024 MB); override manually in run settings if needed.",
            "default": 50
          },
          "maxPages": {
            "title": "📄 Max Pages",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Maximum SERP pages to scrape per search source. Each page has ~22 jobs. In incremental mode this also defines the tracked search universe — set high enough to cover every listing you want monitored; jobs beyond this page window fall outside the state and won't be marked EXPIRED.",
            "default": 25
          },
          "sortMode": {
            "title": "Sort By",
            "enum": [
              "relevance",
              "date"
            ],
            "type": "string",
            "description": "Sort search results by relevance or date.",
            "default": "relevance"
          },
          "dateRange": {
            "title": "Date Range",
            "enum": [
              "",
              "1",
              "3",
              "7",
              "14",
              "31"
            ],
            "type": "string",
            "description": "Filter by posting date (SEEK date range code, e.g. \"1\" = last 24h, \"3\" = last 3 days, \"7\" = last 7 days, \"14\" = last 14 days, \"31\" = last 31 days)."
          },
          "workType": {
            "title": "Work Type",
            "enum": [
              "",
              "242",
              "243",
              "244",
              "245"
            ],
            "type": "string",
            "description": "Filter by employment type."
          },
          "workArrangement": {
            "title": "Work Arrangement",
            "enum": [
              "",
              "1",
              "2",
              "3"
            ],
            "type": "string",
            "description": "Filter by work arrangement."
          },
          "classification": {
            "title": "Classification",
            "type": "string",
            "description": "SEEK job classification ID (e.g. \"6281\" = Information & Communication Technology, \"1203\" = Accounting, \"6043\" = Healthcare & Medical). Find IDs in SEEK category URLs."
          },
          "subClassification": {
            "title": "Sub-Classification",
            "type": "string",
            "description": "SEEK job sub-classification ID (e.g. \"6287\" = Developers/Programmers under ICT). Requires a parent classification to work."
          },
          "salaryMin": {
            "title": "💰 Minimum Salary",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "SEEK's own salary-bracket filter — minimum value in the listing's local currency (AUD for AU, NZD for NZ). Applied server-side by SEEK; matched listings may still hide their actual salary text. Combine with `salaryMax` for a range."
          },
          "salaryMax": {
            "title": "💰 Maximum Salary",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "SEEK's own salary-bracket filter — maximum value in the listing's local currency (AUD for AU, NZD for NZ). Applied server-side by SEEK; matched listings may still hide their actual salary text. Combine with `salaryMin` for a range."
          },
          "includeKeywords": {
            "title": "Include Keywords",
            "type": "array",
            "description": "Only keep jobs that contain at least one of these keywords anywhere in the listing — title, company, location, category, sub-category, work type, work arrangement, salary text, teaser, bullets, or description. Broad match by design — use exclude keywords below to narrow.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude Keywords",
            "type": "array",
            "description": "Drop jobs that contain any of these keywords in title, company, teaser, bullets, or description. Narrow scope by design — does NOT check location, salary text, or employment type, so \"remote\" won't drop jobs with \"remote work allowance\" in salary or \"not remote\" in location.",
            "items": {
              "type": "string"
            }
          },
          "keywordMatchTitle": {
            "title": "🎯 Match Job Title",
            "type": "boolean",
            "description": "When any keyword match toggle is set, include/exclude keyword filters match only toggled fields, for both include and exclude. Leave all toggles empty to use default broad keyword matching. Use customFilters for location, employmentType, workArrangement, or salaryText."
          },
          "keywordMatchCompany": {
            "title": "🏢 Match Company",
            "type": "boolean",
            "description": "Include company name in include/exclude keyword matching when keyword match toggles are used."
          },
          "keywordMatchDescription": {
            "title": "📄 Match Description",
            "type": "boolean",
            "description": "Include teaser and full description in include/exclude keyword matching when keyword match toggles are used."
          },
          "keywordMatchCategory": {
            "title": "🗂️ Match Category",
            "type": "boolean",
            "description": "Include category and sub-category in include/exclude keyword matching when keyword match toggles are used."
          },
          "keywordMatchBulletPoints": {
            "title": "• Match Bullet Points",
            "type": "boolean",
            "description": "Include listing bullet points in include/exclude keyword matching when keyword match toggles are used."
          },
          "customFilters": {
            "title": "🔧 Custom Filters",
            "type": "array",
            "description": "Advanced post-filter rules applied to output fields after collection. Each rule is {\"field\":\"salaryMin\",\"op\":\"gte\",\"value\":120000}. Supported ops: includes, notIncludes, equals, notEquals, gt, gte, lt, lte. equals/notEquals are intended for scalar fields; use includes/notIncludes for arrays such as bulletPoints or extractedUrls. Invalid fields or operators fail fast.",
            "items": {
              "type": "object"
            }
          },
          "fromDate": {
            "title": "From Date",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2})?(\\.\\d{3})?(Z|[+-]\\d{2}:?\\d{2})?)?$",
            "type": "string",
            "description": "Only keep jobs posted at or after this date/time. Use ISO date or datetime."
          },
          "toDate": {
            "title": "To Date",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2})?(\\.\\d{3})?(Z|[+-]\\d{2}:?\\d{2})?)?$",
            "type": "string",
            "description": "Only keep jobs posted at or before this date/time. Use ISO date or datetime."
          },
          "maxAgeMinutes": {
            "title": "Max Age Minutes",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep jobs posted within this many minutes from the scrape timestamp."
          },
          "includeDetails": {
            "title": "📋 Include Full Details",
            "type": "boolean",
            "description": "Fetch each job's detail page for full description, structured location, salary data, company profile, and more.",
            "default": true
          },
          "descriptionMaxLength": {
            "title": "✂️ Description Max Length",
            "minimum": 0,
            "type": "integer",
            "description": "Truncate job description to N characters. 0 = no truncation.",
            "default": 0
          },
          "compact": {
            "title": "📦 Compact Output",
            "type": "boolean",
            "description": "Output only core fields (jobId, title, company, location, salary, score, category, URL, dates). Ideal for AI-agent and MCP workflows.",
            "default": false
          },
          "incrementalMode": {
            "title": "♻️ Incremental Mode",
            "type": "boolean",
            "description": "Track changes between runs. Each record carries a `changeType` of NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED. Default emits NEW + UPDATED + REAPPEARED only; use `emitUnchanged` / `emitExpired` to opt into the others. `stateKey` is optional — when empty, a stable key is auto-derived from your search inputs so different query/filter combinations get isolated state.",
            "default": false
          },
          "stateKey": {
            "title": "🔑 State Key",
            "type": "string",
            "description": "Optional stable identifier for the tracked search universe. Leave empty to auto-derive a stable identifier from your search inputs — different keyword/location/filter combinations get isolated state automatically."
          },
          "emitUnchanged": {
            "title": "♻️ Emit Unchanged Records",
            "type": "boolean",
            "description": "When incremental, also emit records that haven't changed since last run.",
            "default": false
          },
          "emitExpired": {
            "title": "⚰️ Emit Expired Records",
            "type": "boolean",
            "description": "When incremental, also emit records no longer found in search results.",
            "default": false
          },
          "skipReposts": {
            "title": "🚫 Skip Reposts",
            "type": "boolean",
            "description": "Exclude listings detected as reposts of previously seen jobs.",
            "default": false
          },
          "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 where alerts are sent (e.g. \"-100123456789\")."
          },
          "discordWebhookUrl": {
            "title": "🎮 Discord Webhook URL",
            "type": "string",
            "description": "Discord incoming webhook URL. Paste from Server Settings -> Integrations -> Webhooks."
          },
          "slackWebhookUrl": {
            "title": "💼 Slack Webhook URL",
            "type": "string",
            "description": "Slack incoming webhook URL. Create at api.slack.com/messaging/webhooks."
          },
          "whatsappPhoneNumberId": {
            "title": "📱 WhatsApp Phone Number ID",
            "type": "string",
            "description": "WhatsApp Business phone number ID from Meta Business Manager (NOT the phone number itself - the numeric ID shown next to your business number). Free service-conversation messages within 24 hours of last user-initiated contact."
          },
          "whatsappAccessToken": {
            "title": "🔐 WhatsApp Access Token",
            "type": "string",
            "description": "Meta Cloud API access token with `whatsapp_business_messaging` scope. Get a permanent token from a system user in Meta Business Manager."
          },
          "whatsappTo": {
            "title": "📨 WhatsApp Recipient",
            "type": "string",
            "description": "Recipient phone number in E.164 format (e.g. +4512345678). The recipient must have messaged your business number within the last 24 hours - outside that window, free-form text is rejected by Meta. For non-interactive workflows, use Make/Zapier templates instead."
          },
          "webhookUrl": {
            "title": "🪝 Generic Webhook URL",
            "type": "string",
            "description": "Universal escape hatch for n8n / Make / Zapier / custom HTTP backends. Receives a JSON POST `{ metadata, items }` per run. Single attempt, 15 s timeout."
          },
          "webhookHeaders": {
            "title": "🪝 Webhook Headers (optional)",
            "type": "object",
            "description": "Additional HTTP headers sent with the generic webhook POST (e.g. `{\"Authorization\":\"Bearer ...\"}`). Body is JSON; default `Content-Type: application/json` is set unless you override it here."
          },
          "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
          },
          "notifyOnlyChanges": {
            "title": "🔄 Notify Only New/Updated",
            "type": "boolean",
            "description": "When Incremental Mode is on, only send notifications for jobs with `changeType` NEW or UPDATED. REAPPEARED, UNCHANGED, and EXPIRED records are dropped from notifications but still go to the dataset. No effect outside incremental mode.",
            "default": false
          },
          "includeRunSummary": {
            "title": "Include Run Summary",
            "type": "boolean",
            "description": "Prepend a one-line summary to each notification message: search label (`Seek: <query> · <country>`), total emitted record count, and run timestamp. Disable to send raw job items only.",
            "default": true
          },
          "descriptionFormat": {
            "title": "Description format",
            "enum": [
              "all",
              "text",
              "html",
              "markdown"
            ],
            "type": "string",
            "description": "Pick a single description representation. `all` keeps every variant; `text` / `html` / `markdown` drop the others.",
            "default": "all"
          },
          "excludeEmptyFields": {
            "title": "Exclude empty fields from output",
            "type": "boolean",
            "description": "Drop null, empty-string, and empty-array fields from each record before push. Smaller payloads for AI agents and dashboards.",
            "default": false
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}