{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Jobs Scraper - Salary, Apply Links & Descriptions",
    "description": "Scrape Google Jobs by keyword and location: title, employer, location, salary (min/max/currency/period), employment type, remote flag, posting date, full description, requirements and every apply link. Optional employer emails. Export to Excel/CSV/JSON or run via API.",
    "version": "1.0",
    "x-build-id": "hmvpdBcPl1nTmoAAx"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/pro100chok~google-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-pro100chok-google-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/pro100chok~google-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-pro100chok-google-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/pro100chok~google-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-pro100chok-google-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": {
          "queries": {
            "title": "Job titles or keywords",
            "type": "array",
            "description": "What to search for on Google Jobs — job titles, skills or free-text phrases. Every keyword is searched in every location, so this is the main lever for volume. Examples: \"software engineer\", \"registered nurse\", \"warehouse operative\".",
            "default": [
              "software engineer"
            ],
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Cities, states or regions to search in, e.g. \"New York\", \"London\", \"Texas\". IMPORTANT: Google's jobs results are strongly location-driven — a keyword searched with no location returns far fewer postings. Adding locations is the most reliable way to get more jobs.",
            "default": [
              "New York"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Maximum jobs",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap on the total number of jobs returned across all keywords and locations, after de-duplication. Set 0 for no limit (the run then stops when Google has no new postings left). Google shows ~10 jobs per search, so the realistic ceiling is roughly keywords x locations x 60.",
            "default": 100
          },
          "startUrls": {
            "title": "Google Jobs URLs (optional)",
            "type": "array",
            "description": "Paste any Google jobs-vertical URL to scrape it directly, e.g. https://www.google.com/search?q=nurse+jobs+in+chicago&udm=8. Older ibp=htl;jobs links are accepted and upgraded automatically. Use this instead of keywords when you already have a search URL you like.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "countryCode": {
            "title": "Country",
            "enum": [
              "us",
              "gb",
              "ca",
              "au",
              "nz",
              "ie",
              "in",
              "sg",
              "my",
              "ph",
              "hk",
              "jp",
              "ae",
              "sa",
              "za",
              "ng",
              "ke",
              "br",
              "mx",
              "ar",
              "cl",
              "co",
              "de",
              "fr",
              "es",
              "it",
              "nl",
              "se",
              "no",
              "dk",
              "fi",
              "pl",
              "ch",
              "at"
            ],
            "type": "string",
            "description": "Which country's Google results to use. This controls which local job boards appear and which currency salaries are reported in. NOTE: Google has wound its jobs widget down across much of the EU — the US, UK, Canada, Australia, India and Singapore return the richest results.",
            "default": "us"
          },
          "languageCode": {
            "title": "Language",
            "type": "string",
            "description": "Two-letter language code for the results, e.g. \"en\", \"de\", \"es\". Job titles, descriptions and date labels come back in this language. Match it to your chosen country for the best coverage.",
            "default": "en"
          },
          "datePosted": {
            "title": "Posted within",
            "enum": [
              "any",
              "today",
              "3days",
              "week",
              "month"
            ],
            "type": "string",
            "description": "Only return jobs published in this window. Because Google returns about ten jobs per search, filtering here gives you ten FRESH postings instead of ten mixed-age ones. Choose \"Any time\" to disable.",
            "default": "any"
          },
          "employmentTypes": {
            "title": "Employment type",
            "type": "array",
            "description": "Only return these employment types. Google honours one type per search, so each type you tick becomes its own search — which WIDENS coverage as well as filtering, because each type returns a largely different set of postings. Leave empty for all types.",
            "items": {
              "type": "string",
              "enum": [
                "FULLTIME",
                "PARTTIME",
                "CONTRACTOR",
                "INTERN",
                "TEMPORARY",
                "VOLUNTEER"
              ],
              "enumTitles": [
                "Full-time",
                "Part-time",
                "Contractor",
                "Internship",
                "Temporary",
                "Volunteer"
              ]
            },
            "default": []
          },
          "remoteOnly": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "Only return remote / work-from-home roles, using Google's own remote filter plus a check on the posting itself. Enable this when you want work-from-home listings exclusively.",
            "default": false
          },
          "salaryOnly": {
            "title": "Only jobs with a salary",
            "type": "boolean",
            "description": "Keep only postings where Google displayed a salary. Roughly a third of listings show one, so this filter cuts volume substantially — raise Maximum jobs to compensate.",
            "default": false
          },
          "minSalary": {
            "title": "Minimum salary",
            "minimum": 0,
            "type": "integer",
            "description": "Drop postings whose advertised salary is below this number, in the country's own currency and in whatever period the posting uses (yearly, hourly, …). Leave 0 to keep every salary. Postings without a salary are dropped by this filter.",
            "default": 0
          },
          "postedWithinHours": {
            "title": "Posted within (hours)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only postings published in the last N hours, checked against the exact age Google reports. 24 = last day, 168 = last week. Leave 0 to keep all ages. Useful for hourly job alerts where the \"Posted within\" dropdown is too coarse.",
            "default": 0
          },
          "companyFilter": {
            "title": "Only these employers",
            "type": "array",
            "description": "Keep only postings whose employer name contains one of these values (case-insensitive). Example: \"Amazon\", \"Google\". Leave empty for all employers.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeCompanies": {
            "title": "Exclude these employers",
            "type": "array",
            "description": "Drop postings whose employer name contains one of these values. Useful for filtering out staffing agencies and recruitment mills that repost the same roles.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "viaFilter": {
            "title": "Only these source boards",
            "type": "array",
            "description": "Keep only postings Google syndicated from these boards, matched against the \"via\" field and the apply links. Example: \"LinkedIn\", \"Indeed\". Leave empty for all sources.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "titleIncludeKeywords": {
            "title": "Title must contain",
            "type": "array",
            "description": "Keep only postings whose job title contains one of these words. Use it to tighten a broad search, e.g. keep only \"senior\" or \"lead\" roles.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "titleExcludeKeywords": {
            "title": "Title must not contain",
            "type": "array",
            "description": "Drop postings whose job title contains one of these words, e.g. \"intern\", \"unpaid\", \"commission\".",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "onlyNewJobs": {
            "title": "Only new jobs (skip ones seen in earlier runs)",
            "type": "boolean",
            "description": "Return only postings no previous run of this Actor has already returned. Job identity is remembered in the Actor's key-value store, so scheduling this daily gives you a clean job alert and you are never charged twice for the same posting.",
            "default": false
          },
          "scrapeEmails": {
            "title": "Find employer emails, phones and socials",
            "type": "boolean",
            "description": "For each posting, resolve the employer's own website from the apply links and scrape its contact and about pages for a public email address, phone number and social profiles. Adds the email, emails, phone, companyWebsite, linkedin and facebook fields. Each employer site is visited once per run and shared by all their postings.",
            "default": false
          },
          "skipJobsWithoutEmail": {
            "title": "Only jobs with an employer email",
            "type": "boolean",
            "description": "Drop postings for which no employer email could be found. Requires the employer contact option above. Turn this on when you are building a recruiting outreach list rather than a job feed.",
            "default": false
          },
          "expandSearch": {
            "title": "Expand the search automatically",
            "type": "boolean",
            "description": "Google returns only ten jobs per search, so the Actor asks each keyword several different ways — its own filter chips, employment types, seniority wording and recency windows — to reach the number of jobs you asked for. Turn this off to run only your exact keywords and get at most ten jobs each.",
            "default": true
          },
          "googleDomain": {
            "title": "Google domain",
            "type": "string",
            "description": "Which Google domain to query, e.g. \"www.google.co.uk\" or \"www.google.ca\". Leave as the default unless you specifically need a country domain; the Country setting above already localizes the results.",
            "default": "www.google.com"
          },
          "concurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many Google searches run at the same time. Higher is faster; 6 is a good balance. Lower it only if you want a gentler, slower run.",
            "default": 6
          },
          "maxRetries": {
            "title": "Maximum retries per request",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "How many times a single failed Google request is retried on a fresh connection before that search slice is skipped. The default handles normal hiccups; raise it for very large runs on slow networks.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy used when visiting employer websites for the email lookup. Google itself is always fetched through the Actor's own built-in route, so this setting has no effect unless the employer contact option is enabled. Residential proxies give the best results on company sites.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}