{
  "openapi": "3.0.1",
  "info": {
    "title": "Reed.co.uk Job Scraper",
    "description": "Scrape reed.co.uk job listings by keyword, sector and location. Every on-site filter, salary bounds, remote/hybrid status, full job descriptions, and incremental monitoring that emits only new or updated listings on recurring runs.",
    "version": "1.0",
    "x-build-id": "wrJucBmzAVEQG7mgX"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/trev0n~reed-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-trev0n-reed-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/trev0n~reed-scraper/runs": {
      "post": {
        "operationId": "runs-sync-trev0n-reed-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/trev0n~reed-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-trev0n-reed-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": {
          "keywords": {
            "title": "Search keywords",
            "type": "string",
            "description": "What to search for on reed.co.uk, e.g. \"software developer\", \"registered nurse\" or \"hgv driver\". Leave empty to browse a whole sector or location."
          },
          "additionalKeywords": {
            "title": "Additional keyword searches",
            "type": "array",
            "description": "Run several keyword searches in one go. Results are merged and de-duplicated by job ID.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "A UK town, city, county or postcode, e.g. \"London\", \"Milton Keynes\" or \"SW1A 1AA\"."
          },
          "proximity": {
            "title": "Search radius (miles)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "How far from the location to search. Reed's own default is 10 miles.",
            "default": 10
          },
          "sector": {
            "title": "Sector",
            "enum": [
              "",
              "education",
              "engineering",
              "it",
              "construction-property",
              "law",
              "logistics",
              "accountancy-qualified",
              "accountancy",
              "social-care",
              "admin-secretarial-pa",
              "retail",
              "sales",
              "finance",
              "factory",
              "catering",
              "hr",
              "health",
              "customer-service",
              "marketing",
              "motoring-automotive",
              "general-insurance",
              "strategy-consultancy",
              "estate-agent",
              "recruitment-consultancy",
              "banking",
              "other",
              "graduate-training-internships",
              "fmcg",
              "purchasing",
              "security-safety",
              "charity",
              "media-digital-creative",
              "leisure-tourism",
              "energy",
              "science",
              "training",
              "apprenticeships"
            ],
            "type": "string",
            "description": "Restrict the search to one of Reed's 37 sectors. Leave empty to search every sector.",
            "default": ""
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Paste reed.co.uk search or job-page URLs to scrape them directly instead of building a search. Search URLs are paged through; job URLs are fetched in full.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "contractType": {
            "title": "Contract type",
            "enum": [
              "",
              "permanent",
              "contract",
              "temporary"
            ],
            "type": "string",
            "description": "Permanent, contract or temporary roles only.",
            "default": ""
          },
          "hours": {
            "title": "Hours",
            "enum": [
              "",
              "fullTime",
              "partTime"
            ],
            "type": "string",
            "description": "Full-time or part-time roles only.",
            "default": ""
          },
          "remoteWorkingOption": {
            "title": "Remote jobs only",
            "enum": [
              "",
              "remote"
            ],
            "type": "string",
            "description": "Reed can only filter for fully remote roles. To narrow to hybrid or on-site, leave this empty and use \"Remote types to keep\" below instead.",
            "default": ""
          },
          "postedBy": {
            "title": "Posted by",
            "enum": [
              "",
              "agency",
              "employer"
            ],
            "type": "string",
            "description": "Only ads posted by recruitment agencies, or only ads posted directly by the employer.",
            "default": ""
          },
          "postedWithinDays": {
            "title": "Posted within (days)",
            "minimum": 0,
            "maximum": 14,
            "type": "integer",
            "description": "Reed offers today, 3 days, 1 week and 2 weeks. Any other number is rounded up to the next bucket; anything over 14 days is ignored.",
            "default": 0
          },
          "salaryFrom": {
            "title": "Minimum salary (£)",
            "minimum": 0,
            "type": "integer",
            "description": "Reed's own salary-from filter. Applied by the site before results are returned.",
            "default": 0
          },
          "salaryTo": {
            "title": "Maximum salary (£)",
            "minimum": 0,
            "type": "integer",
            "description": "Reed's own salary-to filter.",
            "default": 0
          },
          "graduate": {
            "title": "Graduate roles only",
            "type": "boolean",
            "description": "Only graduate schemes and entry-level roles Reed tags as graduate.",
            "default": false
          },
          "easyApplyOnly": {
            "title": "Easy-apply roles only",
            "type": "boolean",
            "description": "Only jobs you can apply to without leaving Reed.",
            "default": false
          },
          "visaSponsorshipOnly": {
            "title": "Visa sponsorship only",
            "type": "boolean",
            "description": "Only employers who state they offer visa sponsorship.",
            "default": false
          },
          "hideTrainingJobs": {
            "title": "Hide training courses",
            "type": "boolean",
            "description": "Reed mixes paid training courses into its job results. Turn this on to drop them.",
            "default": false
          },
          "hideSurveyJobs": {
            "title": "Hide survey jobs",
            "type": "boolean",
            "description": "Drop paid-survey listings that appear alongside real vacancies.",
            "default": false
          },
          "maxResults": {
            "title": "Maximum results",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many jobs. Set to 0 for every result the search has — Reed pages all the way to the end, so a whole sector really can be harvested.",
            "default": 100
          },
          "maxPages": {
            "title": "Maximum pages per search",
            "minimum": 0,
            "type": "integer",
            "description": "Extra safety cap. Each page holds 25 jobs. 0 means no page cap.",
            "default": 0
          },
          "includeDetails": {
            "title": "Fetch full job descriptions",
            "type": "boolean",
            "description": "Opens each job page for the complete description, required skills, postcode and exact salary wording. One extra request per job.",
            "default": false
          },
          "descriptionFormat": {
            "title": "Description format",
            "enum": [
              "text",
              "html"
            ],
            "type": "string",
            "description": "Plain text is easier to read and search; original HTML keeps Reed's formatting and links.",
            "default": "text"
          },
          "descriptionMaxLength": {
            "title": "Truncate descriptions to (characters)",
            "minimum": 0,
            "type": "integer",
            "description": "0 keeps the full description.",
            "default": 0
          },
          "detailConcurrency": {
            "title": "Job-page concurrency",
            "minimum": 1,
            "maximum": 15,
            "type": "integer",
            "description": "How many job pages to open at once when full descriptions are switched on.",
            "default": 5
          },
          "useProxyForDetails": {
            "title": "Use the proxy for job pages too",
            "type": "boolean",
            "description": "Off by default — job pages fetch faster and more reliably straight from the actor.",
            "default": false
          },
          "includeKeywords": {
            "title": "Must contain any of these words",
            "type": "array",
            "description": "Keep only jobs whose title, company or description mentions at least one of these.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Must not contain any of these words",
            "type": "array",
            "description": "Drop jobs whose title, company or description mentions any of these.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "remoteTypes": {
            "title": "Remote types to keep",
            "type": "array",
            "description": "Keep only Remote, Hybrid, On-Site or NotSpecified jobs. Applied after scraping, which is how you get hybrid-only results that Reed itself cannot filter for.",
            "items": {
              "type": "string",
              "enum": [
                "Remote",
                "Hybrid",
                "On-Site",
                "NotSpecified"
              ],
              "enumTitles": [
                "Remote",
                "Hybrid",
                "On-Site",
                "Not specified"
              ]
            },
            "default": []
          },
          "minSalary": {
            "title": "Minimum salary on the record (£)",
            "minimum": 0,
            "type": "integer",
            "description": "Drops jobs whose advertised top-of-range salary is below this. Unlike Reed's own filter, this also removes ads with no salary at all.",
            "default": 0
          },
          "excludeTrainingJobs": {
            "title": "Drop training listings from the results",
            "type": "boolean",
            "description": "Removes training listings from the results after scraping, even if Reed still returned them.",
            "default": false
          },
          "maxAgeMinutes": {
            "title": "Maximum age (minutes)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only jobs posted or updated within this many minutes. Finer than Reed's day buckets — use it for near-real-time monitoring.",
            "default": 0
          },
          "compact": {
            "title": "Compact output",
            "type": "boolean",
            "description": "Ten essential fields per job instead of the full record.",
            "default": false
          },
          "excludeEmptyFields": {
            "title": "Drop empty fields",
            "type": "boolean",
            "description": "Removes fields that came back empty, for a leaner dataset.",
            "default": false
          },
          "incrementalMode": {
            "title": "Incremental monitoring",
            "type": "boolean",
            "description": "Remember what previous runs saw and emit only new, updated or reappeared jobs. The first run stores a baseline; later runs typically emit 80-95% fewer records.",
            "default": false
          },
          "stateKey": {
            "title": "Monitoring state key",
            "type": "string",
            "description": "Name the baseline this run compares against. Leave empty to derive one from the search settings.",
            "default": ""
          },
          "emitUnchanged": {
            "title": "Also emit unchanged jobs",
            "type": "boolean",
            "description": "Also emit jobs that have not changed since the previous run. Off by default — emitting them is what monitoring exists to avoid.",
            "default": false
          },
          "emitExpired": {
            "title": "Also emit jobs that disappeared",
            "type": "boolean",
            "description": "Emits a record for every job that was in the baseline but is gone from this run's results.",
            "default": false
          },
          "skipReposts": {
            "title": "Skip reposts",
            "type": "boolean",
            "description": "Drops jobs that are an expired listing re-posted under a new ID.",
            "default": false
          },
          "webhookUrl": {
            "title": "Webhook URL",
            "type": "string",
            "description": "POSTs the run summary and emitted jobs as JSON.",
            "default": ""
          },
          "telegramBotToken": {
            "title": "Telegram bot token",
            "type": "string",
            "description": "Bot token from @BotFather. Stored encrypted."
          },
          "telegramChatId": {
            "title": "Telegram chat ID",
            "type": "string",
            "description": "The chat or channel the Telegram bot should post into.",
            "default": ""
          },
          "discordWebhookUrl": {
            "title": "Discord webhook URL",
            "type": "string",
            "description": "Discord channel webhook. Stored encrypted."
          },
          "slackWebhookUrl": {
            "title": "Slack webhook URL",
            "type": "string",
            "description": "Slack incoming webhook. Stored encrypted."
          },
          "notifyOnlyChanges": {
            "title": "Only notify when something changed",
            "type": "boolean",
            "description": "Stay silent when a monitoring run finds nothing new.",
            "default": true
          },
          "notificationLimit": {
            "title": "Jobs listed per notification",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many individual jobs each notification message lists before it summarises the rest.",
            "default": 10
          },
          "includeRunSummary": {
            "title": "Include the run summary in webhooks",
            "type": "boolean",
            "description": "Attach the run statistics (new, updated, expired counts) to the webhook payload.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "reed.co.uk serves this actor without a proxy, which is the default and the most reliable setting. Apify's shared datacenter proxy pool is rate-limited by reed.co.uk and will cost you blocked requests; if you do need a proxy for a very large harvest, pick RESIDENTIAL with country GB.",
            "default": {
              "useApifyProxy": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}