---
title: "Google Jobs API: Search Job Listings as JSON | Perceptlayer"
description: "Google's Cloud Talent Solution searches your own jobs, not Google's jobs panel. GET /v1/google-jobs/search does, with date_posted, job_type and lrad filters."
url: https://perceptlayer.com/blog/google-jobs-api-search
---

[Blog](https://perceptlayer.com/blog) / [API guides](https://perceptlayer.com/blog/category/api-guides)

# Google Jobs API: Search Job Listings as JSON

17 Jul 2026 Perceptlayer 7 min read

Google has two job-related APIs, and neither searches the jobs panel you see in Google Search. Cloud Talent Solution indexes and searches job listings you upload yourself, and the Indexing API tells Google about your own job pages. To search Google's jobs results as JSON, `GET /v1/google-jobs/search?q=software+engineer` takes a query plus location, radius, date and job-type filters, and costs 1 credit per successful call.

## Key takeaways

-   Google Cloud Talent Solution is for job boards, career sites, staffing agencies and applicant tracking systems searching their own job inventory; it doesn't return Google's aggregated listings.
-   Getting your jobs into Google Search is a separate route: `JobPosting` structured data on each job page, plus the Indexing API for job URLs.
-   `GET /v1/google-jobs/search` has no required parameter; `q` (up to 500 characters), `uule`, `lrad` (5, 10, 25, 50 or 100), `date_posted` and `job_type` shape the search, and `next_page_token` pages through it.
-   `date_posted=today` keeps a daily pull to new postings only; 20 roles in 10 cities, one page each, is 200 calls and 200 credits a day.
-   We haven't recorded a Google Jobs response, so check the fields in the playground before you write a parser.

## Is there an official Google Jobs API?

Not one that searches Google's jobs results. Google's Cloud Talent Solution Job Search API is built for job boards, career site providers, staffing agencies and applicant tracking systems: you send it your own job and company records, it indexes them, and it returns ranked results for your own site's search box ( [Google Cloud, Job search basics](https://docs.cloud.google.com/talent-solution/job-search/v3/docs/basics), 2026). It's a search engine for your inventory, with features like commute-time search, and it searches only the listings you send it.

The other side is publishing. Google's job search experience in Search is fed by sites that add `JobPosting` structured data to each job detail page, with required properties including `title`, `description`, `datePosted` and `hiringOrganization` ( [Google Search Central](https://developers.google.com/search/docs/appearance/structured-data/job-posting), 2026). Google's Indexing API lets those sites notify it when job pages are added or removed ( [Google Search Central Blog](https://developers.google.com/search/blog/2018/06/introducing-indexing-api-for-job), 2018).

| You want to | Use |
| --- | --- |
| Search your own job inventory on your own site | Cloud Talent Solution |
| Get your jobs into Google's job results | `JobPosting` markup and the Indexing API |
| Read Google's job results for a query and place | [`/v1/google-jobs/search`](https://perceptlayer.com/apis/google-jobs/search) |

If you run a job board, the first two are the right tools and they're free or priced by Google. If you need what Google shows a job seeker for "data analyst in Leeds", that's the [Google Jobs API](https://perceptlayer.com/apis/google-jobs). Data is collected from publicly available sources and returned as found at the time of the call.

## Which parameters does the search endpoint take?

`GET /v1/google-jobs/search` takes ten optional parameters and requires none, though in practice you'll always send `q`. Types and allowed values below come from the endpoint definition. Defaults and units, such as whether `lrad` is in miles or kilometres, aren't documented, so test them in the playground.

| Parameter | Type | Allowed values or notes |
| --- | --- | --- |
| `q` | string | The job search, up to 500 characters, for example `software engineer` |
| `uule` | string | Encoded location, up to 500 characters |
| `lrad` | integer | Search radius: `5`, `10`, `25`, `50`, `100` |
| `date_posted` | string | `today`, `3days`, `week`, `month`, `1`, `3`, `7`, `14` |
| `job_type` | string | `full_time`, `part_time`, `contract`, `internship`, `remote` |
| `next_page_token` | string | Token for the next page of results |
| `uds` | string | Up to 1,000 characters |
| `hl` | string | Language, 2 characters |
| `gl` | string | Country, 2 characters |
| `google_domain` | string | Up to 50 characters, for example `google.co.uk` |

`date_posted` takes both words and day counts: `week` and `7` look like the same window, and `14` has no word equivalent. Pick one form and keep it, so runs are comparable. Location can also go in `q` as text ("nurse jobs in Leeds"), the way a person types it into Google; `uule` pins it to a place regardless of wording.

## How do you search Google Jobs?

Send a GET request with `q`. The request below is the endpoint's catalogue example. Put your key in the `X-API-Key` header; keys start with `sk_live_`, and the [authentication docs](https://docs.perceptlayer.com/authentication) cover the rest.

```bash
curl "https://api.perceptlayer.com/v1/google-jobs/search?q=software+engineer" \
  -H "X-API-Key: $API_KEY"
```

A narrower search for full-time roles posted in the last three days, from Google's UK domain:

```bash
curl "https://api.perceptlayer.com/v1/google-jobs/search?q=data+analyst+leeds&job_type=full_time&date_posted=3days&gl=gb&hl=en&google_domain=google.co.uk" \
  -H "X-API-Key: $API_KEY"
```

We haven't run either request for this article and have no recorded response, so we won't list response fields here. The [Search endpoint page](https://perceptlayer.com/apis/google-jobs/search) has a playground that runs the call with your key and shows the real output. Look for the job title, company, location, posting age and the token for the next page.

## How do you page through results?

Use `next_page_token`. The endpoint pages by token, not by page number: a response carries a token for the next page, and you send it back as `next_page_token` on the following call. Each page is one call and 1 credit. Since we haven't recorded a response, find the token's field name in the playground first.

```python
import os
import requests

URL = "https://api.perceptlayer.com/v1/google-jobs/search"
HEADERS = {"X-API-Key": os.environ["API_KEY"]}

def search_jobs(params, get_jobs, get_token, max_pages=3):
    """get_jobs(body) returns the list of jobs; get_token(body) the next-page token or None.
    Write both once you've seen a real response in the playground."""
    jobs, token = [], None
    for _ in range(max_pages):
        p = dict(params, next_page_token=token) if token else params
        r = requests.get(URL, headers=HEADERS, params=p, timeout=60)
        if r.status_code == 404:
            break
        r.raise_for_status()
        body = r.json()
        jobs.extend(get_jobs(body))
        token = get_token(body)
        if not token:
            break
    return jobs
```

This sketch hasn't been run against the live API. It treats `not_found` (404), which costs nothing, as the end of the results, and caps pages so a broad query can't run up credits. For retries on `rate_limited` and `temporarily_unavailable`, see [handling web data API errors in Python](https://perceptlayer.com/blog/handle-web-data-api-errors-python).

## What does a daily role-and-city pull cost?

Every call costs 1 credit on success; failed calls cost nothing and return `X-Credits-Used: 0`. Each success returns `X-Credits-Used` and `X-Credits-Remaining`. For a daily pull, `date_posted=today` keeps each run to new postings, which keeps the page count low. The [credits docs](https://docs.perceptlayer.com/credits) explain billing.

| Job | Calls a day | Credits a month (30 days) |
| --- | --- | --- |
| 5 roles × 4 cities, 1 page each | 20 | 600 |
| 20 roles × 10 cities, 1 page each | 200 | 6,000 |
| 20 roles × 10 cities, up to 3 pages each | up to 600 | up to 18,000 |

Worked example: 20 roles in 10 cities is 200 searches; at one page each, 200 × 1 credit = 200 credits a day, or 6,000 credits over 30 days. The 1,000 free credits you get every month after verifying an email address cover the first row. The second row, 6,000 credits a month, fits more than eight times in a Build pack of 50,000 credits, and purchased credits last 12 months. See [pricing](https://perceptlayer.com/pricing) for what credits cost.

At the free tier's 1 request a second, 200 calls take a little over three minutes; paid packs run at 5 a second or more, per the [rate limits docs](https://docs.perceptlayer.com/rate-limits).

## What should you watch for in Google Jobs data?

Duplicates and posting age. Google's jobs results aggregate postings from employer career sites and job boards, so the same role often appears through several sites, and the same posting can come back on consecutive days. Deduplicate on company, title and location rather than on a URL, as our guide to [deduplicating listings across sources](https://perceptlayer.com/blog/deduplicate-listings-across-sources) explains.

Posting age is often shown in relative terms ("3 days ago"), so convert it to a date at collection time and store both. Salary appears only when the posting includes it, and advertised ranges have their own biases; [salary data from job sites](https://perceptlayer.com/blog/salary-data-job-sites-bias) covers how to read them. For a research use of the same data, see [job posting data for labour-market research](https://perceptlayer.com/blog/job-posting-data-labour-market-research), and to compare with a single board, the [Indeed jobs API guide](https://perceptlayer.com/blog/indeed-jobs-api-json).

## Can an AI agent search Google Jobs?

Yes. The MCP server at `https://api.perceptlayer.com/mcp` exposes `search_endpoints` and `get_endpoint`, which are free catalogue lookups, and `call_endpoint`, which runs `google-jobs.search` and spends 1 credit on success. An agent can turn "remote Python contract roles posted this week" into `q`, `job_type=contract` and `date_posted=week`.

Our [job search agent tutorial](https://perceptlayer.com/blog/job-search-agent-live-postings) builds one that matches postings to a CV. Setup is in the [AI agents docs](https://docs.perceptlayer.com/ai-agents), and error codes are in the [errors docs](https://docs.perceptlayer.com/errors). The other job sources in the catalogue are on the [jobs APIs](https://perceptlayer.com/verticals/jobs) page.

To see the response, [get a free API key](https://perceptlayer.com/signup) and run a search for your role and city in the playground on the [Google Jobs API page](https://perceptlayer.com/apis/google-jobs).

## APIs in this post

-   [Google Jobs **1 credit per call** · 1 endpoint](https://perceptlayer.com/apis/google-jobs)

## Frequently asked questions

### Does Google have a jobs API?

Google has Cloud Talent Solution, which indexes and searches job listings you upload for your own job board or careers site, and the Indexing API for notifying Google about your job pages. Neither returns Google's aggregated job results. `GET /v1/google-jobs/search` returns those as JSON, at 1 credit per successful call.

### How do I get my jobs to show up in Google's job search?

Add `JobPosting` structured data to each job detail page, with the required properties such as `title`, `description`, `datePosted` and `hiringOrganization`, and use Google's Indexing API to notify it when job pages are added or removed. Google's Search Central documentation covers the markup rules. That's a publishing task, separate from reading results.

### How much does the Google Jobs endpoint cost?

1 credit per successful call; each further page is another call, and failed calls cost nothing. A daily pull of 20 roles in 10 cities at one page each is 6,000 credits a month. Every account gets 1,000 free credits a month after verifying an email address. The [pricing page](https://perceptlayer.com/pricing) has what credits cost.

### How do I filter by date or job type?

Use `date_posted` with `today`, `3days`, `week`, `month` or a day count of `1`, `3`, `7` or `14`, and `job_type` with `full_time`, `part_time`, `contract`, `internship` or `remote`. `lrad` sets a radius of 5, 10, 25, 50 or 100 around the location in `uule` or the query.

### What happens if a search fails?

You get an HTTP status and a JSON error with a `code`, `message` and `request_id`, and nothing is debited. A search with no results can come back as `not_found` (404), which also costs nothing. Rate-limited (429) and temporarily unavailable (503) responses carry `Retry-After` with the seconds to wait. The [errors docs](https://docs.perceptlayer.com/errors) list every code.

google jobs job listings job search api labour market json

## More from the blog

1.  [API guides](https://perceptlayer.com/blog/category/api-guides) 14 Oct 2026 Perceptlayer 7 min read
    
    ## [Google News API: Search News Articles as JSON](https://perceptlayer.com/blog/google-news-api)
    
    One GET call to /v1/google-news/news returns articles with title, link, source and ISO date as JSON for 1 credit. Parameters, a real response, cost.
    
2.  [API guides](https://perceptlayer.com/blog/category/api-guides) 13 Oct 2026 Perceptlayer 6 min read
    
    ## [Google Patents API: Search Patents and Get Details](https://perceptlayer.com/blog/google-patents-api-search-details)
    
    Search Google Patents by keyword, inventor or assignee with one GET call, then fetch full details by patent\_id. Both endpoints cost 1 credit per call.
    
3.  [API guides](https://perceptlayer.com/blog/category/api-guides) 20 Aug 2026 Perceptlayer 6 min read
    
    ## [DuckDuckGo Search API: Web Results as JSON](https://perceptlayer.com/blog/duckduckgo-search-api-json)
    
    DuckDuckGo's Instant Answer API returns topic summaries, not ranked links. GET /v1/duckduckgo/search returns organic results and paging at 1 credit per query.
