{
  "openapi": "3.0.1",
  "info": {
    "title": "Totaljobs Scraper - UK Jobs, Salaries & Employers",
    "description": "Scrape UK job listings from Totaljobs.com by keyword, location, filters, or URL. Extract 40+ fields including title, parsed salary range and period, employer, logo, GPS location, skills, employment type, full description, posting date, and apply link.",
    "version": "1.0",
    "x-build-id": "8XKQtTceoDN0W7Bek"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~totaljobs-com-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-totaljobs-com-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/abotapi~totaljobs-com-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-totaljobs-com-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/abotapi~totaljobs-com-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-totaljobs-com-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "How to find jobs: build a search from filters, or paginate URLs you paste.",
            "default": "search"
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Towns, cities, counties, or regions (Search mode). Examples: 'London', 'Manchester', 'Edinburgh', 'Surrey'. One search runs per location. Leave empty for all of the UK.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Keywords",
            "type": "string",
            "description": "Job title, skill, or company to search for. Example: 'nurse', 'java developer', 'project manager'. Leave empty to list all jobs in the location."
          },
          "jobType": {
            "title": "Job type",
            "enum": [
              "any",
              "permanent",
              "contract",
              "temporary",
              "part-time",
              "work-from-home"
            ],
            "type": "string",
            "description": "Contract / working arrangement filter.",
            "default": "any"
          },
          "companyType": {
            "title": "Advertiser type",
            "enum": [
              "any",
              "employer",
              "agency"
            ],
            "type": "string",
            "description": "Restrict to direct employers or recruitment agencies.",
            "default": "any"
          },
          "minSalary": {
            "title": "Minimum salary",
            "minimum": 0,
            "type": "integer",
            "description": "Lowest salary to include. Combined with the salary period below. Leave empty for no minimum."
          },
          "salaryType": {
            "title": "Salary period",
            "enum": [
              "annual",
              "daily",
              "hourly"
            ],
            "type": "string",
            "description": "Unit for the minimum salary filter.",
            "default": "annual"
          },
          "postedWithin": {
            "title": "Posted within (days)",
            "enum": [
              "0",
              "1",
              "3",
              "7",
              "14"
            ],
            "type": "string",
            "description": "Only jobs posted within this many days. Leave as Any time for no date filter.",
            "default": "0"
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "date",
              "salary-desc",
              "salary-asc",
              "distance"
            ],
            "type": "string",
            "description": "Result ordering.",
            "default": "relevance"
          },
          "remote": {
            "title": "Remote only",
            "type": "boolean",
            "description": "Same as job type Work from home.",
            "default": false
          },
          "contractType": {
            "title": "Contract type",
            "enum": [
              "CONTRACT",
              "FREELANCE",
              "TEMPORARY",
              "PART_TIME"
            ],
            "type": "string",
            "description": "CONTRACT, FREELANCE, TEMPORARY and PART_TIME map onto the matching Job type. Job type wins when both are set."
          },
          "excludeSponsored": {
            "title": "Exclude sponsored jobs",
            "type": "boolean",
            "description": "Skip rows the site marks as sponsored. Skipped rows are not pushed and not charged.",
            "default": false
          },
          "urls": {
            "title": "Search URLs",
            "type": "array",
            "description": "Totaljobs.com links to scrape (URL mode): search-result links (location, keyword, job type, company, filtered, sorted or paginated) and single job pages (/job/...). One example of each shape is prefilled. Filter fields above are ignored. A page number in a search link is honoured as the starting point. Unsupported links are skipped with a clear log message.",
            "default": [
              "https://www.totaljobs.com/jobs/in-london",
              "https://www.totaljobs.com/jobs/nurse/in-london",
              "https://www.totaljobs.com/jobs/permanent/in-manchester",
              "https://www.totaljobs.com/jobs/in-london?page=2",
              "https://www.totaljobs.com/jobs/permanent/in-london?salary=30000&salarytypeid=1&postedWithin=7&companytypes=2",
              "https://www.totaljobs.com/jobs/nurse/in-london?sort=2&page=2",
              "https://www.totaljobs.com/jobs/in-south-east",
              "https://www.totaljobs.com/jobs/nurse",
              "https://www.totaljobs.com/jobs/gopuff/in-london?cmpId=1245157&cmp=1",
              "https://www.totaljobs.com/job/delivery-driver-part-time-merton/ocado-job108199737",
              "https://www.totaljobs.com/job/108199737",
              "http://totaljobs.com/jobs/in-london"
            ],
            "items": {
              "type": "string"
            }
          },
          "fetchDetails": {
            "title": "Fetch full job details",
            "type": "boolean",
            "description": "Fetch detail pages to add the full description, GPS coordinates, structured address, employment type, valid-through date, and company profile. Adds ~12 fields. Needs an Apify Residential GB proxy and costs more per job. Off = fast, cheap, 35 listing fields.",
            "default": false
          },
          "maxListings": {
            "title": "Max jobs",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Total jobs to collect across all searches. This is the main limit. Set 0 for unlimited (bounded by Max pages).",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 0,
            "type": "integer",
            "description": "Optional safety limit on pages walked per location/URL (25 jobs per page). Leave empty or set to 0 to walk until the run stops at Max jobs, the site's own last page, or a repeat-page guard, with a built-in ceiling of 1000 pages (25,000 jobs) per search."
          },
          "query": {
            "title": "Query (alias of Keywords)",
            "type": "string",
            "description": "Alias of Keywords. Keywords wins when both are set."
          },
          "location": {
            "title": "Location (alias of Locations)",
            "type": "string",
            "description": "Alias of Locations for a single place, e.g. London."
          },
          "startUrls": {
            "title": "Start URLs (alias of URLs)",
            "type": "array",
            "description": "Alias of URLs. Setting it without a mode switches the run to URL mode.",
            "default": [
              {
                "url": "https://www.totaljobs.com/jobs/in-london"
              },
              {
                "url": "https://www.totaljobs.com/jobs/nurse/in-london"
              },
              {
                "url": "https://www.totaljobs.com/jobs/permanent/in-manchester"
              },
              {
                "url": "https://www.totaljobs.com/jobs/in-london?page=2"
              },
              {
                "url": "https://www.totaljobs.com/jobs/permanent/in-london?salary=30000&salarytypeid=1&postedWithin=7&companytypes=2"
              },
              {
                "url": "https://www.totaljobs.com/jobs/nurse/in-london?sort=2&page=2"
              },
              {
                "url": "https://www.totaljobs.com/jobs/in-south-east"
              },
              {
                "url": "https://www.totaljobs.com/jobs/nurse"
              },
              {
                "url": "https://www.totaljobs.com/jobs/gopuff/in-london?cmpId=1245157&cmp=1"
              },
              {
                "url": "https://www.totaljobs.com/job/delivery-driver-part-time-merton/ocado-job108199737"
              },
              {
                "url": "https://www.totaljobs.com/job/108199737"
              },
              {
                "url": "http://totaljobs.com/jobs/in-london"
              }
            ],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "age": {
            "title": "Age in days (alias of Posted within)",
            "minimum": 0,
            "type": "integer",
            "description": "Rounded up to the nearest supported window (1, 3, 7, 14 days). Values above 14 apply no recency filter."
          },
          "sort": {
            "title": "Sort (alias of Sort by)",
            "enum": [
              "relevance",
              "date",
              "salary_low",
              "salary_high"
            ],
            "type": "string",
            "description": "Used when Sort by is left at its default."
          },
          "maxResults": {
            "title": "Max results (alias of Max jobs)",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Alias of Max jobs. Max jobs wins when both are set."
          },
          "includeDetails": {
            "title": "Include details (alias of Fetch details)",
            "type": "boolean",
            "description": "Alias of Fetch details."
          },
          "descriptionFormat": {
            "title": "Description format",
            "enum": [
              "html",
              "text",
              "markdown"
            ],
            "type": "string",
            "description": "With Fetch details: html keeps every description field, text keeps descriptionText only, markdown keeps descriptionMarkdown only.",
            "default": "html"
          },
          "descriptionMaxLength": {
            "title": "Description max length",
            "minimum": 0,
            "type": "integer",
            "description": "Truncate description fields to this many characters. 0 keeps the full text.",
            "default": 0
          },
          "outputFields": {
            "title": "Output fields",
            "type": "array",
            "description": "Keep only these top-level fields in each row.",
            "items": {
              "type": "string"
            }
          },
          "compact": {
            "title": "Compact rows",
            "type": "boolean",
            "description": "Keep only the core fields (ignored when Output fields is set).",
            "default": false
          },
          "excludeEmptyFields": {
            "title": "Exclude empty fields",
            "type": "boolean",
            "description": "Drop null, empty text, empty list and empty object values from each row.",
            "default": false
          },
          "proxy": {
            "title": "Proxy",
            "type": "object",
            "description": "Connection settings. totaljobs.com accepts Apify Residential with country GB most reliably (the default); listing pages occasionally work on Datacenter but it is frequently refused, and full job details (fetchDetails) always need Residential GB. Datacenter and non-GB residential are refused on job pages."
          },
          "proxyConfiguration": {
            "title": "Proxy (alias)",
            "type": "object",
            "description": "Alias of Proxy. Proxy wins when both are set."
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run (delta)",
            "type": "string",
            "description": "Optional. ID of a previous run of this actor (or a dataset ID). Jobs already in that dataset are skipped, so this run returns only NEW jobs (a delta). Combine both runs' datasets for the full set. Max jobs then counts only the new jobs. For recurring daily monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns all matching jobs as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED jobs. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those jobs returned (and billed). State is kept separately for each distinct search/filter setup (or by State key below).",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from your search/filter settings — different searches then never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged jobs (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return jobs that have not changed since the last run, marked UNCHANGED. This returns — and bills — extra rows you already have, so leave it off unless you specifically want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired jobs (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return jobs that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search — not when Max jobs or Max pages capped it, or when Resume was used. This returns — and bills — extra synthetic rows.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Optional. Field names that must not make a job count as UPDATED, for example `salary` or `location.postalCode`. A plain name is ignored wherever it appears, including inside nested objects; a dotted path ignores one nested location. Ignored fields stay in the output and are only left out of the comparison and `changedFields`. Rotating or ad-placement fields are already ignored by default.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}