{
  "openapi": "3.0.1",
  "info": {
    "title": "Welcome to the Jungle Scraper: WTJ Tech Jobs FR/EU + Salaries",
    "description": "Scrape Welcome to the Jungle jobs by keyword, country, contract, city, remote. Get salary, native tech stack, benefits, apply URL + ATS vendor, company profile, and — uniquely — the employer's application-form screening questions. Optional AI fit-scoring + SIREN. $0.50/1K jobs.",
    "version": "2.0",
    "x-build-id": "7g8HUxTQcaPxmbZdN"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/dltik~welcome-to-the-jungle-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-dltik-welcome-to-the-jungle-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/dltik~welcome-to-the-jungle-scraper/runs": {
      "post": {
        "operationId": "runs-sync-dltik-welcome-to-the-jungle-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/dltik~welcome-to-the-jungle-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-dltik-welcome-to-the-jungle-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": "array",
            "description": "List of keywords to search jobs (e.g. 'data scientist', 'react developer'). Leave empty to scrape ALL jobs matching other filters.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "contractTypes": {
            "title": "Contract types",
            "type": "array",
            "description": "Filter by contract types: full_time, internship, apprenticeship, temporary, freelance, vie. Leave empty for all.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "ISO 3166-1 alpha-2 country code (FR, US, GB, DE, ES, IT, BE, NL, etc.). Use 'ALL' for any country.",
            "default": "FR"
          },
          "cities": {
            "title": "Cities (optional)",
            "type": "array",
            "description": "Filter by city names (e.g. ['Paris', 'Lyon']). Case-insensitive match on office city.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "remote": {
            "title": "Remote policy",
            "enum": [
              "any",
              "full_remote",
              "punctual",
              "partial",
              "no_remote"
            ],
            "type": "string",
            "description": "Filter by remote policy.",
            "default": "any"
          },
          "experienceLevels": {
            "title": "Experience levels (optional)",
            "type": "array",
            "description": "Filter by experience: junior, intermediate, senior, expert.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "language": {
            "title": "WTJ language",
            "enum": [
              "fr",
              "en"
            ],
            "type": "string",
            "description": "Welcome to the Jungle language version. fr (default) for France/EU, en for international.",
            "default": "fr"
          },
          "enrichDetails": {
            "title": "Enrich with full job details",
            "type": "boolean",
            "description": "Fetch each job's full detail + company profile via the WTJ API: full description, candidate profile, native skills/tools tech stack, benefits, recruitment process, apply URL + detected ATS vendor, and the employer's equality index / ESG labels / sectors / website. One company-profile call per unique employer (cached). Recommended; bundled in the base job price. Turn off for a faster listing-only run.",
            "default": true
          },
          "enrichCompany": {
            "title": "Enrich employer with company data (SIREN)",
            "type": "boolean",
            "description": "For each job, resolve the employer name to its French SIREN and attach official-register intelligence: legal name, size (headcount range), sector (NAF), category (PME/ETI/GE), age, and administrative status (active vs. ceased = red flag). Free official register, no key — data no WTJ-only scraper can produce. Billed as a separate 'company-enriched' event per resolved employer (mostly French companies).",
            "default": false
          },
          "analyzeJobs": {
            "title": "AI analysis (premium)",
            "type": "boolean",
            "description": "Enrich each job with an AI 'ai' object: plain-language summary, inferred seniority, remote (onsite/hybrid/remote), truly-required skills, and red flags. Add 'Candidate profile' below to also get a 0-100 fit_score + recommended action (apply/maybe/skip) per job — turns a long result list into a ranked shortlist. Requires a paid Apify plan; billed as a separate 'job-analyzed' event. If not on a paid plan the scrape still runs without analysis.",
            "default": false
          },
          "onlyWithApplicationQuestions": {
            "title": "Only jobs with application questions",
            "type": "boolean",
            "description": "Keep only jobs whose employer added screening questions to the Welcome to the Jungle apply form (the questions you must answer after clicking Apply). Forces detail enrichment. Great for candidates preparing answers and recruiters benchmarking competitors' screening questions.",
            "default": false
          },
          "candidateProfile": {
            "title": "Candidate profile (for AI fit scoring)",
            "type": "string",
            "description": "One or two sentences describing the candidate (or the role you're sourcing for), e.g. 'Data engineer Python/dbt 4 ans, cherche CDI remote, Paris' or 'Recrute un product manager senior fintech, Lyon'. When set (and AI analysis is on), each job gets a fit_score (0-100), a one-line reason, and an apply/maybe/skip action. Leave empty to get summaries only."
          },
          "incrementalMode": {
            "title": "Incremental mode (only new/changed jobs)",
            "type": "boolean",
            "description": "On each run, compare against the previous run's baseline (stored per 'State key') and tag each job NEW / UPDATED / UNCHANGED. By default only NEW + UPDATED are emitted and charged — 70-95% cheaper on recurring monitoring. First run builds the baseline (everything is NEW).",
            "default": false
          },
          "includeUnchanged": {
            "title": "Include unchanged jobs",
            "type": "boolean",
            "description": "In incremental mode, also emit (and charge) jobs whose content is unchanged since the last run. Off by default.",
            "default": false
          },
          "includeExpired": {
            "title": "Include expired markers",
            "type": "boolean",
            "description": "In incremental mode, append lightweight EXPIRED records for jobs that were in the previous baseline but are gone this run. These markers are not charged.",
            "default": false
          },
          "stateKey": {
            "title": "State key (incremental baseline)",
            "type": "string",
            "description": "Name of the baseline for incremental mode, so different saved searches keep separate histories under one actor. Use a stable string per search (e.g. 'data-eng-paris'). Defaults to 'default'."
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum number of jobs to extract. WTJ Algolia exposes up to 1000 results per query. Aliases accepted: 'limit', 'max'. Each result charged at the per-event price — start small to validate output.",
            "default": 20
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}