Google Jobs Scraper - Aggregated Postings + Apply Links
Pricing
$2.49 / 1,000 job postings
Go to Apify Store
Google Jobs Scraper - Aggregated Postings + Apply Links
Pricing
$2.49 / 1,000 job postings
You can access the Google Jobs Scraper - Aggregated Postings + Apply Links programmatically from your own applications by using the Apify API. You can also choose the language preference from below. To use the Apify API, you’ll need an Apify account and your API token, found in API & Integrations in Apify Console.
{ "openapi": "3.0.1", "info": { "version": "0.2", "x-build-id": "3TG4QwTeBH3IIPiRO" }, "servers": [ { "url": "https://api.apify.com/v2" } ], "paths": { "/acts/lanternlab318~google-jobs/run-sync-get-dataset-items": { "post": { "operationId": "run-sync-get-dataset-items-lanternlab318-google-jobs", "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/lanternlab318~google-jobs/runs": { "post": { "operationId": "runs-sync-lanternlab318-google-jobs", "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/lanternlab318~google-jobs/run-sync": { "post": { "operationId": "run-sync-lanternlab318-google-jobs", "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", "required": [ "queries" ], "properties": { "queries": { "title": "Search terms", "type": "array", "description": "One job search term per line, for example \"software engineer\" or \"registered nurse\". Every term is searched separately and its results are labelled with it. A posting that matches several of your terms is returned once and charged once. Google serves ten postings per search term, so more coverage comes from more terms, not from a higher limit.", "items": { "type": "string" } }, "location": { "title": "Location", "type": "string", "description": "City, region or country to search in, for example \"New York, NY\", \"Berlin\" or \"Moscow\". Google Jobs has no separate location field: this is appended to every search term, which is exactly how the location filter on the page is set. Leave it empty to let Google pick by country." }, "country": { "title": "Country", "type": "string", "description": "Two-letter country code of the Google edition to search (the gl parameter), for example \"us\", \"de\", \"ru\", \"gb\". It decides which country's job market the results come from.", "default": "us" }, "language": { "title": "Language", "type": "string", "description": "Interface language of the search (the hl parameter), for example \"en\", \"de\", \"ru\". Pair it with a matching country. With \"en\" the posting date is also returned as an ISO timestamp; in other languages Google's wording is returned as written and postedAt is null rather than guessed.", "default": "en" }, "maxJobs": { "title": "Max job postings per search term", "minimum": 1, "maximum": 10, "type": "integer", "description": "Upper bound on the rows one search term may produce. Google's jobs panel serves ten postings per search term and offers no way to page past them, so ten is both the default and the maximum; the run reports per term when that ceiling, rather than your setting, ended the list.", "default": 10 }, "maxUpstreamRequests": { "title": "Max Google requests", "minimum": 1, "type": "integer", "description": "Hard ceiling on the HTTP requests this run sends to Google, retries included. At the ceiling collection stops - the search terms not reached are written with partialReason \"upstream_request_cap\" and the run then ends normally. Leave empty and the Actor works a ceiling out from your search terms, so a run is never unbounded." }, "proxyConfiguration": { "title": "Proxy", "type": "object", "description": "The proxy the requests to Google go through. Keep the default: Google answers a datacenter or residential IP with a page that only asks for JavaScript, while the Apify Google SERP proxy group returns the rendered jobs page. With any other group the run reports partialReason \"page_not_rendered\" rather than pretending there are no jobs.", "default": { "useApifyProxy": true, "apifyProxyGroups": [ "GOOGLE_SERP" ] } } } }, "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 } } } } } } } } }}OpenAPI is a standard for designing and describing RESTful APIs, allowing developers to define API structure, endpoints, and data formats in a machine-readable way. It simplifies API development, integration, and documentation.
OpenAPI is effective when used with AI agents and GPTs by standardizing how these systems interact with various APIs, for reliable integrations and efficient communication.
By defining machine-readable API specifications, OpenAPI allows AI models like GPTs to understand and use varied data sources, improving accuracy. This accelerates development, reduces errors, and provides context-aware responses, making OpenAPI a core component for AI applications.
You can download the OpenAPI definitions for Google Jobs Scraper - Aggregated Postings + Apply Links from the options below:
If you’d like to learn more about how OpenAPI powers GPTs, read our blog post.
You can also check out our other API clients: