{
  "openapi": "3.0.1",
  "info": {
    "title": "Welcome to the Jungle Jobs Scraper - WTTJ Job Ads API",
    "description": "Use this to get job ads from Welcome to the Jungle. Input: keywords, countries, cities, contract, remote, profession filters, company names or WTTJ URLs. One result = one job: title, company, size, sector, location, salary, contract, remote, date, URL; optional full description. $0.80 per 1,000.",
    "version": "1.0",
    "x-build-id": "32t5jPZcy9z1ZvfDW"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rel8ble~welcome-to-the-jungle-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rel8ble-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/rel8ble~welcome-to-the-jungle-scraper/runs": {
      "post": {
        "operationId": "runs-sync-rel8ble-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/rel8ble~welcome-to-the-jungle-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-rel8ble-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": {
          "searchQueries": {
            "title": "Search keywords",
            "type": "array",
            "description": "Optional. Job keywords as typed into the Welcome to the Jungle search box, one per line: \"data analyst\", \"product manager\", \"commercial\", \"python\". Matches job titles, summaries and company names. Each keyword is one search and returns up to maxItems jobs. Leave empty to list all jobs matching the filters below. Give at least one of searchQueries, a filter, companies or startUrls.",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "Optional. Countries of the job office, one per line, as two-letter codes (\"FR\", \"US\", \"GB\", \"CA\", \"DE\", \"ES\") or English names (\"France\", \"United Kingdom\"). Several = jobs in any of them. Empty = every country (about two thirds of all jobs are in France).",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Cities or regions",
            "type": "array",
            "description": "Optional. Cities, regions or departments as the site writes them, one per line: \"Paris\", \"Lyon\", \"London\", \"New York\", \"Ile-de-France\", \"Hauts-de-Seine\". Matching is exact on the name (case does not matter), several = jobs in any of them. A name the site does not use returns 0 jobs.",
            "items": {
              "type": "string"
            }
          },
          "contractTypes": {
            "title": "Contract types",
            "type": "array",
            "description": "Optional. Keep only these contract types: any of \"full_time\", \"part_time\", \"temporary\", \"internship\", \"apprenticeship\", \"freelance\", \"vie\", \"graduate_program\", \"volunteer\", \"idv\", \"other\". \"full_time\" is a permanent contract (CDI), \"temporary\" a fixed-term one (CDD). Empty = all.",
            "items": {
              "type": "string",
              "enum": [
                "full_time",
                "part_time",
                "temporary",
                "internship",
                "apprenticeship",
                "freelance",
                "vie",
                "graduate_program",
                "volunteer",
                "idv",
                "other"
              ],
              "enumTitles": [
                "Permanent / full-time",
                "Part-time",
                "Fixed-term / temporary",
                "Internship",
                "Apprenticeship / work-study",
                "Freelance",
                "VIE (international volunteer)",
                "Graduate program",
                "Volunteer",
                "IDV",
                "Other"
              ]
            }
          },
          "remote": {
            "title": "Remote policy",
            "type": "array",
            "description": "Optional. Keep only these remote policies: any of \"fulltime\" (full remote), \"partial\" (hybrid), \"punctual\" (occasional remote), \"no\" (on-site). Use [\"fulltime\"] for fully remote jobs. Empty = all, including the many ads that do not say.",
            "items": {
              "type": "string",
              "enum": [
                "fulltime",
                "partial",
                "punctual",
                "no"
              ],
              "enumTitles": [
                "Full remote",
                "Hybrid (partial remote)",
                "Occasional remote",
                "No remote"
              ]
            }
          },
          "professions": {
            "title": "Professions",
            "type": "array",
            "description": "Optional. Job families, one per line, by English name. One of the 20 categories: \"Agriculture & Agri-food\", \"Business & Finance\", \"Communication & Marketing & Advertising\", \"Construction\", \"Consulting & Strategy\", \"Craftsmanship and manual labor\", \"Culture & Arts\", \"Education\", \"Fashion\", \"Healthcare\", \"Hospitality\", \"HR / People\", \"Legal\", \"Maintenance & Repair\", \"Project / Product Management\", \"Research & Development\", \"Sales & Customer Service\", \"Security & Defense\", \"Tech & Engineering\", \"Transport & Logistics\"; or a sub-category as \"Category > Sub-category\", e.g. \"Tech & Engineering > Software & Web Development\", \"Business & Finance > Accounting\". Several = any of them. Empty = all.",
            "items": {
              "type": "string"
            }
          },
          "sectors": {
            "title": "Company sectors",
            "type": "array",
            "description": "Optional. Industry of the hiring company, one per line, by English name. One of the 20 industries: \"Advertising / Marketing / Agency\", \"Architecture\", \"Banking / Insurance / Finance\", \"Consulting / Audit\", \"Corporate Services\", \"Culture / Media / Entertainment\", \"Distribution\", \"Education / Training / Recruitment\", \"Engineering\", \"Fashion / Luxury / Beauty / Lifestyle\", \"Food and Beverage\", \"Health / Social / Environment\", \"Hotel / Tourism / Leisure\", \"Industry\", \"Legal / Law\", \"Mobility / Transport\", \"Nonprofit / Association\", \"Public Administration\", \"Real Estate\", \"Tech\"; or a sector as \"Industry > Sector\", e.g. \"Tech > SaaS / Cloud Services\". Several = any of them. Empty = all.",
            "items": {
              "type": "string"
            }
          },
          "experienceLevels": {
            "title": "Experience required",
            "type": "array",
            "description": "Optional. Minimum experience the ad asks for, in years: any of \"0-1\", \"1-3\", \"3-5\", \"5-10\", \"10+\". Ads that do not state any experience (about half) are left out when this is set. Empty = all.",
            "items": {
              "type": "string",
              "enum": [
                "0-1",
                "1-3",
                "3-5",
                "5-10",
                "10+"
              ],
              "enumTitles": [
                "Less than 1 year",
                "1 to 3 years",
                "3 to 5 years",
                "5 to 10 years",
                "10 years or more"
              ]
            }
          },
          "educationLevels": {
            "title": "Education required",
            "type": "array",
            "description": "Optional. Education level the ad asks for (French scale: bac_3 = bachelor, bac_5 = master): any of \"no_diploma\", \"cap\", \"bep\", \"bac\", \"bac_1\", \"bac_2\", \"bac_3\", \"bac_4\", \"bac_5\", \"phd\". Ads without a stated level are left out when this is set. Empty = all.",
            "items": {
              "type": "string",
              "enum": [
                "no_diploma",
                "cap",
                "bep",
                "bac",
                "bac_1",
                "bac_2",
                "bac_3",
                "bac_4",
                "bac_5",
                "phd"
              ],
              "enumTitles": [
                "No diploma required",
                "CAP (vocational certificate)",
                "BEP (vocational diploma)",
                "Baccalaureate (high school)",
                "Bac+1",
                "Bac+2 (associate / BTS)",
                "Bac+3 (bachelor's)",
                "Bac+4",
                "Bac+5 (master's)",
                "PhD / doctorate"
              ]
            }
          },
          "jobLanguages": {
            "title": "Language of the job ad",
            "type": "array",
            "description": "Optional. Two-letter language codes of the ad text, one per line: \"en\", \"fr\", \"de\", \"es\", \"it\", \"pt\", \"nl\". Use [\"en\"] for English-language ads only. Empty = all.",
            "items": {
              "type": "string"
            }
          },
          "companySizes": {
            "title": "Company size (employees)",
            "type": "array",
            "description": "Optional. Headcount of the hiring company: any of \"1-15\", \"16-50\", \"51-250\", \"251-2000\", \"2000+\". Empty = all.",
            "items": {
              "type": "string",
              "enum": [
                "1-15",
                "16-50",
                "51-250",
                "251-2000",
                "2000+"
              ],
              "enumTitles": [
                "1-15 employees",
                "16-50 employees",
                "51-250 employees",
                "251-2,000 employees",
                "More than 2,000 employees"
              ]
            }
          },
          "companies": {
            "title": "Companies",
            "type": "array",
            "description": "Optional. Only jobs at these companies, one per line: a company name (\"Doctolib\", \"Back Market\"), its slug on the site (\"back-market\") or its company page URL. Names are looked up on the site; the run log shows which company each name matched. With no keywords, returns every open job of these companies.",
            "items": {
              "type": "string"
            }
          },
          "postedWithinDays": {
            "title": "Posted within (days)",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "Optional. Only jobs published in the last N days, integer >= 0: 1 = the last 24 hours, 7 = last week. 0 (default) = any date. Use 1 on a daily schedule to collect only new jobs.",
            "default": 0
          },
          "salaryMin": {
            "title": "Minimum yearly salary",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Lowest yearly salary to include, as a plain number in the currency of the ad (e.g. 50000). Uses the yearly minimum the site computes from the published range, so ads without a salary (about two thirds) are left out when this is set. Combine with salaryCurrency to compare like with like. 0 (default) = no minimum.",
            "default": 0
          },
          "salaryCurrency": {
            "title": "Salary currency",
            "enum": [
              "",
              "EUR",
              "USD",
              "GBP"
            ],
            "type": "string",
            "description": "Optional. Keep only ads whose salary is in this currency: \"EUR\", \"USD\" or \"GBP\". Empty (default) = any currency, including ads without a salary.",
            "default": ""
          },
          "language": {
            "title": "Output language",
            "enum": [
              "en",
              "fr",
              "es",
              "cs",
              "sk"
            ],
            "type": "string",
            "description": "Optional. Language of the site version to read: sets the language of profession names, sectors, benefits and skills, and of the job and company URLs. The ad text itself stays in the language it was written in. Default \"en\".",
            "default": "en"
          },
          "sort": {
            "title": "Sort order",
            "enum": [
              "relevance",
              "date"
            ],
            "type": "string",
            "description": "Optional. \"relevance\" (default) or \"date\" (newest first). With maxItems below the number of matches this decides which jobs you get.",
            "default": "relevance"
          },
          "maxItems": {
            "title": "Max jobs per search",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Maximum jobs saved per search (one keyword, or one start URL), integer >= 0. Default 100; 0 = every job the search has. You pay per job saved ($0.0008 each), so 100 jobs = $0.08. Use 10-20 for a quick answer.",
            "default": 100
          },
          "deepSearch": {
            "title": "Deep search (go past the 1,000-job limit)",
            "type": "boolean",
            "description": "Optional boolean, default true. The site returns at most 1,000 jobs for any one search. With deep search on, a bigger search is split automatically by publication date into slices of under 1,000 and the results are merged without duplicates, so \"developer\" in France or every job on the site can be scraped in full. Only kicks in when maxItems is above 1,000 (or 0). It costs extra requests, not extra money per job.",
            "default": true
          },
          "includeDetails": {
            "title": "Include full description & company details (slower)",
            "type": "boolean",
            "description": "Optional boolean. false (default) = search data only: title, company, size, sectors, location with coordinates, salary, contract, remote policy, experience, education, profession, summary, key missions, candidate profile, benefits, date, links; up to 1,000 jobs per request. true = also open each job to add the full description, recruitment process, skills, tools, office address, external apply link and company website, LinkedIn page, industry, revenue, headquarters and description. One extra request per job, same price per result.",
            "default": false
          },
          "startUrls": {
            "title": "Search, company or job URLs",
            "type": "array",
            "description": "Optional. URLs copied from welcometothejungle.com, one per line. A search URL (\"https://www.welcometothejungle.com/en/jobs?query=python&refinementList[offices.country_code][]=FR\") is scraped with the filters in the URL (the filter fields above are not applied to it). A company URL (\"https://www.welcometothejungle.com/en/companies/doctolib\") returns all open jobs of that company. A job URL (\".../companies/<company>/jobs/<job>\") is looked up directly and always includes the full details. A job that has been removed is listed in the run summary and is not charged.",
            "items": {
              "type": "string"
            }
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Optional, advanced. Number of parallel requests, integer 1-30. Default 10. Leave unset.",
            "default": 10
          },
          "maxRequestRetries": {
            "title": "Max retries per request",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Optional, advanced. Retries per failed or blocked request, integer 0-20; each retry uses a new session and IP (and the next search server). Default 6. Leave unset.",
            "default": 6
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional, advanced. Apify Proxy settings object. Default {\"useApifyProxy\": true} (datacenter proxies are enough). Searches go straight to the site search service (faster); the proxy is used for job details and for searches that fail twice. Leave unset.",
            "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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}