{
  "openapi": "3.0.1",
  "info": {
    "title": "HelloWork Jobs Scraper | France Jobs, Salaries & All Filters",
    "description": "Scrape HelloWork (hellowork.com) job listings across France with every site filter: contract, remote work, job function, industry, experience, employer type, radius, min salary. 74 fields per job: salary incl. estimates, skills, education, company headcount & revenue. Incremental mode + alerts.",
    "version": "0.1",
    "x-build-id": "JftZfFxuBGR2Oeskw"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/corvuslab~hellowork-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-corvuslab-hellowork-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/corvuslab~hellowork-scraper/runs": {
      "post": {
        "operationId": "runs-sync-corvuslab-hellowork-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/corvuslab~hellowork-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-corvuslab-hellowork-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": "🔑 Keywords",
            "type": "string",
            "description": "Job title, skill or company, e.g. développeur, comptable, infirmier. Separate several searches with commas — each runs on its own and results are merged and de-duplicated."
          },
          "location": {
            "title": "📍 Location",
            "type": "string",
            "description": "City, département number or region, e.g. Lyon, 75, Île-de-France. Separate several with commas — every keyword is searched in every location. Leave empty for all of France."
          },
          "radiusKm": {
            "title": "📏 Search radius",
            "enum": [
              "0",
              "10",
              "20",
              "50",
              "100"
            ],
            "type": "string",
            "description": "How far around a city to search. Only applies when a location is set. Left empty, the site uses 20 km — so 'Lyon' also returns nearby towns. Pick 'City only' for exact matches."
          },
          "startUrls": {
            "title": "📋 Start URLs",
            "type": "array",
            "description": "Paste HelloWork search URLs (every filter you set on the site is kept) or individual job URLs such as https://www.hellowork.com/fr-fr/emplois/83841806.html.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "maxResults": {
            "title": "🔢 Max results",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of jobs to return across all searches. Set 0 for unlimited (bounded by how many jobs the search has).",
            "default": 25
          },
          "ignoreUrlFailures": {
            "title": "⏭️ Ignore URL failures",
            "type": "boolean",
            "description": "Skip URLs that cannot be interpreted instead of failing the whole run.",
            "default": true
          },
          "contractTypes": {
            "title": "📝 Contract type",
            "type": "array",
            "description": "Only jobs with these contract types.",
            "items": {
              "type": "string",
              "enum": [
                "CDI",
                "CDD",
                "Travail_temp",
                "Stage",
                "Alternance",
                "Freelance",
                "Independant",
                "Franchise",
                "Associe",
                "Fonctionnaire",
                "Stage_de_lycee"
              ],
              "enumTitles": [
                "CDI (permanent)",
                "CDD (fixed-term)",
                "Intérim (temporary)",
                "Stage (internship)",
                "Alternance (work-study)",
                "Freelance",
                "Indépendant (self-employed)",
                "Franchise",
                "Associé (partner)",
                "Fonctionnaire (civil service)",
                "Stage de lycée (school placement)"
              ]
            }
          },
          "remoteWork": {
            "title": "🏠 Remote work",
            "type": "array",
            "description": "Only jobs offering this kind of remote work.",
            "items": {
              "type": "string",
              "enum": [
                "Complet",
                "Partiel",
                "Occasionnel",
                "Pas_teletravail"
              ],
              "enumTitles": [
                "Full remote",
                "Partial remote (hybrid)",
                "Occasional remote",
                "On-site only"
              ]
            }
          },
          "workingTime": {
            "title": "⏱️ Working time",
            "type": "array",
            "description": "Full-time or part-time.",
            "items": {
              "type": "string",
              "enum": [
                "ft",
                "pt",
                "np"
              ],
              "enumTitles": [
                "Full-time",
                "Part-time",
                "Not specified"
              ]
            }
          },
          "experienceLevels": {
            "title": "🎓 Experience required",
            "type": "array",
            "description": "Only jobs asking for this much experience.",
            "items": {
              "type": "string",
              "enum": [
                "deb",
                "0-1y",
                "2-3y",
                "4-5y",
                "6-10y",
                "gt10y",
                "unknown"
              ],
              "enumTitles": [
                "Beginners welcome",
                "0–1 year",
                "2–3 years",
                "4–5 years",
                "6–10 years",
                "10+ years",
                "Not specified"
              ]
            }
          },
          "postedWithin": {
            "title": "🕒 Posted within",
            "enum": [
              "any",
              "24h",
              "3d",
              "1w",
              "1m"
            ],
            "type": "string",
            "description": "Only jobs published in this window. Use 'Last 24 hours' for a daily schedule.",
            "default": "any"
          },
          "minAnnualSalary": {
            "title": "💶 Minimum annual salary (€)",
            "minimum": 0,
            "type": "integer",
            "description": "Only jobs paying at least this much per year, e.g. 40000. Leave empty for no salary filter."
          },
          "salaryFilter": {
            "title": "💰 Salary shown",
            "enum": [
              "any",
              "withSalary",
              "postedOnly"
            ],
            "type": "string",
            "description": "Keep only jobs that show pay. 'Posted salary only' keeps jobs where the employer published the pay. 'Posted or HelloWork estimate' also keeps jobs where HelloWork shows its own salary estimate (needs 'Fetch full details'; with details off it keeps posted salaries only). Skipped jobs are never charged.",
            "default": "any"
          },
          "excludeKeywords": {
            "title": "🚫 Exclude keywords",
            "type": "string",
            "description": "Skip jobs whose title contains any of these words, e.g. stage, alternance, senior. Separate several with commas; case and accents are ignored. Skipped jobs are never charged."
          },
          "jobFunctions": {
            "title": "🧑‍💼 Job function",
            "type": "array",
            "description": "The kind of role (the site's 'Fonction' filter).",
            "items": {
              "type": "string",
              "enum": [
                "Achat",
                "Assistanat_admin_accueil",
                "BTP_gros_second_oeuvre",
                "Bureau_etude_R_D",
                "Commercial_technico_com",
                "Commercial_particulier",
                "Commercial_professionnel",
                "Commercial_vendeur",
                "Compta_gestion_finance_audit",
                "Dir_management_resp",
                "Dir_resp_centre_profit",
                "Import_export_inter",
                "Informatique_dev",
                "Informatique_dev_hard",
                "Informatique_syst_info",
                "Informatique_syst_reseaux",
                "Ingenierie_agro_agri",
                "Ingenierie_chimie_pharma_bio",
                "Ingenierie_electro_tech",
                "Ingenierie_meca_aero",
                "Ingenierie_telecom",
                "Juridique_droit",
                "Logistique_metiers_transport",
                "Marketing_com_graphisme",
                "Metiers_fonction_publique",
                "Negociation_gest_immo",
                "Production_gestion",
                "Production_operateur",
                "Qualite_securite_environnement",
                "RH_Personnel_Formation",
                "Restauration_hotellerie_tourisme",
                "Sante_social",
                "SAV_Hotline",
                "Services_pers_entreprises"
              ],
              "enumTitles": [
                "Purchasing",
                "Admin • Sales admin • Reception",
                "Construction trades",
                "Engineering office • R&D",
                "Sales • Technical sales",
                "Sales to consumers",
                "Sales to businesses",
                "Retail sales",
                "Accounting • Finance • Audit",
                "Retail management",
                "Management • Profit-centre lead",
                "Import • Export • International",
                "IT • Software development",
                "IT • Hardware development",
                "IT • Information systems",
                "IT • Systems • Networks",
                "Engineering • Agri-food",
                "Engineering • Chemistry • Pharma • Bio",
                "Engineering • Electrical • Automation",
                "Engineering • Mechanical • Aerospace",
                "Engineering • Telecoms • Electronics",
                "Legal",
                "Logistics • Transport",
                "Marketing • Communication • Design",
                "Public service roles",
                "Real estate",
                "Production • Maintenance",
                "Production operator",
                "Quality • Health & safety • Environment",
                "HR • Training",
                "Hospitality • Tourism • Catering",
                "Healthcare • Social care",
                "After-sales • Hotline • Call centre",
                "Personal & business services"
              ]
            }
          },
          "industries": {
            "title": "🏭 Industry",
            "type": "array",
            "description": "The employer's sector (the site's 'Secteur' filter).",
            "items": {
              "type": "string",
              "enum": [
                "Agri_peche",
                "BTP",
                "Banq_assur_finan",
                "Distrib_commerce",
                "Enseign_forma",
                "Immo",
                "Ind_agro",
                "Ind_auto_meca_nav",
                "Ind_aero",
                "Ind_manufact",
                "Ind_pharma_bio_chim",
                "Ind_petro",
                "Ind_hightech_telecom",
                "Media_internet_com",
                "Resto",
                "Sante_social",
                "Energie_envir",
                "Inform_SSII",
                "Serv_public_autre",
                "Serv_public_etat",
                "Serv_public_collec_terri",
                "Serv_public_hosp",
                "Serv_entreprise",
                "Serv_pers_part",
                "Tourism_hotel_loisir",
                "Transport_logist"
              ],
              "enumTitles": [
                "Agriculture • Fishing",
                "Construction",
                "Banking • Insurance • Finance",
                "Retail • Wholesale",
                "Education • Training",
                "Real estate",
                "Food industry",
                "Automotive • Mechanical • Naval",
                "Aerospace",
                "Manufacturing",
                "Pharma • Biotech • Chemicals",
                "Oil • Petrochemicals",
                "High-tech • Telecoms",
                "Media • Internet • Communication",
                "Restaurants",
                "Healthcare • Social • Non-profit",
                "Energy • Environment",
                "IT services",
                "Public sector (other)",
                "Public sector (state)",
                "Public sector (local government)",
                "Public hospitals",
                "Business services",
                "Consumer services",
                "Tourism • Hotels • Leisure",
                "Transport • Logistics"
              ]
            }
          },
          "employerTypes": {
            "title": "🏢 Employer type",
            "type": "array",
            "description": "Who is hiring — e.g. skip agencies by picking 'Direct employers' only.",
            "items": {
              "type": "string",
              "enum": [
                "Entreprises",
                "Cabinet_recr",
                "Travail_temporaire",
                "SSII",
                "Centre_formation"
              ],
              "enumTitles": [
                "Direct employers",
                "Recruitment agencies",
                "Temp agencies",
                "IT services firms (ESN)",
                "Training centres"
              ]
            }
          },
          "superRecruiterOnly": {
            "title": "⭐ Super Recruiters only",
            "type": "boolean",
            "description": "Only employers the site badges as 'Super recruteur' (responsive, reliable recruiters).",
            "default": false
          },
          "sortBy": {
            "title": "↕️ Sort by",
            "enum": [
              "date",
              "relevance"
            ],
            "type": "string",
            "description": "Newest first (default) returns every matching job exactly once. Relevance is HelloWork's own order; it ranks the best matches first but repeats some jobs across pages and skips a few (2-4% of a search).",
            "default": "date"
          },
          "includeDetails": {
            "title": "🔬 Fetch full details",
            "type": "boolean",
            "description": "Open each job's page for the full description and the extra fields. Turn off for the fastest, cheapest runs.",
            "default": true
          },
          "includeCompanyProfile": {
            "title": "🏢 Add company profiles",
            "type": "boolean",
            "description": "Also open each employer's HelloWork company page (once per company per run) and add its profile: open jobs, headcount band, founding year, headquarters, revenue, remote-work policy, average age and tenure, gender split, gender-equality index and the benefits they list. Needs full details on. Not every company publishes every fact.",
            "default": false
          },
          "descriptionFormat": {
            "title": "📝 Description format",
            "enum": [
              "all",
              "text",
              "html",
              "markdown"
            ],
            "type": "string",
            "description": "Which format(s) of the job description to include.",
            "default": "all"
          },
          "descriptionMaxLength": {
            "title": "✂️ Max description length",
            "minimum": 0,
            "type": "integer",
            "description": "Cut the description and the candidate profile (qualifications) to this many characters. Leave empty or 0 for the full text — handy for smaller payloads in AI pipelines."
          },
          "compact": {
            "title": "📦 Compact records",
            "type": "boolean",
            "description": "Emit only the core fields (title, company, location, contract, remote, salary, date, URL). Ideal for AI agents and MCP clients.",
            "default": false
          },
          "excludeEmptyFields": {
            "title": "🧹 Drop empty fields",
            "type": "boolean",
            "description": "Remove null, empty-string and empty-array fields from each record.",
            "default": false
          },
          "incrementalMode": {
            "title": "♻️ Incremental mode",
            "type": "boolean",
            "description": "Track state between runs and tag every record with a changeType (NEW / UPDATED / UNCHANGED / EXPIRED).",
            "default": false
          },
          "stateKey": {
            "title": "🗝️ State key",
            "type": "string",
            "description": "Stable name for the tracked search. Leave empty to derive one automatically from your search settings."
          },
          "emitUnchanged": {
            "title": "🔁 Include unchanged records",
            "type": "boolean",
            "description": "Also emit records that have not changed since the previous run.",
            "default": false
          },
          "emitExpired": {
            "title": "🗑️ Include expired records",
            "type": "boolean",
            "description": "Emit a record for each job that was present last run but is gone now. Only reported when the run covers the whole search (Max results 0, or above the number of matching jobs) — a job beyond the cap isn't gone.",
            "default": false
          },
          "skipReposts": {
            "title": "🚫 Skip reposts",
            "type": "boolean",
            "description": "Drop jobs that are re-posts of a job seen in an earlier run (same title, company and location under a new ID). They're skipped before any detail fetch, so they cost nothing.",
            "default": false
          },
          "telegramToken": {
            "title": "💬 Telegram bot token",
            "type": "string",
            "description": "Bot token from @BotFather."
          },
          "telegramChatId": {
            "title": "🆔 Telegram chat ID",
            "type": "string",
            "description": "Chat or channel ID, e.g. \"-100123456789\" or \"@yourchannel\"."
          },
          "slackWebhookUrl": {
            "title": "💼 Slack webhook URL",
            "type": "string",
            "description": "Slack incoming-webhook URL."
          },
          "discordWebhookUrl": {
            "title": "🎮 Discord webhook URL",
            "type": "string",
            "description": "Discord incoming-webhook URL."
          },
          "whatsappPhoneNumberId": {
            "title": "🟢 WhatsApp phone number ID",
            "type": "string",
            "description": "WhatsApp Cloud API phone number ID (Meta for Developers → WhatsApp → API setup)."
          },
          "whatsappAccessToken": {
            "title": "🔐 WhatsApp access token",
            "type": "string",
            "description": "WhatsApp Cloud API access token."
          },
          "whatsappTo": {
            "title": "📱 WhatsApp recipient(s)",
            "type": "string",
            "description": "Recipient phone number(s) in international format, comma-separated, e.g. \"33612345678\". Meta delivers free-form messages to numbers that messaged your business number in the last 24 hours."
          },
          "webhookUrl": {
            "title": "🪝 Webhook URL",
            "type": "string",
            "description": "Any HTTPS endpoint. Receives a JSON POST with the matched records — works with n8n, Make and Zapier."
          },
          "webhookHeaders": {
            "title": "🧾 Webhook headers",
            "type": "object",
            "description": "Extra headers for the webhook request, e.g. {\"Authorization\": \"Bearer xyz\"}."
          },
          "notificationLimit": {
            "title": "🔢 Records per notification",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many records to include in each notification message.",
            "default": 5
          },
          "notifyOnlyChanges": {
            "title": "🆕 Notify only about changes",
            "type": "boolean",
            "description": "In incremental mode, send only NEW, UPDATED and REAPPEARED jobs to your channels (useful with 'Include unchanged records').",
            "default": false
          },
          "notionApiKey": {
            "title": "📓 Notion integration token",
            "type": "string",
            "description": "Optional. Create an internal integration at notion.so/my-integrations, copy its Internal Integration Secret (starts with 'ntn_'), then open the target database → ⋯ → Connections → and connect that integration. Without that last step Notion returns 'object_not_found'."
          },
          "notionDatabaseId": {
            "title": "🗂️ Notion database ID or URL",
            "type": "string",
            "description": "Optional. Paste the database's URL or its 32-character ID. Every job becomes one page in that database. The database can start completely empty — the columns are created for you on the first run."
          },
          "notionCreateProperties": {
            "title": "🛠️ Create missing Notion columns",
            "type": "boolean",
            "description": "Add any columns the target database is missing (with the right Notion type) on the first run. Turn this off to write only into columns you created yourself — fields with no matching column are then skipped.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy configuration",
            "type": "object",
            "description": "Optional. Not needed for normal use — the actor works without a proxy. Enable it only if runs start getting refused.",
            "default": {
              "useApifyProxy": false
            }
          },
          "maxRequestRetries": {
            "title": "🔄 Max request retries",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "How many times to retry a failed request before giving up on it.",
            "default": 3
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}