{
  "openapi": "3.0.1",
  "info": {
    "title": "French Jobs Scraper: France, Québec, Africa, from $0.90/1K",
    "description": "Scrape job offers from 42 French-language sources in one schema: career sites (16 ATS), job boards, public employment services, VIE, service civique, volunteering and freelance missions. City, department, region and country parsed, contract normalized, new-jobs-only mode.",
    "version": "0.1",
    "x-build-id": "8A6dEUHuBtnaE3E4o"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/alexmorain~francophone-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-alexmorain-francophone-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/alexmorain~francophone-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-alexmorain-francophone-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/alexmorain~francophone-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-alexmorain-francophone-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": {
          "sources": {
            "title": "Sources",
            "type": "array",
            "description": "Which sources to read. Leave empty to use every source that has what it needs in this input, except <code>emploi_cm</code>, which runs only when you select it.<br><br>• <code>ats</code>: the public job boards of the companies you list below, on 9 applicant tracking systems (the other ATS below have their own source).<br>• <code>collective</code>: freelance missions on Collective.work (France, Belgium).<br>• <code>free_work</code>: freelance IT missions on Free-Work.<br>• <code>free_work_jobs</code>: permanent, fixed-term, internship and apprenticeship IT jobs on Free-Work.<br>• <code>codeur</code>: freelance projects on Codeur.com (fixed budgets, last 30 days unless <code>postedWithinDays</code> is set).<br>• <code>freelance_informatique</code>: freelance IT missions on Freelance-Informatique (about 500, France, a few in Belgium and Luxembourg; the client is never named, the daily rate only when the description writes it).<br>• <code>service_civique</code>: every Service Civique mission, in France and abroad.<br>• <code>wttj</code>: Welcome to the Jungle, every job posted in the French-speaking countries (France and overseas, Belgium, Switzerland, Luxembourg, Canada, Morocco...).<br>• <code>profilculture</code>: culture sector jobs on ProfilCulture (posted in the last month).<br>• <code>livreshebdo</code>: book trade jobs on Livres Hebdo.<br>• <code>agences_livre</code>: jobs and internships posted by the French book agencies (FILL, ALCA Nouvelle-Aquitaine, Livre et lecture en Bretagne, Auvergne-Rhône-Alpes Livre et Lecture).<br>• <code>eures</code>: EURES, the European public employment services portal, for France, Belgium, Luxembourg and Switzerland (most French offers come from France Travail, with about a week of delay).<br>• <code>forem</code>: Le Forem, the Walloon public employment service (Wallonia, Brussels, some Flanders and abroad), from its open data under CC BY-SA 4.0.<br>• <code>jobup</code>: jobup.ch, the leading French-speaking Swiss job board (all of Switzerland).<br>• <code>teamtailor</code>: career sites hosted on Teamtailor. With no Teamtailor entry in <b>Companies</b>, a built-in list of 333 employers with jobs in French-speaking countries; otherwise only the sites you list there.<br>• <code>taleez</code>: every public job of the French ATS Taleez (about 11,000, newest first, read one page at a time).<br>• <code>softy</code>: career sites hosted on Softy, a French ATS. With no Softy entry in <b>Companies</b>, a built-in list of 77 employers (about 3,300 jobs, one page read per job); otherwise only the sites you list there.<br>• <code>flatchr</code>: career sites hosted on Flatchr, a French ATS. With no Flatchr entry in <b>Companies</b>, a built-in list of 264 employers (about 3,700 jobs, mostly France, some Monaco, Belgium, Luxembourg); otherwise only the sites you list there.<br>• <code>digitalrecruiters</code>: career sites of the Cegid HR Talent Acquisition ATS (formerly DigitalRecruiters). With no DigitalRecruiters entry in <b>Companies</b>, a built-in list of 283 employers (up to 45,000 jobs, one page read per job, about 90 jobs a minute); otherwise only the sites you list there.<br>• <code>breezy</code>: career sites hosted on Breezy HR. With no Breezy entry in <b>Companies</b>, a built-in list of 76 employers with jobs in French or in French-speaking countries (about 2,200 jobs: Québec, France, Switzerland, Belgium, Africa); otherwise only the sites you list there.<br>• <code>join</code>: company pages on JOIN (join.com). With no JOIN entry in <b>Companies</b>, a built-in list of 853 employers (about 2,500 jobs, mostly France; a full read takes about 42 minutes, more than the default time budget); otherwise only the pages you list there.<br>• <code>rekrute</code>: ReKrute, the leading Moroccan job board for professionals (a few offers in Tunisia and Senegal). One page is read per job: about an hour for the whole site.<br>• <code>tanitjobs</code>: Tanitjobs, the largest Tunisian job board (last 30 days).<br>• <code>emploitic</code>: Emploitic, the leading Algerian job board, with full descriptions.<br>• <code>educarriere</code>: Educarriere, the historic Ivorian job board.<br>• <code>africarrieres</code>: Africarrieres, jobs in 16 French-speaking African countries (Côte d'Ivoire, Senegal, Morocco, Burkina Faso, Cameroon...). Set <code>countries</code> to read only the ones you need: one page is read per job.<br>• <code>senjob</code>: Senjob, Senegalese job board.<br>• <code>emploi_cm</code>: Emploi.cm, Cameroonian job board (read slowly, 10 seconds between pages, as the site asks). <b>Not in the default set</b>: the site blocks Apify datacenter IPs, so select it explicitly and turn on a <b>residential proxy</b> under Advanced (only this source uses it, the others connect directly).<br>• <code>mediacongo</code>: MediaCongo, jobs posted in the Democratic Republic of the Congo (read slowly, 10 seconds between pages, as the site asks).<br>• <code>choisir_service_public</code>: every offer of the three French civil services (State, local, hospitals) on Choisir le service public, with category, branch and contract (slow: one page read per offer).<br>• <code>emploi_territorial</code>: French local-government jobs on emploi-territorial.fr (permanent posts, fixed-term, apprenticeships, internships).<br>• <code>fhf</code>: jobs of the French public hospitals and care homes on FHF emploi, the Fédération hospitalière de France job site (about 12,000, newest first, one page read per job).<br>• <code>la_bonne_alternance</code>: apprenticeship jobs (apprentissage, professionnalisation) of La bonne alternance, the French Ministry of Labour platform, with its partners' offers (France Travail, APEC, OPCO...), about 11,000.<br>• <code>corps_europeen_solidarite</code>: volunteering placements of the European Solidarity Corps in every host country (European Youth Portal), open ones with a deadline still ahead.<br>• <code>jeveuxaider</code>: volunteering missions on JeVeuxAider.gouv.fr, on site or remote, all over France.<br>• <code>france_volontaires</code>: international volunteering missions published by France Volontaires (VSI, international civic service, solidarity leave), all over the world.<br>• <code>monaco_emploi</code>: job offers of the Monaco Employment Service, published on MonServicePublic.mc (one page is read per job, about 5 minutes for all).<br>• <code>hellowork</code>: HelloWork, a major French job board (about 800,000 jobs, France and overseas). Keywords or <b>Include full job description</b> fetch each job page, about one job per second.<br>• <code>meteojob</code>: Meteojob, French job board (about 300,000 jobs, newest first, full description included).<br>• <code>jobillico</code>: Jobillico, the Québec job board, every offer with a French version (about 17,500, mostly Québec, one page per offer).<br>• <code>job_bank</code>: Job Bank (Guichet-Emplois), the Government of Canada job board: every Québec offer, plus French or bilingual offers in the other provinces and territories.<br>• <code>quebec_emploi</code>: Québec emploi, the Québec government job platform (about 7,400 offers).",
            "items": {
              "type": "string",
              "enum": [
                "ats",
                "collective",
                "free_work",
                "free_work_jobs",
                "codeur",
                "freelance_informatique",
                "service_civique",
                "wttj",
                "profilculture",
                "livreshebdo",
                "agences_livre",
                "eures",
                "forem",
                "jobup",
                "teamtailor",
                "taleez",
                "softy",
                "flatchr",
                "digitalrecruiters",
                "breezy",
                "join",
                "rekrute",
                "tanitjobs",
                "emploitic",
                "educarriere",
                "africarrieres",
                "senjob",
                "emploi_cm",
                "mediacongo",
                "choisir_service_public",
                "emploi_territorial",
                "fhf",
                "la_bonne_alternance",
                "corps_europeen_solidarite",
                "jeveuxaider",
                "france_volontaires",
                "monaco_emploi",
                "hellowork",
                "meteojob",
                "jobillico",
                "job_bank",
                "quebec_emploi"
              ],
              "enumTitles": [
                "Company job boards (9 ATS)",
                "Collective.work (freelance)",
                "Free-Work (freelance)",
                "Free-Work (jobs)",
                "Codeur.com (freelance)",
                "Freelance-Informatique (IT freelance)",
                "Service Civique (France and abroad)",
                "Welcome to the Jungle",
                "ProfilCulture (culture jobs, France)",
                "Livres Hebdo (book trade jobs)",
                "French regional book agencies (FILL, ALCA, Bretagne, AURA)",
                "EURES (France, Belgium, Luxembourg, Switzerland)",
                "Le Forem (Belgium, open data)",
                "jobup.ch (Switzerland)",
                "Teamtailor career sites (333 employers in French-speaking countries)",
                "Taleez (French ATS, every public job)",
                "Softy career sites (77 employers, French ATS)",
                "Flatchr career sites (264 employers, French ATS)",
                "DigitalRecruiters / Cegid career sites (283 employers)",
                "Breezy HR career sites (76 employers)",
                "JOIN company pages (853 employers)",
                "ReKrute (Morocco)",
                "Tanitjobs (Tunisia)",
                "Emploitic (Algeria)",
                "Educarriere (Côte d'Ivoire)",
                "Africarrieres (16 African countries)",
                "Senjob (Senegal)",
                "Emploi.cm (Cameroon)",
                "MediaCongo (DR Congo)",
                "Choisir le service public (French civil service)",
                "Emploi territorial (French local government)",
                "FHF emploi (French public hospitals)",
                "La bonne alternance (apprenticeships, France)",
                "European Solidarity Corps (volunteering)",
                "JeVeuxAider.gouv.fr (volunteering, France)",
                "France Volontaires (international volunteering, VSI)",
                "Monaco Employment Service (MonServicePublic.mc)",
                "HelloWork (French job board)",
                "Meteojob (French job board)",
                "Jobillico (Québec job board)",
                "Job Bank / Guichet-Emplois (Canada)",
                "Québec emploi (Québec government)"
              ]
            }
          },
          "companies": {
            "title": "Companies (ats source)",
            "type": "array",
            "description": "One company per line, for the <code>ats</code> source. Three accepted forms:<br>• <b>a domain</b>: <code>doctolib.fr</code>, resolved through a built-in directory of 15,000+ job boards, then by probing the ATS APIs live.<br>• <b>a job board URL</b>, the most reliable: <code>https://jobs.lever.co/qonto</code>.<br>• <b>an explicit ats:slug pair</b>: <code>greenhouse:doctolib</code>, <code>ashby:alan</code>. Workday needs <code>workday:tenant|wd5|site</code>.<br><br>For the <code>teamtailor</code> source: <code>teamtailor:payfit</code>, <code>teamtailor:careers.example.com</code> for a custom career domain, or a <code>https://payfit.teamtailor.com</code> URL.<br><br>For the other career-site sources, the same forms: <code>softy:habitat70</code>, <code>flatchr:maped</code> or <code>https://maped.flatchr.io</code>, <code>breezy:gozem</code> or <code>https://gozem.breezy.hr</code>, <code>join:amplitudes</code> or <code>https://join.com/companies/amplitudes</code>, <code>digitalrecruiters:recrutement.example.fr</code>. The <code>ats</code> source leaves these entries to their own source.<br><br>A company that fails is logged and skipped, the others go on.",
            "items": {
              "type": "string"
            }
          },
          "presetLists": {
            "title": "Ready-made company lists (ats source)",
            "type": "array",
            "description": "Adds whole lists of companies, already matched to their job boards: <code>french-unicorns</code> (French Tech unicorns), <code>forbes-ai-50</code>, <code>y-combinator</code>, or every board of one ATS (<code>all-greenhouse</code>...), up to <b>Max boards from lists</b>. Boards already in Companies are never scraped twice.",
            "items": {
              "type": "string",
              "enum": [
                "forbes-ai-50",
                "french-unicorns",
                "y-combinator",
                "all-ashby",
                "all-greenhouse",
                "all-lever",
                "all-personio",
                "all-recruitee",
                "all-rippling",
                "all-smartrecruiters",
                "all-workable",
                "all-workday"
              ],
              "enumTitles": [
                "Forbes AI 50, 2026 edition (33 companies)",
                "French Tech unicorns, 2026 (13 companies)",
                "Y Combinator, active companies (331 companies)",
                "All Ashby boards (capped)",
                "All Greenhouse boards (capped)",
                "All Lever boards (capped)",
                "All Personio boards (capped)",
                "All Recruitee boards (capped)",
                "All Rippling boards (capped)",
                "All SmartRecruiters boards (capped)",
                "All Workable boards (capped)",
                "All Workday boards (capped)"
              ]
            }
          },
          "maxPresetBoards": {
            "title": "Max boards from lists",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Safety cap on the number of job boards the ready-made lists add, all lists combined. Defaults to <code>200</code>. You are charged for jobs returned, not for boards scanned."
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Keep only jobs whose title (or description, when <b>Include full job description</b> is on) contains at least one of these words, case and accent insensitive: <code>data</code>, <code>développeur</code>, <code>product manager</code>.<br><br>Leave empty to keep everything.",
            "items": {
              "type": "string"
            }
          },
          "titleKeywords": {
            "title": "Title keywords",
            "type": "array",
            "description": "Keep only jobs whose <b>title</b> contains at least one of these words, case and accent insensitive, whole words only: <code>Notion</code>, <code>Airtable</code>, <code>chef de projet</code>. A job that only mentions them in its description is left out.<br><br>Used together with <b>Keywords</b>, a job must match both lists. Title-only searches are also faster: sources skip the job pages they would otherwise open to read descriptions.<br><br>Leave empty to keep everything.",
            "items": {
              "type": "string"
            }
          },
          "excludeTitleKeywords": {
            "title": "Exclude title keywords",
            "type": "array",
            "description": "Leave out jobs whose <b>title</b> contains any of these words, case and accent insensitive, whole words only. Useful when a tool name is also a common word: with <code>Notion</code> in <b>Title keywords</b>, add <code>notion de</code> here to drop « Assistant avec notion de comptabilité ». Excluded jobs are never charged.<br><br>Leave empty to exclude nothing.",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "Keep only jobs located in these countries. A job whose country cannot be established from its location is left out when this filter is set.",
            "items": {
              "type": "string",
              "enum": [
                "FR",
                "BE",
                "CH",
                "LU",
                "MC",
                "CA",
                "MA",
                "TN",
                "DZ",
                "SN",
                "CI",
                "CM",
                "CD",
                "CG",
                "MG",
                "ML",
                "BF",
                "BJ",
                "TG",
                "NE",
                "GA",
                "GN",
                "HT",
                "LB"
              ],
              "enumTitles": [
                "France (et outre-mer)",
                "Belgique",
                "Suisse",
                "Luxembourg",
                "Monaco",
                "Canada",
                "Maroc",
                "Tunisie",
                "Algérie",
                "Sénégal",
                "Côte d'Ivoire",
                "Cameroun",
                "RD Congo",
                "Congo",
                "Madagascar",
                "Mali",
                "Burkina Faso",
                "Bénin",
                "Togo",
                "Niger",
                "Gabon",
                "Guinée",
                "Haïti",
                "Liban"
              ]
            }
          },
          "languages": {
            "title": "Languages",
            "type": "array",
            "description": "Keep only jobs written in these languages. <b>French only by default.</b> Add <code>en</code> to get the many English-language tech jobs in Paris, Brussels, Geneva or Luxembourg; add <code>nl</code> for Flanders and Brussels, <code>de</code> for German-speaking Switzerland and Luxembourg, <code>ar</code> for the Maghreb and Lebanon. <b>Clear the list to get every language.</b><br><br>The language is read from the job title and description (or given by the source when it says so). A job whose language cannot be established (a short title with no description) is always kept. Filtered-out jobs are never charged.",
            "items": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "nl",
                "de",
                "es",
                "it",
                "pt",
                "ar"
              ],
              "enumTitles": [
                "French",
                "English",
                "Dutch (Flemish)",
                "German",
                "Spanish",
                "Italian",
                "Portuguese",
                "Arabic"
              ]
            },
            "default": [
              "fr"
            ]
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Keep only jobs matching one of these places. A city (<code>Lyon</code>), a postal code (<code>75008</code>), a French department code or name (<code>69</code>, <code>Gironde</code>), a region (<code>Île-de-France</code>), or any part of the location text.",
            "items": {
              "type": "string"
            }
          },
          "contractTypes": {
            "title": "Contract types",
            "type": "array",
            "description": "Keep only these contract types. The Actor maps every source label to one type (Full-time and Permanent become CDI, Internship becomes Stage, Apprenticeship becomes Alternance...). A job whose contract cannot be established is left out when this filter is set.",
            "items": {
              "type": "string",
              "enum": [
                "CDI",
                "CDD",
                "STAGE",
                "ALTERNANCE",
                "INTERIM",
                "FREELANCE",
                "VIE",
                "VIA",
                "SERVICE_CIVIQUE",
                "VOLONTARIAT",
                "FONCTION_PUBLIQUE"
              ],
              "enumTitles": [
                "CDI",
                "CDD",
                "Stage",
                "Alternance",
                "Intérim",
                "Freelance",
                "VIE",
                "VIA",
                "Service civique",
                "Volontariat",
                "Fonction publique"
              ]
            }
          },
          "remoteOnly": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "Keep only fully remote jobs, or jobs the source flags as remote.",
            "default": false
          },
          "postedWithinDays": {
            "title": "Posted within (days)",
            "minimum": 1,
            "type": "integer",
            "description": "Keep only jobs published in the last N days. Jobs without a publication date (Workday boards serve none) are left out when this is set: use <b>New jobs only</b> mode for reliable freshness instead."
          },
          "maxResultsPerSource": {
            "title": "Max results per source",
            "minimum": 0,
            "type": "integer",
            "description": "Stops each source once it has returned this many jobs (after filters and duplicates). <b>100 by default.</b><br><br>Set <code>0</code> for no cap: every source is then read to the end, which can mean hundreds of thousands of jobs (EURES alone serves over 400,000), all of them charged.",
            "default": 100
          },
          "maxMinutesPerSource": {
            "title": "Max minutes per source",
            "minimum": 0,
            "type": "integer",
            "description": "Stops a source that is still reading after this many minutes; the jobs it already returned are kept, and the status message says which sources stopped. <b>15 by default.</b><br><br>Some sources read one page per job (Taleez, ReKrute, Choisir le service public) and take an hour or more to read in full. Raise this value to read further, or set <code>0</code> for no time limit.",
            "default": 15
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "all",
              "new-only"
            ],
            "type": "string",
            "description": "<b>All live jobs</b> returns every matching job on every run.<br><br><b>New jobs only</b> keeps a persistent registry of what previous runs returned and outputs only what is new. Schedule it daily: a quiet day costs the start fee alone. The registry is tied to your sources, filters and companies; change them and a new registry starts.",
            "default": "all"
          },
          "includeDescription": {
            "title": "Include full job description",
            "type": "boolean",
            "description": "Adds the full job description as plain text. Off by default: on some boards it costs one extra request per job and makes the run several times longer. It does not change the price.",
            "default": false
          },
          "includeRaw": {
            "title": "Include raw source payload",
            "type": "boolean",
            "description": "Keeps the <code>raw</code> field: the original job object exactly as the source served it. Off by default for a lighter dataset.",
            "default": false
          },
          "registryKey": {
            "title": "Delta registry key",
            "type": "string",
            "description": "Only for <b>New jobs only</b>. Leave empty and the registry is derived from your input. Set it to make several schedules share one memory."
          },
          "webhookUrl": {
            "title": "Webhook URL",
            "type": "string",
            "description": "If set, the Actor POSTs a small JSON summary to this URL at the end of the run, only when at least one job was returned. Stored encrypted, like a password, since a webhook URL often carries a token. An unreachable webhook never fails the run."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Only used by sources that need it (today: <code>emploi_cm</code>). All other sources always connect directly.<br><br><code>emploi_cm</code> needs a <b>residential</b> proxy: the site blocks Apify datacenter IPs. Leave this off if you do not run <code>emploi_cm</code>."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}