{
  "openapi": "3.0.1",
  "info": {
    "title": "Djinni Jobs Scraper",
    "description": "Scrape tech job listings from Djinni.co by keyword, location, experience, English level, and remote status. Get titles, companies, salaries, descriptions, and required skills, with incremental change monitoring. Export as JSON, CSV, or Excel.",
    "version": "1.0",
    "x-build-id": "dTieMncAEcTQ0l962"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/parsebird~djinni-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-parsebird-djinni-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/parsebird~djinni-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-parsebird-djinni-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/parsebird~djinni-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-parsebird-djinni-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",
        "properties": {
          "query": {
            "title": "Search query",
            "type": "array",
            "description": "Keyword(s) to search for, such as python, java, or devops. Add several entries to run a multi-query batch. Leave empty to browse all tech jobs.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location",
            "type": "array",
            "description": "City, country, or region to keep, such as Ukraine, Poland, or Kyiv. Matched against the listing's location text after fetching. Add several entries for a multi-location filter.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Direct Djinni search URLs (https://djinni.co/jobs/keyword-python/) or job detail URLs (https://djinni.co/jobs/820617-senior-python-engineer/). When set, these are scraped in addition to the query above.",
            "items": {
              "type": "string"
            }
          },
          "experienceLevel": {
            "title": "Years of experience",
            "type": "array",
            "description": "Keep only listings that ask for exactly this many years of experience. Select several for a multi-value filter. Applied after fetching.",
            "items": {
              "type": "string",
              "enum": [
                "0",
                "1",
                "2",
                "3",
                "4",
                "5",
                "6",
                "7",
                "8",
                "9",
                "10"
              ],
              "enumTitles": [
                "No experience",
                "1 year",
                "2 years",
                "3 years",
                "4 years",
                "5 years",
                "6 years",
                "7 years",
                "8 years",
                "9 years",
                "10+ years"
              ]
            },
            "default": []
          },
          "englishLevel": {
            "title": "English level",
            "type": "array",
            "description": "Keep only listings requiring one of these English levels (CEFR). Applied after fetching.",
            "items": {
              "type": "string",
              "enum": [
                "A1",
                "A2",
                "B1",
                "B2",
                "C1",
                "C2"
              ],
              "enumTitles": [
                "A1 - Beginner",
                "A2 - Pre-Intermediate",
                "B1 - Intermediate",
                "B2 - Upper-Intermediate",
                "C1 - Advanced",
                "C2 - Proficient"
              ]
            },
            "default": []
          },
          "isRemote": {
            "title": "Full-remote jobs only",
            "type": "boolean",
            "description": "Keep only full-remote listings and drop office and hybrid roles.",
            "default": false
          },
          "employmentType": {
            "title": "Employment type",
            "type": "array",
            "description": "Keep only listings with one of these employment types. Applied after fetching.",
            "items": {
              "type": "string",
              "enum": [
                "FULL_TIME",
                "PART_TIME"
              ],
              "enumTitles": [
                "Full-time",
                "Part-time"
              ]
            },
            "default": []
          },
          "companyName": {
            "title": "Company name",
            "type": "array",
            "description": "Keep only listings whose company name contains one of these values (case-insensitive). Applied after fetching.",
            "items": {
              "type": "string"
            }
          },
          "domain": {
            "title": "Domain / industry",
            "type": "array",
            "description": "Keep only listings whose industry contains one of these values, such as fintech, gamedev, or healthcare. Applied after fetching.",
            "items": {
              "type": "string"
            }
          },
          "salaryFrom": {
            "title": "Salary from",
            "minimum": 0,
            "type": "integer",
            "description": "Drop listings whose published salary range is entirely below this amount (USD). Listings without a published salary are kept. 0 disables the filter.",
            "default": 0
          },
          "salaryTo": {
            "title": "Salary to",
            "minimum": 0,
            "type": "integer",
            "description": "Drop listings whose published salary range is entirely above this amount (USD). Listings without a published salary are kept. 0 disables the filter.",
            "default": 0
          },
          "postedWithinDays": {
            "title": "Posted within days",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only listings published within this many days. 0 allows any age.",
            "default": 0
          },
          "includeKeywords": {
            "title": "Include keywords",
            "type": "object",
            "description": "Require at least one of these keywords in the title and/or description. Example: {\"keywords\": [\"react\", \"node\"], \"matchTitle\": true, \"matchDescription\": true}."
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "object",
            "description": "Drop listings that contain any of these keywords. Same shape as Include keywords."
          },
          "scrapeDetails": {
            "title": "Open each job page",
            "type": "boolean",
            "description": "Also open every job page to collect the full required-languages list, the company profile URL, and the exact publish date. Slower and doubles the number of requests. The search results already contain the full job description.",
            "default": false
          },
          "compact": {
            "title": "Compact output",
            "type": "boolean",
            "description": "Return only the core fields per job, ideal for feeding an LLM, an AI agent, or an MCP data source without token overhead.",
            "default": false
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum total job listings to return (0 = unlimited). This is the primary cost control - the actor charges per emitted record. Start small and raise it once you have checked the search.",
            "default": 25
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum search-result pages to scrape per query or start URL (15 jobs per page). A defensive bound - Max results is the primary cap.",
            "default": 5
          },
          "incrementalMode": {
            "title": "Incremental / monitoring mode",
            "type": "boolean",
            "description": "Compare this run with prior runs that use the same state key and return only the jobs that are new or whose tracked content changed.",
            "default": false
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "A stable name that separates one watchlist or schedule from another.",
            "default": "default"
          },
          "emitUnchanged": {
            "title": "Emit unchanged jobs",
            "type": "boolean",
            "description": "Also return jobs that were seen in a previous run and have not changed (changeType UNCHANGED).",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired jobs",
            "type": "boolean",
            "description": "Also return jobs that were present in a previous run but have now disappeared from the search (changeType EXPIRED).",
            "default": false
          },
          "skipReposts": {
            "title": "Skip detected reposts",
            "type": "boolean",
            "description": "Drop listings detected as reposts of a previously expired job with identical content.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Djinni serves fine over Apify Proxy. Automatic proxy is enabled by default; switch to residential only if you hit rate limiting on very large runs.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}