{
  "openapi": "3.0.1",
  "info": {
    "title": "APEC Jobs Scraper[💰$0.75] - French Executive Jobs, Salaries",
    "description": "Scrape apec.fr, France's job board for cadres, executives and engineers, with every site filter: places + radius, salary range, full advert, skills with level, recruiter contact, first-publication date and every APEC code as a readable label next to its id. Incremental monitoring + alerts.",
    "version": "0.1",
    "x-build-id": "2gxdhtXID0nYQR4f0"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/corvuslab~apec-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-corvuslab-apec-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/corvuslab~apec-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-corvuslab-apec-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/corvuslab~apec-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-corvuslab-apec-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": {
          "searchTerms": {
            "title": "🔎 Keywords",
            "type": "array",
            "description": "What to search for, as you would type it on apec.fr: a job title, a skill or a company (e.g. \"data engineer\", \"chef de projet\", \"contrôleur de gestion\"). Each keyword runs as its own search. Leave empty to get every live offer, newest first.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "📍 Places",
            "type": "array",
            "description": "Towns, departments, regions or countries, as you would type them: \"Lyon\", \"Paris 15\", \"Rhône\", \"75\", \"Bretagne\", \"Ile-de-France\", \"Allemagne\". Several places are searched together. Leave empty for all of France and abroad.",
            "items": {
              "type": "string"
            }
          },
          "radiusKm": {
            "title": "🎯 Radius around a town (km)",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "Widen each town in Places to everything within this distance. Applies to towns only (not departments or regions). 0 = the town itself."
          },
          "startUrls": {
            "title": "📋 Start URLs",
            "type": "array",
            "description": "Optional. Paste apec.fr search URLs (their filters are used as is) or offer URLs (…/detail-offre/179641876W). Search URLs replace the search form above.",
            "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 offers to return across all searches. Set 0 for no limit (every matching offer).",
            "default": 25
          },
          "sortBy": {
            "title": "↕️ Sort by",
            "enum": [
              "date",
              "relevance"
            ],
            "type": "string",
            "description": "Order in which offers are read. Newest first suits monitoring; most relevant matches apec.fr's default for keyword searches.",
            "default": "date"
          },
          "contractTypes": {
            "title": "📄 Contract type",
            "type": "array",
            "description": "Keep only these contract types.",
            "items": {
              "type": "string",
              "enum": [
                "permanent",
                "fixedTerm",
                "workStudy",
                "temporary",
                "internship"
              ],
              "enumTitles": [
                "CDI (permanent)",
                "CDD (fixed-term)",
                "Alternance (work-study)",
                "Intérim (temporary)",
                "Stage (internship)"
              ]
            }
          },
          "contractDuration": {
            "title": "⏳ Contract length (CDD / interim)",
            "enum": [
              "",
              "1to6",
              "7to12",
              "13plus"
            ],
            "type": "string",
            "description": "Length of fixed-term and interim contracts."
          },
          "experienceLevels": {
            "title": "🎓 Experience",
            "type": "array",
            "description": "Experience the offer asks for.",
            "items": {
              "type": "string",
              "enum": [
                "entry",
                "3to5",
                "6to9",
                "10plus"
              ],
              "enumTitles": [
                "Débutant (entry level)",
                "3 – 5 years",
                "6 – 9 years",
                "10 years and more"
              ]
            }
          },
          "postedWithin": {
            "title": "📅 Posted within",
            "enum": [
              "",
              "24h",
              "7d",
              "30d"
            ],
            "type": "string",
            "description": "Only offers published (or re-published) in this window."
          },
          "remoteWork": {
            "title": "🏠 Remote work",
            "type": "array",
            "description": "Keep only offers that allow this remote-work level.",
            "items": {
              "type": "string",
              "enum": [
                "occasional",
                "partial",
                "full"
              ],
              "enumTitles": [
                "Occasional remote allowed",
                "Partial remote (hybrid)",
                "Full remote"
              ]
            }
          },
          "minSalaryK": {
            "title": "💶 Minimum salary (k€ / year)",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "APEC's own salary filter, in thousands of euros gross per year (e.g. 50). An offer is kept when its published range overlaps yours; offers 'à négocier' stay in."
          },
          "maxSalaryK": {
            "title": "💶 Maximum salary (k€ / year)",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "Upper bound of the salary filter, in thousands of euros gross per year."
          },
          "employerTypes": {
            "title": "🏢 Employer type",
            "type": "array",
            "description": "Who posted the offer. Empty = all five types (the whole board).",
            "items": {
              "type": "string",
              "enum": [
                "company",
                "recruitmentAgency",
                "staffingAgency",
                "itServices",
                "partner"
              ],
              "enumTitles": [
                "Entreprise (direct employer)",
                "Cabinet de recrutement (recruitment agency)",
                "Agence d'emploi (staffing agency)",
                "SSII / ESN (IT services)",
                "Partenaire (offers resold by partner job boards)"
              ]
            }
          },
          "excludePartnerListings": {
            "title": "🚫 Skip offers resold by partner job boards",
            "type": "boolean",
            "description": "Leave out offers APEC imports from other job boards (their company is often the board's name). Skipped offers are not charged.",
            "default": false
          },
          "excludeKeywords": {
            "title": "🙅 Exclude titles containing",
            "type": "array",
            "description": "Leave out offers whose title contains any of these words, e.g. \"stage\", \"alternance\", \"junior\". Case and accents are ignored. Left-out offers are not charged.",
            "items": {
              "type": "string"
            }
          },
          "excludeCompanies": {
            "title": "🏚️ Exclude companies",
            "type": "array",
            "description": "Leave out offers from these companies or agencies (the name only has to contain what you type). Left-out offers are not charged.",
            "items": {
              "type": "string"
            }
          },
          "requireSalary": {
            "title": "💰 Only offers that show a salary",
            "type": "boolean",
            "description": "Leave out offers with no published salary (\"A négocier\", \"Non renseignée\"). Left-out offers are not charged.",
            "default": false
          },
          "positionStatus": {
            "title": "👔 Position status",
            "type": "array",
            "description": "Status of the position.",
            "items": {
              "type": "string",
              "enum": [
                "privateSector",
                "publicSector",
                "supervisorTechnician"
              ],
              "enumTitles": [
                "Cadre du secteur privé",
                "Cadre du secteur public / Armées",
                "Agent de maîtrise / Technicien"
              ]
            }
          },
          "sectors": {
            "title": "🏭 Sector",
            "type": "array",
            "description": "Business sector of the employer.",
            "items": {
              "type": "string",
              "enum": [
                "101752",
                "101753",
                "101754",
                "101755",
                "101756",
                "101780",
                "101757",
                "101758",
                "101759",
                "101760",
                "101761",
                "101762",
                "101763",
                "101764",
                "101765",
                "101766",
                "101767",
                "101768",
                "101769",
                "101770",
                "101771",
                "101772",
                "101773",
                "101775",
                "101774",
                "101776",
                "101777",
                "101779",
                "101778"
              ],
              "enumTitles": [
                "Activités des organisations associatives et administration publique",
                "Activités informatiques",
                "Activités juridiques et comptables",
                "Agroalimentaire",
                "Automobile, aéronautique et autres matériels de transport",
                "Autre",
                "Banque et Assurances",
                "Bois - Papier - Imprimerie",
                "Chimie - Caoutchouc - Plastique",
                "Commerce interentreprises",
                "Communication et médias",
                "Conseil et gestion des entreprises",
                "Construction",
                "Distribution généraliste et spécialisée",
                "Energies - Eau",
                "Equipements électriques et électroniques",
                "Formation initiale et continue",
                "Gestion des déchets",
                "Hôtellerie - Restauration - Loisirs",
                "Immobilier",
                "Industrie pharmaceutique",
                "Ingénierie - R et D",
                "Intermédiaires du recrutement",
                "Meuble, Textile et autres industries manufacturières",
                "Mécanique - Métallurgie",
                "Santé - action sociale",
                "Services divers aux entreprises",
                "Transports et logistique",
                "Télécommunications"
              ]
            }
          },
          "jobFunctions": {
            "title": "🧭 Job function",
            "type": "array",
            "description": "APEC's job functions (▸ = a whole family).",
            "items": {
              "type": "string",
              "enum": [
                "101828",
                "101782",
                "101783",
                "101784",
                "101785",
                "101786",
                "101787",
                "101788",
                "101789",
                "101829",
                "101790",
                "101791",
                "101792",
                "101793",
                "101830",
                "101794",
                "101795",
                "101831",
                "101796",
                "101797",
                "101798",
                "101799",
                "101800",
                "101832",
                "101801",
                "101802",
                "101803",
                "101804",
                "101805",
                "101806",
                "101833",
                "101807",
                "101808",
                "101809",
                "101810",
                "101811",
                "101812",
                "101813",
                "101834",
                "101814",
                "101815",
                "101816",
                "101835",
                "101817",
                "101818",
                "101819",
                "101820",
                "101836",
                "101821",
                "101837",
                "101822",
                "101823",
                "101824",
                "101825",
                "101826",
                "101827"
              ],
              "enumTitles": [
                "▸ Commercial, Marketing",
                "    Administration des ventes et SAV",
                "    Chargé d'affaires, technico-commercial",
                "    Commercial",
                "    Commerce international",
                "    Direction commerciale et marketing",
                "    Direction régionale et d'agence",
                "    Marketing",
                "    Ventes en magasin",
                "▸ Communication, Création",
                "    Communication",
                "    Création",
                "    Documentation, rédaction technique",
                "    Journalisme, édition",
                "▸ Direction d'entreprise",
                "    Adjoint, conseil de direction",
                "    Direction générale",
                "▸ Etudes, Recherche et Développement",
                "    Conception, recherche",
                "    Direction recherche et développement",
                "    Etudes socio-économiques",
                "    Projets scientifiques et techniques",
                "    Test, essai, validation, expertise",
                "▸ Gestion, Finance, Administration",
                "    Administration, gestion, organisation",
                "    Comptabilité",
                "    Contrôle de gestion, audit",
                "    Direction gestion, finance",
                "    Droit, fiscalité",
                "    Finance, trésorerie",
                "▸ Informatique",
                "    Direction informatique",
                "    Exploitation, maintenance informatique",
                "    Informatique de gestion",
                "    Informatique industrielle",
                "    Informatique web, sites et portails Internet",
                "    Maîtrise d'ouvrage et fonctionnel",
                "    Système, réseaux, données",
                "▸ Production Industrielle, Travaux, Chantiers",
                "    Cadres de chantier",
                "    Cadres de production industrielle",
                "    Direction d'unité industrielle",
                "▸ Ressources Humaines",
                "    Administration des RH",
                "    Développement des RH",
                "    Direction des ressources humaines",
                "    Formation initiale et continue",
                "▸ Sanitaire, Social, Culture",
                "    Activités sanitaires, sociales et culturelles",
                "▸ Services Techniques",
                "    Achats",
                "    Direction des services techniques",
                "    Logistique",
                "    Maintenance, sécurité",
                "    Process, méthodes",
                "    Qualité"
              ]
            }
          },
          "jobRoles": {
            "title": "🧩 Job roles",
            "type": "array",
            "description": "Any of APEC's ~450 job roles by name, e.g. \"Data scientist\", \"Contrôleur de gestion\", \"Chef de projet informatique\". Unknown names are skipped with a warning.",
            "items": {
              "type": "string"
            }
          },
          "includeDetails": {
            "title": "🔬 Fetch the full advert",
            "type": "boolean",
            "description": "Add the full advert (job, candidate profile, company), skills, apply link, first publication date, experience, job role and function, company address and contact name. Turn off for the fastest, search-results-only runs.",
            "default": true
          },
          "descriptionFormat": {
            "title": "📝 Description format",
            "enum": [
              "all",
              "text",
              "html",
              "markdown"
            ],
            "type": "string",
            "description": "Which representation(s) of the full advert to include.",
            "default": "all"
          },
          "descriptionMaxLength": {
            "title": "✂️ Description max length",
            "minimum": 0,
            "type": "integer",
            "description": "Cut descriptions to this many characters. 0 = full length.",
            "default": 0
          },
          "compact": {
            "title": "📦 Compact records",
            "type": "boolean",
            "description": "Emit only the core fields (title, company, place, contract, salary, link). Ideal for AI agents and MCP clients.",
            "default": false
          },
          "excludeEmptyFields": {
            "title": "🧹 Drop empty fields",
            "type": "boolean",
            "description": "Remove null, empty-string and empty-list fields from each record.",
            "default": false
          },
          "incrementalMode": {
            "title": "♻️ Incremental mode",
            "type": "boolean",
            "description": "Track offers between runs and tag every record NEW / UPDATED / UNCHANGED / EXPIRED. Unchanged offers are skipped and not charged.",
            "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 offers",
            "type": "boolean",
            "description": "Also emit offers that have not changed since the previous run.",
            "default": false
          },
          "emitExpired": {
            "title": "🗑️ Include expired offers",
            "type": "boolean",
            "description": "Emit offers that were open last run but are gone now. Needs a run that reads the whole search (Max results 0 or above the number of matches).",
            "default": false
          },
          "skipReposts": {
            "title": "♻️ Skip re-posted offers",
            "type": "boolean",
            "description": "Leave out offers an employer took down and posted again under a new number (same title, company and place as an offer already tracked). They are not charged. Every new offer still carries isRepost either way.",
            "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."
          },
          "webhookUrl": {
            "title": "🪝 Webhook URL",
            "type": "string",
            "description": "Any HTTPS endpoint. Receives a JSON POST with every matched offer (up to 1,000 per run) — works with n8n, Make and Zapier."
          },
          "webhookHeaders": {
            "title": "🧾 Webhook headers",
            "type": "object",
            "description": "Extra headers for the webhook request, e.g. {\"Authorization\": \"Bearer xyz\"}. Stored encrypted, like the other credentials."
          },
          "notificationLimit": {
            "title": "🔢 Jobs per notification",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many offers to list in each Telegram, Slack or Discord message. The webhook always gets every matched offer.",
            "default": 5
          },
          "notifyOnlyChanges": {
            "title": "🎯 Alert only on changes",
            "type": "boolean",
            "description": "In incremental mode, alerts list only new, updated and reappeared offers, even when Include unchanged offers is on.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "🛡️ Proxy",
            "type": "object",
            "description": "APEC only answers visitors from France. Keep the default proxy settings for reliable runs.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "FR"
            }
          },
          "detailConcurrency": {
            "title": "⚡ Parallel advert reads",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "How many full adverts to read at the same time.",
            "default": 6
          },
          "ignoreUrlFailures": {
            "title": "⏭️ Ignore URL failures",
            "type": "boolean",
            "description": "Skip start URLs that cannot be interpreted instead of failing the whole run.",
            "default": true
          },
          "maxRequestRetries": {
            "title": "🔄 Max request retries",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "How many times to retry a refused or failed request (each retry uses a fresh connection).",
            "default": 6
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}