{
  "openapi": "3.0.1",
  "info": {
    "title": "Jora Jobs Scraper - Jobs, Salaries, Companies & Locations",
    "description": "Scrape Jora.com job listings across supported countries by keyword, filters, or URL. Extract full job descriptions, salaries, work types, companies, locations, and structured data ready for connector export.",
    "version": "1.0",
    "x-build-id": "vmXuslVOvq5gnIXho"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~jora-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-jora-jobs-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~jora-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-jora-jobs-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~jora-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-jora-jobs-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": "Choose search mode to build Jora searches from filters, or URL mode to start from existing Jora search/detail URLs.",
            "default": "search"
          },
          "searches": {
            "title": "Searches",
            "type": "array",
            "description": "One or more keyword/location searches. Each search can target a different country.",
            "items": {
              "type": "object",
              "required": [
                "country"
              ],
              "properties": {
                "keywords": {
                  "title": "Keywords",
                  "type": "string",
                  "description": "Job keywords, for example software engineer. Leave empty to search by location only.",
                  "editor": "textfield"
                },
                "location": {
                  "title": "Location",
                  "type": "string",
                  "description": "Location text accepted by Jora, for example Sydney, NSW or Auckland.",
                  "editor": "textfield"
                },
                "country": {
                  "title": "Country",
                  "type": "string",
                  "description": "Jora country site to search.",
                  "editor": "select",
                  "enum": [
                    "au",
                    "nz",
                    "sg",
                    "hk",
                    "my",
                    "id",
                    "us",
                    "uk",
                    "ca"
                  ],
                  "enumTitles": [
                    "Australia",
                    "New Zealand",
                    "Singapore",
                    "Hong Kong",
                    "Malaysia",
                    "Indonesia",
                    "United States",
                    "United Kingdom",
                    "Canada"
                  ],
                  "default": "au"
                }
              }
            }
          },
          "postedWithin": {
            "title": "Posted within",
            "enum": [
              "anytime",
              "24h",
              "7d",
              "14d",
              "30d"
            ],
            "type": "string",
            "description": "Only return jobs listed within this time window.",
            "default": "anytime"
          },
          "workType": {
            "title": "Work type",
            "enum": [
              "any",
              "full_time",
              "part_time",
              "casual_temporary",
              "contract",
              "internship",
              "permanent",
              "freelance",
              "traineeship"
            ],
            "type": "string",
            "description": "Filter by Jora work type.",
            "default": "any"
          },
          "quickApply": {
            "title": "Quick apply only",
            "type": "boolean",
            "description": "Return only jobs marked as quick apply by Jora.",
            "default": false
          },
          "sort": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "date"
            ],
            "type": "string",
            "description": "Sort search results by Jora relevance or newest listed.",
            "default": "relevance"
          },
          "distanceKm": {
            "title": "Search radius (km)",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "Optional radius around the location. Leave empty to use Jora's default."
          },
          "salaryMin": {
            "title": "Minimum salary",
            "minimum": 0,
            "type": "integer",
            "description": "Optional minimum salary filter."
          },
          "urls": {
            "title": "Jora URLs",
            "type": "array",
            "description": "Multi-URL supported: keyword/location search paths, /jobs?q=&l= and /j?q=&l= searches, and job detail links. Search filters are ignored. Leave the field out and these examples are scraped. Search result URLs honor the page number in the pasted URL. Detail URLs save that job only.",
            "default": [
              "https://au.jora.com/software-engineer-jobs-in-Sydney-NSW",
              "https://au.jora.com/Software-Engineer-jobs-in-Sydney-NSW?p=2",
              "https://au.jora.com/Software-Engineer-jobs",
              "https://au.jora.com/jobs-in-Sydney-NSW",
              "https://au.jora.com/Developer-jobs-in-Sydney-NSW?st=date",
              "https://au.jora.com/Developer-jobs-in-Sydney-NSW?sa=90000&qa=y&r=25",
              "https://au.jora.com/job/Software-Engineer-0155ab88203c8731b751b7006d496e7f"
            ],
            "items": {
              "type": "string"
            }
          },
          "fetchDetails": {
            "title": "Fetch full job details",
            "type": "boolean",
            "description": "When enabled, adds full description, apply URL, and detail-only fields. Detail records use the detail-enrichment charge event.",
            "default": true
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of matching jobs to save. A run can return fewer rows when the selected search, URL, and filters match fewer current jobs. Use 0 for unlimited.",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum search result pages per search URL. Leave empty to walk every result page; maxItems remains the main cap."
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Residential proxy is selected by default because Jora can return empty responses from cloud datacenter connections.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "AU"
            }
          },
          "proxyConfiguration": {
            "title": "Proxy configuration (alias of Proxy)",
            "type": "object",
            "description": "Same as Proxy; used while Proxy is still the Residential AU default."
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run (optional)",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a full-catalogue walk across separate runs. Jobs already collected there (matched by jobId) are skipped, so this run only saves the new ones. Use this after an interrupted run, or to keep growing one big catalogue pull. For recurring daily/weekly monitoring of the same search, use Incremental mode below instead — the two are different things and normally not combined."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily/weekly monitoring of the same search. The first run returns every matching job as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED jobs — unchanged ones are skipped (and not billed). State is kept separately per search scope (mode, searches/URLs, and filters); use State key below to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "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 the search scope (searches/URLs and filters) — 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 items/Max pages capped it, the site blocked a page, or Resume was used. This returns — and bills — extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Incremental mode only. Field names (for example abstract or salary; a dotted path like a.b reaches nested fields) whose changes should NOT make a job UPDATED. The fields stay in the output and are never removed. Page position, rank, the search total, the scrape time, the tracking links and the relative posting age are always ignored. The job id can never be ignored. Leave empty to compare everything else.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify Settings API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write/digest. 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
          },
          "startUrl": {
            "title": "Start URL (alias of Jora URLs)",
            "type": "string",
            "description": "A single Jora URL. Same as putting one link in Jora URLs; switches to URL mode when Mode is not set."
          },
          "keyword": {
            "title": "Keyword (alias of Searches)",
            "type": "string",
            "description": "Job keyword. Builds one search when Searches is empty."
          },
          "location": {
            "title": "Location (alias of Searches)",
            "type": "string",
            "description": "Location for the keyword search, for example Sydney, NSW."
          },
          "country": {
            "title": "Country (alias of Searches country)",
            "type": "string",
            "description": "Jora country site for the keyword search: a code (au, nz, sg, hk, my, id, us, uk, ca) or a label such as Australia. Defaults to au."
          },
          "posted_date": {
            "title": "Posted date (alias of Posted within)",
            "type": "string",
            "description": "anytime, 24h, 7d, 14d or 30d (plain forms such as today, week or month also work). Used while Posted within is anytime."
          },
          "results_wanted": {
            "title": "Results wanted (alias of Max items)",
            "minimum": 0,
            "type": "integer",
            "description": "Same as Max items; used while Max items is still 20."
          },
          "max_pages": {
            "title": "Max pages (alias of Max pages per search)",
            "minimum": 0,
            "type": "integer",
            "description": "Same as Max pages; used when Max pages is not set."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}