{
  "openapi": "3.0.1",
  "info": {
    "title": "NIJobs Scraper - Jobs, Salaries, Skills & Locations",
    "description": "Scrape NIJobs.com listings across Northern Ireland by keyword, location, salary, posted date, or URL. Extract 60+ fields including title, company, salary, skills, description, employment type, industry, GPS, address, dates, and apply URL.",
    "version": "1.0",
    "x-build-id": "zBE4ZmIxvxPt3Is1w"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~nijobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-nijobs-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~nijobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-nijobs-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~nijobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-nijobs-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": "Search mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "search = build searches from keywords + location + filters. url = paste one or more nijobs results-page URLs.",
            "default": "search"
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Job titles or keywords to search, e.g. Software Developer, Accountant, Nurse. Each keyword runs its own search. Only applies when mode = search.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "Optional town, city or county in Northern Ireland to narrow the search, e.g. Belfast, Londonderry, County Antrim. Leave empty to search all of Northern Ireland. Only applies when mode = search."
          },
          "radius": {
            "title": "Search radius (miles)",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Widen a location search to jobs within this many miles. Values snap to the nearest of 5, 10, 20 or 30 miles (maximum 30). Only applies when mode = search and a location is set."
          },
          "postedWithin": {
            "title": "Posted within",
            "enum": [
              "any",
              "1",
              "3",
              "7",
              "14"
            ],
            "type": "string",
            "description": "Only return jobs posted within this many days. Only applies when mode = search.",
            "default": "any"
          },
          "minSalary": {
            "title": "Minimum salary",
            "minimum": 0,
            "type": "integer",
            "description": "Only return jobs at or above this salary. Read together with Salary period (annual / daily / hourly). Only applies when mode = search."
          },
          "salaryPeriod": {
            "title": "Salary period",
            "enum": [
              "annual",
              "daily",
              "hourly"
            ],
            "type": "string",
            "description": "Which salary rate the Minimum salary value refers to. Only applies when mode = search and Minimum salary is set.",
            "default": "annual"
          },
          "sortBy": {
            "title": "Sort order",
            "enum": [
              "relevance",
              "date",
              "salary-desc",
              "salary-asc"
            ],
            "type": "string",
            "description": "Result ordering. Only applies when mode = search.",
            "default": "relevance"
          },
          "urls": {
            "title": "Results-page URLs",
            "type": "array",
            "description": "Paste one or more nijobs results-page URLs (e.g. https://www.nijobs.com/jobs/software-developer/in-belfast). Multi-URL supported. The keyword/location/filter fields above are ignored in this mode. Left untouched, URL mode scrapes one example of each supported URL shape.",
            "default": [
              "https://www.nijobs.com/jobs/software-developer",
              "https://www.nijobs.com/jobs/software-developer/in-belfast",
              "https://www.nijobs.com/jobs/software-developer/in-county-antrim",
              "https://www.nijobs.com/jobs/in-belfast",
              "https://www.nijobs.com/jobs/accountancy",
              "https://www.nijobs.com/jobs/software-developer/in-belfast?page=2",
              "https://www.nijobs.com/jobs/software-developer?sort=2",
              "https://www.nijobs.com/jobs/software-developer?postedWithin=7",
              "https://www.nijobs.com/jobs/software-developer?salary=40000&salarytypeid=1",
              "https://www.nijobs.com/jobs/software-developer/in-belfast?sort=2&postedWithin=7",
              "https://www.nijobs.com/jobs/software-developer/in-belfast?page=2&sort=2",
              "https://www.nijobs.com/jobs/accountancy/in-belfast/",
              "http://nijobs.com/jobs/marketing",
              "https://www.nijobs.com/jobs/permanent/software-developer",
              "https://www.nijobs.com/jobs/mcs-group?cmpId=1216528&cmp=1"
            ],
            "items": {
              "type": "string"
            }
          },
          "fetchDetails": {
            "title": "Fetch full detail from each job page",
            "type": "boolean",
            "description": "Fetch each job page to add the full job description, geo coordinates, full postal address, employment type, industry, work type / contract type, validity window and the apply URL. Adds one request per job. Leave on for the richest output.",
            "default": true
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 1,
            "type": "integer",
            "description": "Optional safety stop on how many result pages to read per keyword/URL. This does NOT cap the run: leave it empty for unlimited pages and the run is bounded solely by Max items. Set a value only if you also want a per-search page ceiling."
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "The run's single hard cap: maximum total jobs across all searches. Defaults to 20 (also when the field is omitted through the API). Set 0 for unlimited. This is the only default limit; Max pages is unlimited by default and defers to this.",
            "default": 20
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Connection used for requests. The default works on any Apify plan, including the free tier."
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large pull without returning or charging for jobs already collected there. For recurring monitoring of the same search, use Incremental changes below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes",
            "type": "boolean",
            "description": "For recurring runs, return only NEW, UPDATED and REAPPEARED jobs; jobs unchanged since the last run are not returned or billed. Each job is compared on every field except search position, scrape time, relative posting date, travel time, fingerprint count, backfill flag, new-job flag and list page URL (they stay in the output but never count as a change) and the order of labels. Each row gets changeType, changedFields, firstSeenAt and lastSeenAt; outside incremental mode these four fields are empty. The baseline is kept per State key; changing the search settings or Fetch full job details starts a new baseline unless State key is set.",
            "default": false
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "Incremental mode only. Optional name for this campaign's saved baseline. Leave empty to derive it from the search settings, so each distinct search keeps its own baseline."
          },
          "emitUnchanged": {
            "title": "Emit unchanged",
            "type": "boolean",
            "description": "Incremental mode only. Also return (and bill as normal rows) jobs whose values did not change.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired",
            "type": "boolean",
            "description": "Incremental mode only. Return an EXPIRED row for jobs no longer found (billed like any returned row). Only after a complete scan: a Max items or Max pages cut, a pasted URL that starts at page 2 or later, an early stop or a failed page disables it.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Incremental mode only. Extra field names (dotted for nested, e.g. address.city) that never mark a job as UPDATED and are left out of changedFields; they stay in the output. positionOnPage, positionAbsolute, scrapedAt, periodPostedDate, travelTime, fingerprintCount and isBackfilled are always ignored.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}