Playground Sign in Start free
APIs

SERP API

Deep dives

Retrieve Google search results programmatically with customizable location, language, and device settings. Supports web search, images, news, videos, maps, jobs, and AI mode.

Authentication

All API requests require authentication using an API key. Include your API key in the request header.

INFO - Get your API key

Sign up for a free account to receive your API key instantly at ujeebu.com/signup.

Header Format

GET ApiKey: YOUR_API_KEY

Basic Request

Make a search request by sending a GET request to the endpoint with your search query.

Endpoint

GET https://api.ujeebu.com/serp

Code Examples

curl -X GET 'https://api.ujeebu.com/serp?search=web+scraping' \
  -H "ApiKey: YOUR_API_KEY"
const response = await fetch('https://api.ujeebu.com/serp?search=web+scraping', {
  headers: {
    'ApiKey': 'YOUR_API_KEY'
  }
});

const data = await response.json();
console.log(data);
import { UjeebuClient } from '@ujeebu-org/ujeebu-sdk';

const client = new UjeebuClient(process.env.UJEEBU_API_KEY);

const results = await client.searchText('web scraping', {
  results_count: 10
});

console.log(results.data);
import requests

response = requests.get(
    'https://api.ujeebu.com/serp',
    params={'search': 'web scraping'},
    headers={'ApiKey': 'YOUR_API_KEY'}
)

print(response.json())
from ujeebu_python import UjeebuClient

ujeebu = UjeebuClient(api_key='YOUR_API_KEY')

results = ujeebu.search_text(
    search='web scraping',
    params={'results_count': 10}
)

print(results)
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://api.ujeebu.com/serp?search=web+scraping")
  .addHeader("ApiKey", "YOUR_API_KEY")
  .build();

Response response = client.newCall(request).execute();
System.out.println(response.body().string());
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => 'https://api.ujeebu.com/serp?search=web+scraping',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'ApiKey: YOUR_API_KEY'
  ],
]);

$response = curl_exec($curl);
curl_close($curl);

echo $response;
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, _ := http.NewRequest("GET", "https://api.ujeebu.com/serp?search=web+scraping", nil)
	req.Header.Add("ApiKey", "YOUR_API_KEY")
	
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	
	body, _ := ioutil.ReadAll(res.Body)
	fmt.Println(string(body))
}
package main

import (
	"fmt"
	"github.com/ujeebu/ujeebu-go"
)

func main() {
	client, err := ujeebu.NewClient("YOUR_API_KEY")
	if err != nil {
		panic(err)
	}
	
	results, _, err := client.GoogleSearch(ujeebu.SerpParams{
		Search:       "web scraping",
		ResultsCount: 10,
	})
	if err != nil {
		panic(err)
	}
	
	fmt.Println(results)
}

Request Parameters

TIP - Required Parameters

You must provide either url (full Google search URL) or search (search query). Choose the method that best fits your use case.

Parameter Type Required Default Description
url string No - URL of the search page to retrieve. Either this or search parameter is required: provide either the search term or the Google search page URL.
search string No - The search query to perform on Google. Either this or url parameter is required: provide either the search term or the Google search page URL.
search_type string No search Specifies the type of search. Possible values include 'search', 'images', 'news', 'videos', 'maps', 'jobs', 'job' (a single Google Jobs listing, see Google Job lookup), or 'ai'.
lang string No en Language of search results. Expects an ISO 639-1 language code (e.g., 'en' for English, 'es' for Spanish). With a place name in location outside English-speaking countries, set the local language (e.g. location=Berlin, Germany&lang=de).
location string No US Where the search comes from: a 2-letter country code (e.g. 'us', 'uk', 'fr') or a place name such as 'Austin, TX', 'Manchester, England' or 'Berlin, Germany' (up to 100 characters), which Google uses to target the results. Works for every search type.
device string No desktop The type of device to simulate during the search. Possible values: 'desktop', 'mobile'.
results_count number No 10 The number of results to return, 1 to 100. Without batch, at most one results page (about 10; a higher value returns 10). With batch, the total to collect across pages, up to 100.
page number No 1 The results page to retrieve, 1 to 40, Google Jobs included (10 jobs per page). Each response links the next page in pagination.api.next. Not for the job lookup (search_type=job).
batch boolean No false Collect several results pages in one request, up to results_count (1 to 100). Ujeebu fetches the pages one after the other and returns them as one list, numbered by position, without duplicates. 5 credits per page (per 10 results). Not for search_type=job. See Batch: up to 100 results in one request.
radius number No - Jobs only. Distance in kilometres (1 to 1000) around the place in location; needs a place name, not a country code. Google treats it as a preference, not a hard cut-off.
remote boolean No false Jobs only. true returns remote listings only (location "Anywhere").
date_posted string No - Jobs only. Listings posted today, in the last 3days, week or month.
employment_type string No - Jobs only. FULLTIME, PARTTIME, CONTRACTOR, INTERN or TEMPORARY; several, comma-separated, match any of them (e.g. FULLTIME,CONTRACTOR). Case-insensitive; full-time, part-time, contract, internship and temp work too. Google applies it loosely: check detected_extensions.schedule_type.
job_id string No - Job lookup only (search_type=job, where it is required). The job_id of a listing from a jobs result. Send it with search set to that listing's title, company and location: with a bare keyword in search the lookup answers 404 "Job not found".
extra_params string No - Additional Google query parameters added to the Google URL (e.g., '&safe=active'), for Google options without their own parameter above.
with_html boolean No false Include the raw HTML of the search results page alongside the parsed data.
html_only boolean No false Return only the raw HTML of the search results page, without any parsing.

Response Format

Status Meaning Description Schema
200 OK successful operation SuccessResponse
400 Bad Request Invalid parameter value APIResponseError
404 Not Found Job lookup only: the listing is gone ({"error": "Job not found."}) APIResponseError

Success Response Schema

The response schema depends on the specified search type (e.g., search, images, news, videos, maps, jobs, or ai). Each search type has a unique response structure. Please refer to the example sections below to see the specific schema for each search type.

For a search search type, the response schema is as follows:

{
    "knowledge_graph": {
        "born": "July 10, 1856, Smiljan, Croatia",
        "died": "January 7, 1943 (age 86\u00a0years), The New Yorker A Wyndham Hotel, New York, NY",
        "education": "TU Graz (1875\u20131878), Gimnazija Karlovac (1870\u20131873)",
        "height": "6\u2032 2\u2033",
        "parents": "Milutin Tesla, \u0110uka Tesla",
        "siblings": "Dane Tesla, Angelina Tesla, Milka Tesla, Marica Kosanovi\u0107",
        "title": "Nikola Tesla",
        "type": "Engineer and futurist"
    },
    "metadata": {
        "google_url": "https:\/\/www.google.com\/search?gl=US&hl=en&num=10&q=Nikola+Tesla&sei=defQZ8riGZOt5NoPk7_S4AU",
        "number_of_results": 36800000,
        "query_displayed": "Nikola Tesla",
        "results_time": "0.29 seconds"
    },
    "organic_results": [
        {
            "cite": "https:\/\/en.wikipedia.org \u203a wiki \u203a Nikola_Tesla",
            "link": "https:\/\/en.wikipedia.org\/wiki\/Nikola_Tesla",
            "position": 1,
            "site_name": "Wikipedia",
            "title": "Nikola Tesla"
        },
        {
            "cite": "https:\/\/www.britannica.com \u203a ... \u203a Matter & Energy",
            "link": "https:\/\/www.britannica.com\/biography\/Nikola-Tesla",
            "position": 2,
            "site_name": "Britannica",
            "title": "Nikola Tesla | Biography, Facts, & Inventions"
        },
        ...
    ],
    "pagination": {
        "google": {
            "current": "https:\/\/google.com\/search?gl=US&hl=en&num=10&q=Nikola+Tesla&",
            "next": "https:\/\/google.com\/search?gl=US&hl=en&num=10&q=Nikola+Tesla&start=20&tbm=&",
            "other_pages": {
                "3": "https:\/\/google.com\/search?gl=US&hl=en&num=10&q=Nikola+Tesla&start=30&tbm=&",
                "4": "https:\/\/google.com\/search?gl=US&hl=en&num=10&q=Nikola+Tesla&start=40&tbm=&",
                ...
            }
        },
        "api": {
            "current": "https:\/\/api.ujeebu.com\/serp?device=desktop&lang=en&location=US&page=1&results_count=10&search=Nikola+Tesla&",
            "next": "https:\/\/api.ujeebu.com\/serp?device=desktop&lang=en&location=US&page=2&results_count=10&search=Nikola+Tesla&",
            "other_pages": {
                "3": "https:\/\/api.ujeebu.com\/serp?device=desktop&lang=en&location=US&page=3&results_count=10&search=Nikola+Tesla&",
                "4": "https:\/\/api.ujeebu.com\/serp?device=desktop&lang=en&location=US&page=4&results_count=10&search=Nikola+Tesla&",
                ...
            }
        }
    },
    "related_questions": [
        "What is Nikola Tesla famous for?",
        "How much money did Nikola Tesla have when he died?",
        ...
    ],
    "top_stories": [],
    "videos": [
        {
            "author": "BMResearch",
            "date": "1 month ago",
            "link": "https:\/\/www.google.com\/search?gl=US&hl=en&num=10&q=Nikola+Tesla&sei=defQZ8riGZOt5NoPk7_S4AU#",
            "title": "Nikola Tesla: The Forgotten Genius of Electricity! (1856\u20131943)"
        },
        ...
    ],
    "ai_overview": {
        "text": "Nikola Tesla was a Serbian-American inventor, electrical engineer, and futurist...",
        "text_blocks": [
            {
                "type": "paragraph",
                "content": "Nikola Tesla was a Serbian-American inventor, electrical engineer, and futurist best known for his contributions to the design of the modern alternating current (AC) electricity supply system.",
                "links": [{"text": "alternating current", "link": "https://en.wikipedia.org/wiki/Alternating_current"}]
            },
            {
                "type": "list",
                "content": [
                    "Invented the Tesla coil and AC induction motor",
                    "Pioneered wireless communication and radio technology",
                    "Held over 300 patents worldwide"
                ]
            }
        ],
        "references": [
            {"title": "Nikola Tesla - Wikipedia", "link": "https://en.wikipedia.org/wiki/Nikola_Tesla"},
            {"title": "Nikola Tesla | Biography & Facts", "link": "https://www.britannica.com/biography/Nikola-Tesla"}
        ]
    }
}

:::note The ai_overview field may be null if Google does not show Google AI Overviews for the given query. It is only included in standard web search results (search_type=search). :::

Error Response Schema

{
  "status": "error",
  "message": "Description of the error.",
  "code": 400
}

A 400 explains which parameter is wrong, for example:

  • a jobs filter (radius, remote, date_posted, employment_type) with a search type other than jobs;
  • radius without a place name in location, or outside 1 to 1000;
  • date_posted other than today, 3days, week or month;
  • employment_type with a value outside the list above;
  • location that is neither a 2-letter code nor a place name of up to 100 characters;
  • results_count outside 1 to 100 (Please provide a value between 1 and 100.), or page outside 1 to 40;
  • search_type=job without job_id or without search, job_id with another search type, or batch with search_type=job.

Rate Limits & Credits

All SERP requests are billed at 5 credits per successful request, including a Google Job lookup (search_type=job). A batch request is billed 5 credits per results page, that is per 10 results requested, rounded up: results_count=30 costs 15 credits, results_count=51 costs 30 credits and results_count=100 costs 50 credits.

INFO - Credits Header

Consumed credits are returned in the Ujb-credits header. A batch response also carries Ujb-Batch-Pages, the number of pages billed.

Examples

Use the following example to perform a standard web search on Google. Pass parameters like search term, language, and results count as needed.

curl --location 'https://api.ujeebu.com/serp?timeout=90000&lang=en&results_count=10&search=Nikola%20Tesla' \
--header 'ApiKey: YOUR_API_KEY'
const response = await fetch('https://api.ujeebu.com/serp?timeout=90000&lang=en&results_count=10&search=Nikola%20Tesla', {
  headers: {
    'ApiKey': 'YOUR_API_KEY'
  }
});

const data = await response.json();
console.log(data.organic_results);
console.log(data.knowledge_graph);
import { UjeebuClient } from '@ujeebu-org/ujeebu-sdk';

const client = new UjeebuClient(process.env.UJEEBU_API_KEY);

const results = await client.searchText('Nikola Tesla', {
  lang: 'en',
  results_count: 10,
  location: 'US'
});

console.log(results.data.organic_results);
console.log(results.data.knowledge_graph);
import requests

response = requests.get(
    'https://api.ujeebu.com/serp',
    params={
        'search': 'Nikola Tesla',
        'lang': 'en',
        'results_count': 10,
        'timeout': 90000
    },
    headers={'ApiKey': 'YOUR_API_KEY'}
)

data = response.json()
print(data['organic_results'])
print(data['knowledge_graph'])
from ujeebu_python import UjeebuClient

ujeebu = UjeebuClient(api_key='YOUR_API_KEY')

response = ujeebu.search_text(
    search='Nikola Tesla',
    params={
        'lang': 'en',
        'results_count': 10,
        'location': 'US'
    }
)

data = response.json()
print(data['organic_results'])
print(data['knowledge_graph'])
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://api.ujeebu.com/serp?timeout=90000&lang=en&results_count=10&search=Nikola%20Tesla")
  .addHeader("ApiKey", "YOUR_API_KEY")
  .build();

Response response = client.newCall(request).execute();
System.out.println(response.body().string());
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => 'https://api.ujeebu.com/serp?timeout=90000&lang=en&results_count=10&search=Nikola%20Tesla',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'ApiKey: YOUR_API_KEY'
  ],
]);

$response = curl_exec($curl);
curl_close($curl);

echo $response;
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, _ := http.NewRequest("GET", "https://api.ujeebu.com/serp?timeout=90000&lang=en&results_count=10&search=Nikola%20Tesla", nil)
	req.Header.Add("ApiKey", "YOUR_API_KEY")
	
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	
	body, _ := ioutil.ReadAll(res.Body)
	fmt.Println(string(body))
}
package main

import (
	"fmt"
	"github.com/ujeebu/ujeebu-go"
)

func main() {
	client, err := ujeebu.NewClient("YOUR_API_KEY")
	if err != nil {
		panic(err)
	}
	
	results, _, err := client.GoogleSearch(ujeebu.SerpParams{
		Search:       "Nikola Tesla",
		Lang:         "en",
		ResultsCount: 10,
		Location:     "US",
	})
	if err != nil {
		panic(err)
	}
	
	fmt.Println(results.OrganicResults)
	fmt.Println(results.KnowledgeGraph)
}

Search for news articles using the SDK helper methods.

curl --location 'https://api.ujeebu.com/serp?search=artificial%20intelligence&search_type=news&lang=en&results_count=20' \
--header 'ApiKey: YOUR_API_KEY'
const response = await fetch('https://api.ujeebu.com/serp?search=artificial%20intelligence&search_type=news&lang=en&results_count=20', {
  headers: {
    'ApiKey': 'YOUR_API_KEY'
  }
});

const data = await response.json();
console.log(data.news);
import { UjeebuClient } from '@ujeebu-org/ujeebu-sdk';

const client = new UjeebuClient(process.env.UJEEBU_API_KEY);

const newsResults = await client.searchNews('artificial intelligence', {
  lang: 'en',
  results_count: 20
});

console.log(newsResults.data.news);
import requests

response = requests.get(
    'https://api.ujeebu.com/serp',
    params={
        'search': 'artificial intelligence',
        'search_type': 'news',
        'lang': 'en',
        'results_count': 20
    },
    headers={'ApiKey': 'YOUR_API_KEY'}
)

data = response.json()
print(data['news'])
from ujeebu_python import UjeebuClient

ujeebu = UjeebuClient(api_key='YOUR_API_KEY')

response = ujeebu.search_news(
    search='artificial intelligence',
    params={
        'lang': 'en',
        'results_count': 20
    }
)

data = response.json()
print(data['news'])
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://api.ujeebu.com/serp?search=artificial%20intelligence&search_type=news&lang=en&results_count=20")
  .addHeader("ApiKey", "YOUR_API_KEY")
  .build();

Response response = client.newCall(request).execute();
System.out.println(response.body().string());
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => 'https://api.ujeebu.com/serp?search=artificial%20intelligence&search_type=news&lang=en&results_count=20',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'ApiKey: YOUR_API_KEY'
  ],
]);

$response = curl_exec($curl);
curl_close($curl);

echo $response;
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, _ := http.NewRequest("GET", "https://api.ujeebu.com/serp?search=artificial%20intelligence&search_type=news&lang=en&results_count=20", nil)
	req.Header.Add("ApiKey", "YOUR_API_KEY")
	
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	
	body, _ := ioutil.ReadAll(res.Body)
	fmt.Println(string(body))
}
package main

import (
	"fmt"
	"github.com/ujeebu/ujeebu-go"
)

func main() {
	client, err := ujeebu.NewClient("YOUR_API_KEY")
	if err != nil {
		panic(err)
	}
	
	newsResults, _, err := client.GoogleNewsSearch(ujeebu.SerpParams{
		Search:       "artificial intelligence",
		Lang:         "en",
		ResultsCount: 20,
	})
	if err != nil {
		panic(err)
	}
	
	fmt.Println(newsResults.News)
}

Search for images using the SDK helper methods.

curl --location 'https://api.ujeebu.com/serp?search=nature%20photography&search_type=images&results_count=50' \
--header 'ApiKey: YOUR_API_KEY'
const response = await fetch('https://api.ujeebu.com/serp?search=nature%20photography&search_type=images&results_count=50', {
  headers: {
    'ApiKey': 'YOUR_API_KEY'
  }
});

const data = await response.json();
console.log(data.images);
import { UjeebuClient } from '@ujeebu-org/ujeebu-sdk';

const client = new UjeebuClient(process.env.UJEEBU_API_KEY);

const imageResults = await client.searchImages('nature photography', {
  results_count: 50
});

console.log(imageResults.data.images);
import requests

response = requests.get(
    'https://api.ujeebu.com/serp',
    params={
        'search': 'nature photography',
        'search_type': 'images',
        'results_count': 50
    },
    headers={'ApiKey': 'YOUR_API_KEY'}
)

data = response.json()
print(data['images'])
from ujeebu_python import UjeebuClient

ujeebu = UjeebuClient(api_key='YOUR_API_KEY')

response = ujeebu.search_images(
    search='nature photography',
    params={'results_count': 50}
)

data = response.json()
print(data['images'])
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://api.ujeebu.com/serp?search=nature%20photography&search_type=images&results_count=50")
  .addHeader("ApiKey", "YOUR_API_KEY")
  .build();

Response response = client.newCall(request).execute();
System.out.println(response.body().string());
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => 'https://api.ujeebu.com/serp?search=nature%20photography&search_type=images&results_count=50',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'ApiKey: YOUR_API_KEY'
  ],
]);

$response = curl_exec($curl);
curl_close($curl);

echo $response;
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, _ := http.NewRequest("GET", "https://api.ujeebu.com/serp?search=nature%20photography&search_type=images&results_count=50", nil)
	req.Header.Add("ApiKey", "YOUR_API_KEY")
	
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	
	body, _ := ioutil.ReadAll(res.Body)
	fmt.Println(string(body))
}
package main

import (
	"fmt"
	"github.com/ujeebu/ujeebu-go"
)

func main() {
	client, err := ujeebu.NewClient("YOUR_API_KEY")
	if err != nil {
		panic(err)
	}
	
	imageResults, _, err := client.GoogleImageSearch(ujeebu.SerpParams{
		Search:       "nature photography",
		ResultsCount: 50,
	})
	if err != nil {
		panic(err)
	}
	
	fmt.Println(imageResults.Images)
}

Search for videos using the SDK helper methods.

curl --location 'https://api.ujeebu.com/serp?search=machine%20learning%20tutorial&search_type=videos&lang=en&results_count=25' \
--header 'ApiKey: YOUR_API_KEY'
const response = await fetch('https://api.ujeebu.com/serp?search=machine%20learning%20tutorial&search_type=videos&lang=en&results_count=25', {
  headers: {
    'ApiKey': 'YOUR_API_KEY'
  }
});

const data = await response.json();
console.log(data.videos);
import { UjeebuClient } from '@ujeebu-org/ujeebu-sdk';

const client = new UjeebuClient(process.env.UJEEBU_API_KEY);

const videoResults = await client.searchVideos('machine learning tutorial', {
  lang: 'en',
  results_count: 25
});

console.log(videoResults.data.videos);
import requests

response = requests.get(
    'https://api.ujeebu.com/serp',
    params={
        'search': 'machine learning tutorial',
        'search_type': 'videos',
        'lang': 'en',
        'results_count': 25
    },
    headers={'ApiKey': 'YOUR_API_KEY'}
)

data = response.json()
print(data['videos'])
from ujeebu_python import UjeebuClient

ujeebu = UjeebuClient(api_key='YOUR_API_KEY')

response = ujeebu.search_videos(
    search='machine learning tutorial',
    params={
        'lang': 'en',
        'results_count': 25
    }
)

data = response.json()
print(data['videos'])
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://api.ujeebu.com/serp?search=machine%20learning%20tutorial&search_type=videos&lang=en&results_count=25")
  .addHeader("ApiKey", "YOUR_API_KEY")
  .build();

Response response = client.newCall(request).execute();
System.out.println(response.body().string());
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => 'https://api.ujeebu.com/serp?search=machine%20learning%20tutorial&search_type=videos&lang=en&results_count=25',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'ApiKey: YOUR_API_KEY'
  ],
]);

$response = curl_exec($curl);
curl_close($curl);

echo $response;
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, _ := http.NewRequest("GET", "https://api.ujeebu.com/serp?search=machine%20learning%20tutorial&search_type=videos&lang=en&results_count=25", nil)
	req.Header.Add("ApiKey", "YOUR_API_KEY")
	
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	
	body, _ := ioutil.ReadAll(res.Body)
	fmt.Println(string(body))
}
package main

import (
	"fmt"
	"github.com/ujeebu/ujeebu-go"
)

func main() {
	client, err := ujeebu.NewClient("YOUR_API_KEY")
	if err != nil {
		panic(err)
	}
	
	videoResults, _, err := client.GoogleVideoSearch(ujeebu.SerpParams{
		Search:       "machine learning tutorial",
		Lang:         "en",
		ResultsCount: 25,
	})
	if err != nil {
		panic(err)
	}
	
	fmt.Println(videoResults.Videos)
}

Search for local businesses and places using the SDK helper methods.

curl --location 'https://api.ujeebu.com/serp?search=coffee%20shops%20near%20me&search_type=maps&location=US&results_count=15' \
--header 'ApiKey: YOUR_API_KEY'
const response = await fetch('https://api.ujeebu.com/serp?search=coffee%20shops%20near%20me&search_type=maps&location=US&results_count=15', {
  headers: {
    'ApiKey': 'YOUR_API_KEY'
  }
});

const data = await response.json();
console.log(data.maps_results);
import { UjeebuClient } from '@ujeebu-org/ujeebu-sdk';

const client = new UjeebuClient(process.env.UJEEBU_API_KEY);

const mapsResults = await client.searchMaps('coffee shops near me', {
  location: 'US',
  results_count: 15
});

console.log(mapsResults.data.maps_results);
import requests

response = requests.get(
    'https://api.ujeebu.com/serp',
    params={
        'search': 'coffee shops near me',
        'search_type': 'maps',
        'location': 'US',
        'results_count': 15
    },
    headers={'ApiKey': 'YOUR_API_KEY'}
)

data = response.json()
print(data['maps_results'])
from ujeebu_python import UjeebuClient

ujeebu = UjeebuClient(api_key='YOUR_API_KEY')

response = ujeebu.search_maps(
    search='coffee shops near me',
    params={
        'location': 'US',
        'results_count': 15
    }
)

data = response.json()
print(data['maps_results'])
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://api.ujeebu.com/serp?search=coffee%20shops%20near%20me&search_type=maps&location=US&results_count=15")
  .addHeader("ApiKey", "YOUR_API_KEY")
  .build();

Response response = client.newCall(request).execute();
System.out.println(response.body().string());
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => 'https://api.ujeebu.com/serp?search=coffee%20shops%20near%20me&search_type=maps&location=US&results_count=15',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'ApiKey: YOUR_API_KEY'
  ],
]);

$response = curl_exec($curl);
curl_close($curl);

echo $response;
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, _ := http.NewRequest("GET", "https://api.ujeebu.com/serp?search=coffee%20shops%20near%20me&search_type=maps&location=US&results_count=15", nil)
	req.Header.Add("ApiKey", "YOUR_API_KEY")
	
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	
	body, _ := ioutil.ReadAll(res.Body)
	fmt.Println(string(body))
}
package main

import (
	"fmt"
	"github.com/ujeebu/ujeebu-go"
)

func main() {
	client, err := ujeebu.NewClient("YOUR_API_KEY")
	if err != nil {
		panic(err)
	}
	
	mapsResults, _, err := client.GoogleMapSearch(ujeebu.SerpParams{
		Search:       "coffee shops near me",
		Location:     "US",
		ResultsCount: 15,
	})
	if err != nil {
		panic(err)
	}
	
	fmt.Println(mapsResults.Maps)
}

Search Google Jobs listings: title, company, location, posting site, salary and benefits tags, and the links to apply.

curl --location 'https://api.ujeebu.com/serp?search=data%20engineer%20jobs%20new%20york&search_type=jobs&lang=en&location=us' \
--header 'ApiKey: YOUR_API_KEY'
const response = await fetch('https://api.ujeebu.com/serp?search=data%20engineer%20jobs%20new%20york&search_type=jobs&lang=en&location=us', {
  headers: {
    'ApiKey': 'YOUR_API_KEY'
  }
});

const data = await response.json();
console.log(data.jobs);
import { UjeebuClient } from '@ujeebu-org/ujeebu-sdk';

const client = new UjeebuClient(process.env.UJEEBU_API_KEY);

// No jobs helper yet: the generic serp() call passes search_type through
const jobsResults = await client.serp({
  search: 'data engineer jobs new york',
  search_type: 'jobs',
  lang: 'en',
  location: 'us'
});

console.log(jobsResults.data.jobs);
import requests

response = requests.get(
    'https://api.ujeebu.com/serp',
    params={
        'search': 'data engineer jobs new york',
        'search_type': 'jobs',
        'lang': 'en',
        'location': 'us'
    },
    headers={'ApiKey': 'YOUR_API_KEY'}
)

data = response.json()
print(data['jobs'])
from ujeebu_python import UjeebuClient

ujeebu = UjeebuClient(api_key='YOUR_API_KEY')

# No jobs helper yet: the generic serp() call passes search_type through
response = ujeebu.serp(params={
    'search': 'data engineer jobs new york',
    'search_type': 'jobs',
    'lang': 'en',
    'location': 'us'
})

data = response.json()
print(data['jobs'])
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://api.ujeebu.com/serp?search=data%20engineer%20jobs%20new%20york&search_type=jobs&lang=en&location=us")
  .addHeader("ApiKey", "YOUR_API_KEY")
  .build();

Response response = client.newCall(request).execute();
System.out.println(response.body().string());
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => 'https://api.ujeebu.com/serp?search=data%20engineer%20jobs%20new%20york&search_type=jobs&lang=en&location=us',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'ApiKey: YOUR_API_KEY'
  ],
]);

$response = curl_exec($curl);
curl_close($curl);

echo $response;
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, _ := http.NewRequest("GET", "https://api.ujeebu.com/serp?search=data%20engineer%20jobs%20new%20york&search_type=jobs&lang=en&location=us", nil)
	req.Header.Add("ApiKey", "YOUR_API_KEY")
	
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	
	body, _ := ioutil.ReadAll(res.Body)
	fmt.Println(string(body))
}
package main

import (
	"fmt"
	"github.com/ujeebu/ujeebu-go"
)

func main() {
	client, err := ujeebu.NewClient("YOUR_API_KEY")
	if err != nil {
		panic(err)
	}
	
	// No jobs helper yet: Serp() passes SearchType through and returns the raw JSON
	body, _, err := client.Serp(ujeebu.SerpParams{
		Search:     "data engineer jobs new york",
		SearchType: "jobs",
		Lang:       "en",
		Location:   "us",
	})
	if err != nil {
		panic(err)
	}
	
	fmt.Println(string(body))
}

The response lists the jobs in a jobs array (trimmed real response):

{
    "jobs": [
        {
            "position": 1,
            "title": "Associate, Data Engineering",
            "company_name": "Evergreen Trading",
            "location": "New York, NY",
            "via": "LinkedIn",
            "description": "About Evergreen\n\nAt Evergreen Trading, we’re driven by collaboration and value creation for our clients. That’s why we’re the go-to, strategic partner for...",
            "job_highlights": [
                {
                    "title": "Qualifications",
                    "items": [
                        "The ideal candidate has practical ETL experience, is comfortable using SQL and Python, and is eager to build greater ownership of data architecture over time",
                        "Bachelor’s degree in Computer Science, Data Engineering, Information Systems, or a related field, or equivalent practical experience"
                    ]
                },
                {
                    "title": "Benefits",
                    "items": [
                        "Salary: $65,000 - $75,000",
                        "The above represents the expected base salary range for this role"
                    ]
                }
            ],
            "extensions": [
                "19 hours ago",
                "Full-time",
                "Health insurance"
            ],
            "detected_extensions": {
                "health_insurance": true,
                "posted_at": "19 hours ago",
                "schedule_type": "Full-time"
            },
            "apply_options": [
                {
                    "link": "https://www.linkedin.com/jobs/view/associate-data-engineering-at-evergreen-trading-4479205539?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic",
                    "title": "LinkedIn"
                },
                {
                    "link": "https://www.monster.com/job-openings/associate-systems-engineering-new-york-ny--2ccbb3db-c2e6-4bbd-9a8b-40d98d58d86a?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic",
                    "title": "Monster"
                }
            ],
            "share_link": "https://www.google.com/search?ibp=htl;jobs&q=data+engineer+jobs+new+york&htidocid=kPe3rYlyPmTnf6xdAAAAAA%3D%3D&hl=en-US...",
            "thumbnail": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRX1DZWJjag9Eu1U_oKYBoXG8Y28tbik8j-FztH&s=0",
            "job_id": "kPe3rYlyPmTnf6xdAAAAAA=="
        },
        {
            "position": 2,
            "title": "Senior Data Engineer - PostgreSQL and MongoDB",
            "company_name": "CVS Health",
            "location": "New York, NY",
            "via": "ZipRecruiter",
            "description": "We're building a world of health around every individual - shaping a more connected, convenient and compassionate health experience. At CVS Health, you'll be...",
            "job_highlights": [
                {
                    "title": "Qualifications",
                    "items": [
                        "5+ years of data engineering, software engineering, or data platform development experience",
                        "3+ years designing, developing, and supporting enterprise-scale data platforms and distributed systems"
                    ]
                },
                {
                    "title": "Benefits",
                    "items": [
                        "Pay Range",
                        "$92,700.00 - $203,940.00"
                    ]
                }
            ],
            "extensions": [
                "2 days ago",
                "$92,700–$203,940 a year",
                "Full-time",
                "Dental insurance",
                "Paid time off",
                "Health insurance"
            ],
            "detected_extensions": {
                "dental_coverage": true,
                "health_insurance": true,
                "paid_time_off": true,
                "posted_at": "2 days ago",
                "salary": "$92,700–$203,940 a year",
                "schedule_type": "Full-time"
            },
            "apply_options": [
                {
                    "link": "https://www.ziprecruiter.com/c/cvs-health/Job/Senior-Data-Engineer-PostgreSQL-and-MongoDB/-in-New-York,NY?jid=aecba74c1597d8ac&utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic",
                    "title": "ZipRecruiter"
                },
                {
                    "link": "https://www.monster.com/job-openings/senior-data-engineer-postgresql-and-mongodb-carolina-al--22deb5af-3cb4-4562-9072-1f41e3f06472?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic",
                    "title": "Monster"
                }
            ],
            "share_link": "https://www.google.com/search?ibp=htl;jobs&q=data+engineer+jobs+new+york&htidocid=0rO_R5WmtZoisS2hAAAAAA%3D%3D&hl=en-US...",
            "thumbnail": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSKTRc5DAKA9ExXPBFJNn9Ntn2nD_2Hq7ZQsAkv&s=0",
            "job_id": "0rO_R5WmtZoisS2hAAAAAA=="
        }
        // ... more jobs
    ],
    "metadata": {
        "google_url": "https://www.google.com/search?gl=us&hl=en&num=10&q=data+engineer+jobs+new+york&udm=8&jbr=sep:0",
        "number_of_results": 0,
        "query_displayed": "data engineer jobs new york",
        "results_time": "0.24s"
    },
    "pagination": {
        "api": {
            "current": "https://api.ujeebu.com/serp?device=desktop&lang=en&location=us&page=1&results_count=10&search=data+engineer+jobs+new+york&search_type=jobs&",
            "next": "https://api.ujeebu.com/serp?device=desktop&lang=en&location=us&page=2&results_count=10&search=data+engineer+jobs+new+york&search_type=jobs&"
        },
        "google": {
            "current": "https://google.com/search?gl=us&hl=en&num=10&q=data+engineer+jobs+new+york&udm=8&"
        }
    }
}

Each item in jobs has these fields:

Field Type Description
position number Rank of the listing in the results.
title string Job title.
company_name string Hiring company.
location string Job location as Google shows it.
via string Site Google found the listing on (e.g. LinkedIn, Indeed).
description string Full job description text.
job_highlights array Sections such as Qualifications, Benefits and Responsibilities, each with a title and a list of items.
extensions array The short tags Google shows (posted date, schedule, salary, benefits).
detected_extensions object The same tags as fields, when Google shows them: posted_at, schedule_type, salary, qualifications, work_from_home, health_insurance, dental_coverage, paid_time_off.
apply_options array Where to apply: title (site name) and link.
share_link string Google link to the listing.
thumbnail string Company logo, when there is one.
job_id string Google's identifier for the listing.

The response also has metadata (google_url, number_of_results, query_displayed, results_time) and pagination.

Filters and pages for Google Jobs

Filters. These parameters work with search_type=jobs only (any other search type answers 400):

Parameter Values Notes
location 2-letter country code or a place name, e.g. Austin, TX Works for every search type. Outside English-speaking countries set lang to the country's language (location=Berlin, Germany&lang=de): Google returns no jobs for a German place with lang=en.
radius 1 to 1000 (km) Around the place in location; needs a place name, not a country code. Google treats it as a preference, not a hard cut-off.
remote true Remote listings only (location "Anywhere").
date_posted today, 3days, week, month Listings posted in that window.
employment_type FULLTIME, PARTTIME, CONTRACTOR, INTERN, TEMPORARY Comma-separated = any of them. Case-insensitive; full-time, part-time, contract, internship and temp work too. Google applies it loosely, so check detected_extensions.schedule_type. TEMPORARY filters correctly, but Google's cards carry no "Temporary" label.

Full-time software engineer jobs posted in the last week, remote, searched from Austin, TX:

curl --location 'https://api.ujeebu.com/serp?search=software%20engineer&search_type=jobs&location=Austin%2C%20TX&radius=50&date_posted=week&employment_type=FULLTIME&remote=true' \
--header 'ApiKey: YOUR_API_KEY'
const response = await fetch('https://api.ujeebu.com/serp?search=software%20engineer&search_type=jobs&location=Austin%2C%20TX&radius=50&date_posted=week&employment_type=FULLTIME&remote=true', {
  headers: {
    'ApiKey': 'YOUR_API_KEY'
  }
});

const data = await response.json();
console.log(data.jobs);
import { UjeebuClient } from '@ujeebu-org/ujeebu-sdk';

const client = new UjeebuClient(process.env.UJEEBU_API_KEY);

// The generic serp() call passes every parameter through
const results = await client.serp({
  search: 'software engineer',
  search_type: 'jobs',
  location: 'Austin, TX',
  radius: 50,
  date_posted: 'week',
  employment_type: 'FULLTIME',
  remote: true
});

console.log(results.data.jobs);
import requests

response = requests.get(
    'https://api.ujeebu.com/serp',
    params={
        'search': 'software engineer',
        'search_type': 'jobs',
        'location': 'Austin, TX',
        'radius': 50,
        'date_posted': 'week',
        'employment_type': 'FULLTIME',
        'remote': True
    },
    headers={'ApiKey': 'YOUR_API_KEY'}
)

data = response.json()
print(data['jobs'])
from ujeebu_python import UjeebuClient

ujeebu = UjeebuClient(api_key='YOUR_API_KEY')

# The generic serp() call passes every parameter through
response = ujeebu.serp(params={
    'search': 'software engineer',
    'search_type': 'jobs',
    'location': 'Austin, TX',
    'radius': 50,
    'date_posted': 'week',
    'employment_type': 'FULLTIME',
    'remote': True
})

data = response.json()
print(data['jobs'])
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://api.ujeebu.com/serp?search=software%20engineer&search_type=jobs&location=Austin%2C%20TX&radius=50&date_posted=week&employment_type=FULLTIME&remote=true")
  .addHeader("ApiKey", "YOUR_API_KEY")
  .build();

Response response = client.newCall(request).execute();
System.out.println(response.body().string());
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => 'https://api.ujeebu.com/serp?search=software%20engineer&search_type=jobs&location=Austin%2C%20TX&radius=50&date_posted=week&employment_type=FULLTIME&remote=true',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'ApiKey: YOUR_API_KEY'
  ],
]);

$response = curl_exec($curl);
curl_close($curl);

echo $response;
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, _ := http.NewRequest("GET", "https://api.ujeebu.com/serp?search=software%20engineer&search_type=jobs&location=Austin%2C%20TX&radius=50&date_posted=week&employment_type=FULLTIME&remote=true", nil)
	req.Header.Add("ApiKey", "YOUR_API_KEY")
	
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	
	body, _ := ioutil.ReadAll(res.Body)
	fmt.Println(string(body))
}
// The Go SDK's SerpParams has no field for radius, remote, date_posted or employment_type yet:
// use the Go tab (net/http) for these filters.

Every listing in that response (10 of 10 in our test) was remote ("Anywhere"), full-time and 3 to 6 days old. Listings matched by remote have detected_extensions.work_from_home: true.

More than 10 jobs. A jobs search returns up to 10 listings. To get more, use either:

  • page (1 to 40): page 2, 3 and so on, 10 new listings each, without overlap with page 1. Each response gives the next page's request in pagination.api.next. Each page is a separate request at 5 credits.
  • batch=true with results_count up to 100: one request returns that many listings, numbered by position, without duplicates. It is billed 5 credits per 10 results requested (results_count=30 costs 15 credits, results_count=100 costs 50 credits); the Ujb-Batch-Pages response header gives the pages billed.

Without batch, a results_count above 10 returns 10.

curl --location 'https://api.ujeebu.com/serp?search=data%20engineer&search_type=jobs&location=Manchester%2C%20England&page=2' \
--header 'ApiKey: YOUR_API_KEY'
curl --location 'https://api.ujeebu.com/serp?search=data%20engineer&search_type=jobs&location=Manchester%2C%20England&batch=true&results_count=100' \
--header 'ApiKey: YOUR_API_KEY'

INFO - Filters after the first 10 listings

The first 10 listings follow location, radius, remote and the filters. After 10 (later pages, or listings 11 and after in a batch), listings can include nearby areas: in a 100-listing test for Austin, TX they came from Austin and nearby towns, and date_posted=month held for every listing of a month batch. employment_type stays loose on every page, and radius is a weak preference. Check each listing's location and detected_extensions when that matters. With a country code as location, a batch can lean on one city (in a 30-listing US test, 24 came from Charlotte, NC).

Other Google options. extra_params still adds any other Google query parameter to the Google URL; the filters above replace the older extra_params values for jobs (&chips=date_posted:..., &ltype=1).

Job identifier. Each listing carries Google's job_id. To fetch one listing again, see Google Job lookup.

Google Job lookup

Use search_type=job to fetch one Google Jobs listing again, for example to check that it is still open or to refresh its apply links. Send:

  • job_id: the job_id of the listing, from a search_type=jobs result (required);
  • search: the listing's title, company_name and location from that result, separated by spaces (required: Google no longer resolves an id alone). A bare keyword (for example the original query software engineer) is not enough: the lookup answers 404 "Job not found";
  • location and lang (optional): the same values as the original jobs search.

A lookup costs 5 credits. It has no pagination block, and batch is not supported (400).

curl --location 'https://api.ujeebu.com/serp?search_type=job&job_id=lLDdeFC-oECW78XgAAAAAA%3D%3D&search=Experienced%20Event%20Barista%20%7C%20%2425%E2%80%93%2435%2Fhr%20Johnny%20Beans%20Austin%2C%20TX&location=Austin%2C%20TX' \
--header 'ApiKey: YOUR_API_KEY'
const response = await fetch('https://api.ujeebu.com/serp?search_type=job&job_id=lLDdeFC-oECW78XgAAAAAA%3D%3D&search=Experienced%20Event%20Barista%20%7C%20%2425%E2%80%93%2435%2Fhr%20Johnny%20Beans%20Austin%2C%20TX&location=Austin%2C%20TX', {
  headers: {
    'ApiKey': 'YOUR_API_KEY'
  }
});

const data = await response.json();
console.log(data.job);
import { UjeebuClient } from '@ujeebu-org/ujeebu-sdk';

const client = new UjeebuClient(process.env.UJEEBU_API_KEY);

// The generic serp() call passes every parameter through
const results = await client.serp({
  search_type: 'job',
  job_id: 'lLDdeFC-oECW78XgAAAAAA==',
  search: 'Experienced Event Barista | $25–$35/hr Johnny Beans Austin, TX',
  location: 'Austin, TX'
});

console.log(results.data.job);
import requests

response = requests.get(
    'https://api.ujeebu.com/serp',
    params={
        'search_type': 'job',
        'job_id': 'lLDdeFC-oECW78XgAAAAAA==',
        'search': 'Experienced Event Barista | $25–$35/hr Johnny Beans Austin, TX',
        'location': 'Austin, TX'
    },
    headers={'ApiKey': 'YOUR_API_KEY'}
)

data = response.json()
print(data['job'])
from ujeebu_python import UjeebuClient

ujeebu = UjeebuClient(api_key='YOUR_API_KEY')

# The generic serp() call passes every parameter through
response = ujeebu.serp(params={
    'search_type': 'job',
    'job_id': 'lLDdeFC-oECW78XgAAAAAA==',
    'search': 'Experienced Event Barista | $25–$35/hr Johnny Beans Austin, TX',
    'location': 'Austin, TX'
})

data = response.json()
print(data['job'])
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://api.ujeebu.com/serp?search_type=job&job_id=lLDdeFC-oECW78XgAAAAAA%3D%3D&search=Experienced%20Event%20Barista%20%7C%20%2425%E2%80%93%2435%2Fhr%20Johnny%20Beans%20Austin%2C%20TX&location=Austin%2C%20TX")
  .addHeader("ApiKey", "YOUR_API_KEY")
  .build();

Response response = client.newCall(request).execute();
System.out.println(response.body().string());
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => 'https://api.ujeebu.com/serp?search_type=job&job_id=lLDdeFC-oECW78XgAAAAAA%3D%3D&search=Experienced%20Event%20Barista%20%7C%20%2425%E2%80%93%2435%2Fhr%20Johnny%20Beans%20Austin%2C%20TX&location=Austin%2C%20TX',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'ApiKey: YOUR_API_KEY'
  ],
]);

$response = curl_exec($curl);
curl_close($curl);

echo $response;
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, _ := http.NewRequest("GET", "https://api.ujeebu.com/serp?search_type=job&job_id=lLDdeFC-oECW78XgAAAAAA%3D%3D&search=Experienced%20Event%20Barista%20%7C%20%2425%E2%80%93%2435%2Fhr%20Johnny%20Beans%20Austin%2C%20TX&location=Austin%2C%20TX", nil)
	req.Header.Add("ApiKey", "YOUR_API_KEY")
	
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	
	body, _ := ioutil.ReadAll(res.Body)
	fmt.Println(string(body))
}
// The Go SDK's SerpParams has no job_id field yet:
// use the Go tab (net/http) for the job lookup.

The response has the listing in job (the same fields as a jobs item, without position) and metadata (trimmed real response):

{
    "job": {
        "title": "Experienced Event Barista | $25–$35/hr",
        "company_name": "Johnny Beans",
        "location": "Austin, TX",
        "via": "Poached Jobs",
        "description": "Johnny Beans is a specialty coffee catering company creating elevated, high-energy coffee experiences at conferences, corporate events, and brand acti...",
        "job_highlights": [],
        "extensions": [
            "18 days ago",
            "$25–$35 an hour",
            "Part-time",
            "No degree mentioned"
        ],
        "detected_extensions": {
            "posted_at": "18 days ago",
            "qualifications": "No degree mentioned",
            "salary": "$25–$35 an hour",
            "schedule_type": "Part-time"
        },
        "apply_options": [
            {
                "link": "https://poachedjobs.com/jobs/austin-tx-barista-jobs-johnny-beans-experienced-event-barista-experienced-event-barista-or-dollar25dollar35hr?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic",
                "title": "Poached Jobs"
            }
        ],
        "share_link": "https://www.google.com/search?ibp=htl;jobs&q=Experienced+Event+Barista+%7C+$25%E2%80%93$35/hr+Johnny+Beans+Austin,+TX&ht...",
        "thumbnail": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRsOXUszSxRDuqc2q2WIbIcoujPA7qup0ko1_i2&s=0",
        "job_id": "lLDdeFC-oECW78XgAAAAAA=="
    },
    "metadata": {
        "google_url": "https://www.google.com/search?hl=en&htidocid=lLDdeFC-oECW78XgAAAAAA%3D%3D&num=10&q=Experienced+Event+Barista+%7C+%2425%E2%80%93%2435%2Fhr+Johnny+Beans+Austin%2C+TX&udm=8&uule=w+CAIQICIKQXVzdGluLCBUWA==&jbr=sep:0",
        "number_of_results": 0,
        "query_displayed": "Experienced Event Barista | $25–$35/hr Johnny Beans Austin, TX",
        "results_time": "0.52s"
    }
}

When the listing is gone, the API answers 404:

{"error": "Job not found."}

TIP - Remote listings

A remote listing has location "Anywhere". To look it up, put remote in search instead of the location (title, company, remote) and use a country code as location (for example us), not a place name: in our tests "Anywhere" or a city both answered 404.

Get AI-generated answers with cited sources using Google's AI Mode. Ideal for question-answering use cases where you need comprehensive, synthesized answers.

curl --location 'https://api.ujeebu.com/serp?search=what%20is%20quantum%20computing&search_type=ai&lang=en' \
--header 'ApiKey: YOUR_API_KEY'
const response = await fetch('https://api.ujeebu.com/serp?search=what%20is%20quantum%20computing&search_type=ai&lang=en', {
  headers: {
    'ApiKey': 'YOUR_API_KEY'
  }
});

const data = await response.json();
console.log(data.ai_results.answer_text);
console.log(data.ai_results.citations);
import { UjeebuClient } from '@ujeebu-org/ujeebu-sdk';

const client = new UjeebuClient(process.env.UJEEBU_API_KEY);

const aiResults = await client.searchAI('what is quantum computing', {
  lang: 'en'
});

console.log(aiResults.data.ai_results.answer_text);
console.log(aiResults.data.ai_results.citations);
import requests

response = requests.get(
    'https://api.ujeebu.com/serp',
    params={
        'search': 'what is quantum computing',
        'search_type': 'ai',
        'lang': 'en'
    },
    headers={'ApiKey': 'YOUR_API_KEY'}
)

data = response.json()
print(data['ai_results']['answer_text'])
print(data['ai_results']['citations'])
from ujeebu_python import UjeebuClient

ujeebu = UjeebuClient(api_key='YOUR_API_KEY')

response = ujeebu.search_ai(
    search='what is quantum computing',
    params={'lang': 'en'}
)

data = response.json()
print(data['ai_results']['answer_text'])
print(data['ai_results']['citations'])
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://api.ujeebu.com/serp?search=what%20is%20quantum%20computing&search_type=ai&lang=en")
  .addHeader("ApiKey", "YOUR_API_KEY")
  .build();

Response response = client.newCall(request).execute();
System.out.println(response.body().string());
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => 'https://api.ujeebu.com/serp?search=what%20is%20quantum%20computing&search_type=ai&lang=en',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'ApiKey: YOUR_API_KEY'
  ],
]);

$response = curl_exec($curl);
curl_close($curl);

echo $response;
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	client := &http.Client{}
	req, _ := http.NewRequest("GET", "https://api.ujeebu.com/serp?search=what%20is%20quantum%20computing&search_type=ai&lang=en", nil)
	req.Header.Add("ApiKey", "YOUR_API_KEY")
	
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	
	body, _ := ioutil.ReadAll(res.Body)
	fmt.Println(string(body))
}
package main

import (
	"fmt"
	"github.com/ujeebu/ujeebu-go"
)

func main() {
	client, err := ujeebu.NewClient("YOUR_API_KEY")
	if err != nil {
		panic(err)
	}
	
	aiResults, _, err := client.GoogleAIModeSearch(ujeebu.SerpParams{
		Search: "what is quantum computing",
		Lang:   "en",
	})
	if err != nil {
		panic(err)
	}
	
	fmt.Println(aiResults.AIResults)
}

Batch: up to 100 results in one request

Need more than one page of results for the same search? Add batch=true and the number of results you want in results_count (1 to 100). Ujeebu fetches the results pages for you and returns one combined list, numbered by position, without duplicates, so you do not have to loop over page yourself. It works for web search and Google Jobs (see Google Jobs Search), not for the job lookup. For web search the count is approximate (about 5 either way, depending on how many results each Google page has). A batch is billed 5 credits per 10 results requested, rounded up, the same as asking for each page separately: results_count=30 costs 15 credits and results_count=100 costs 50 credits. The Ujb-Batch-Pages response header gives the pages billed. Without batch, a results_count above 10 returns one page.

curl --location 'https://api.ujeebu.com/serp?search=web%20scraping%20api&batch=true&results_count=30' \
--header 'ApiKey: YOUR_API_KEY'

Paginated Search Results

Retrieve multiple pages of search results, one page per request (page 1 to 40; to get them in one request, see batch above). This works for Google Jobs too (10 jobs per page); each response gives the next page's request in pagination.api.next.

# Get first page
curl --location 'https://api.ujeebu.com/serp?search=web%20scraping&page=1&results_count=10' \
--header 'ApiKey: YOUR_API_KEY'

# Get second page
curl --location 'https://api.ujeebu.com/serp?search=web%20scraping&page=2&results_count=10' \
--header 'ApiKey: YOUR_API_KEY'
// Get first page
const page1Response = await fetch('https://api.ujeebu.com/serp?search=web%20scraping&page=1&results_count=10', {
  headers: { 'ApiKey': 'YOUR_API_KEY' }
});
const page1 = await page1Response.json();

// Get second page
const page2Response = await fetch('https://api.ujeebu.com/serp?search=web%20scraping&page=2&results_count=10', {
  headers: { 'ApiKey': 'YOUR_API_KEY' }
});
const page2 = await page2Response.json();

console.log(page1.pagination.next);
import { UjeebuClient } from '@ujeebu-org/ujeebu-sdk';

const client = new UjeebuClient(process.env.UJEEBU_API_KEY);

// Get first page
const page1 = await client.searchText('web scraping', {
  page: 1,
  results_count: 10
});

// Get second page
const page2 = await client.searchText('web scraping', {
  page: 2,
  results_count: 10
});

console.log(page1.data.pagination.next);
import requests

# Get first page
page1_response = requests.get(
    'https://api.ujeebu.com/serp',
    params={'search': 'web scraping', 'page': 1, 'results_count': 10},
    headers={'ApiKey': 'YOUR_API_KEY'}
)
page1 = page1_response.json()

# Get second page
page2_response = requests.get(
    'https://api.ujeebu.com/serp',
    params={'search': 'web scraping', 'page': 2, 'results_count': 10},
    headers={'ApiKey': 'YOUR_API_KEY'}
)
page2 = page2_response.json()

print(page1['pagination']['next'])
from ujeebu_python import UjeebuClient

ujeebu = UjeebuClient(api_key='YOUR_API_KEY')

# Get first page
page1 = ujeebu.search_text(
    search='web scraping',
    params={'page': 1, 'results_count': 10}
)

# Get second page
page2 = ujeebu.search_text(
    search='web scraping',
    params={'page': 2, 'results_count': 10}
)

data = page1.json()
print(data['pagination']['next'])
OkHttpClient client = new OkHttpClient();

// Get first page
Request request1 = new Request.Builder()
  .url("https://api.ujeebu.com/serp?search=web%20scraping&page=1&results_count=10")
  .addHeader("ApiKey", "YOUR_API_KEY")
  .build();

Response response1 = client.newCall(request1).execute();
System.out.println(response1.body().string());

// Get second page
Request request2 = new Request.Builder()
  .url("https://api.ujeebu.com/serp?search=web%20scraping&page=2&results_count=10")
  .addHeader("ApiKey", "YOUR_API_KEY")
  .build();

Response response2 = client.newCall(request2).execute();
System.out.println(response2.body().string());
<?php

// Get first page
$curl1 = curl_init();
curl_setopt_array($curl1, [
  CURLOPT_URL => 'https://api.ujeebu.com/serp?search=web%20scraping&page=1&results_count=10',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['ApiKey: YOUR_API_KEY'],
]);
$page1 = curl_exec($curl1);
curl_close($curl1);

// Get second page
$curl2 = curl_init();
curl_setopt_array($curl2, [
  CURLOPT_URL => 'https://api.ujeebu.com/serp?search=web%20scraping&page=2&results_count=10',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['ApiKey: YOUR_API_KEY'],
]);
$page2 = curl_exec($curl2);
curl_close($curl2);

echo $page1;
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	client := &http.Client{}
	
	// Get first page
	req1, _ := http.NewRequest("GET", "https://api.ujeebu.com/serp?search=web%20scraping&page=1&results_count=10", nil)
	req1.Header.Add("ApiKey", "YOUR_API_KEY")
	res1, _ := client.Do(req1)
	body1, _ := ioutil.ReadAll(res1.Body)
	res1.Body.Close()
	
	// Get second page
	req2, _ := http.NewRequest("GET", "https://api.ujeebu.com/serp?search=web%20scraping&page=2&results_count=10", nil)
	req2.Header.Add("ApiKey", "YOUR_API_KEY")
	res2, _ := client.Do(req2)
	body2, _ := ioutil.ReadAll(res2.Body)
	res2.Body.Close()
	
	fmt.Println(string(body1))
}
package main

import (
	"fmt"
	"github.com/ujeebu/ujeebu-go"
)

func main() {
	client, err := ujeebu.NewClient("YOUR_API_KEY")
	if err != nil {
		panic(err)
	}
	
	// Get first page
	page1, _, err := client.GoogleSearch(ujeebu.SerpParams{
		Search:       "web scraping",
		Page:         1,
		ResultsCount: 10,
	})
	if err != nil {
		panic(err)
	}
	
	// Get second page
	page2, _, _ := client.GoogleSearch(ujeebu.SerpParams{
		Search:       "web scraping",
		Page:         2,
		ResultsCount: 10,
	})
	
	fmt.Println(page1.Pagination.Next)
	fmt.Println(page2)
}

The example code provided returns a JSON response formatted as follows:

{
    "knowledge_graph": {
        "born": "July 10, 1856, Smiljan, Croatia",
        "died": "January 7, 1943 (age 86\u00a0years), The New Yorker A Wyndham Hotel, New York, NY",
        "education": "TU Graz (1875\u20131878), Gimnazija Karlovac (1870\u20131873)",
        "height": "6\u2032 2\u2033",
        "parents": "Milutin Tesla, \u0110uka Tesla",
        "siblings": "Dane Tesla, Angelina Tesla, Milka Tesla, Marica Kosanovi\u0107",
        "title": "Nikola Tesla",
        "type": "Engineer and futurist"
    },
    "metadata": {
        "google_url": "https:\/\/www.google.com\/search?gl=US&hl=en&num=10&q=Nikola+Tesla&sei=defQZ8riGZOt5NoPk7_S4AU",
        "number_of_results": 36800000,
        "query_displayed": "Nikola Tesla",
        "results_time": "0.29 seconds"
    },
    "organic_results": [
        {
            "cite": "https:\/\/en.wikipedia.org \u203a wiki \u203a Nikola_Tesla",
            "link": "https:\/\/en.wikipedia.org\/wiki\/Nikola_Tesla",
            "position": 1,
            "site_name": "Wikipedia",
            "title": "Nikola Tesla"
        },
        {
            "cite": "https:\/\/www.britannica.com \u203a ... \u203a Matter & Energy",
            "link": "https:\/\/www.britannica.com\/biography\/Nikola-Tesla",
            "position": 2,
            "site_name": "Britannica",
            "title": "Nikola Tesla | Biography, Facts, & Inventions"
        },
        {
            "cite": "https:\/\/theoatmeal.com \u203a comics \u203a tesla",
            "link": "https:\/\/theoatmeal.com\/comics\/tesla",
            "position": 3,
            "site_name": "The Oatmeal",
            "title": "Why Nikola Tesla was the greatest geek who ever lived"
        },
        {
            "cite": "https:\/\/www.biography.com \u203a inventors \u203a nikola-tesla",
            "link": "https:\/\/www.biography.com\/inventors\/nikola-tesla",
            "position": 4,
            "site_name": "Biography",
            "title": "Nikola Tesla: An Electric Inventor"
        },
        {
            "cite": "https:\/\/tesla-museum.org \u203a ...",
            "description": "Explore the priceless scientific heritage. The Nikola Tesla Museum inherits the original archive of the famous scientist. UNESCO included this rich collection\u00a0...",
            "link": "https:\/\/tesla-museum.org\/en\/home\/",
            "position": 5,
            "site_name": "\u041c\u0443\u0437\u0435\u0458 \u041d\u0438\u043a\u043e\u043b\u0435 \u0422\u0435\u0441\u043b\u0435",
            "title": "Welcome to the Nikola Tesla Museum."
        },
        {
            "cite": "http:\/\/www.teslasociety.com \u203a biography",
            "link": "http:\/\/www.teslasociety.com\/biography.htm",
            "position": 6,
            "site_name": "Tesla Memorial Society of New York",
            "title": "Tesla's Biography"
        },
        {
            "cite": "https:\/\/teslasciencecenter.org \u203a nikola-tesla-inventions",
            "link": "https:\/\/teslasciencecenter.org\/nikola-tesla-inventions\/",
            "position": 7,
            "site_name": "Tesla Science Center at Wardenclyffe -",
            "title": "Nikola Tesla Inventions"
        },
        {
            "cite": "https:\/\/lemelson.mit.edu \u203a resources \u203a nikola-tesla",
            "link": "https:\/\/lemelson.mit.edu\/resources\/nikola-tesla",
            "position": 8,
            "site_name": "Lemelson-MIT Program",
            "title": "Nikola Tesla - Lemelson-MIT Program"
        },
        {
            "cite": "https:\/\/www.amazon.com \u203a Wizard-Nikola-Biography-...",
            "link": "https:\/\/www.amazon.com\/Wizard-Nikola-Biography-Genius-Citadel\/dp\/0806519606",
            "position": 9,
            "site_name": "Amazon.com",
            "title": "Wizard: The Life and Times of Nikola Tesla : Biography ..."
        }
    ],
    "pagination": {
        "google": {
            "current": "https:\/\/google.com\/search?gl=US&hl=en&num=10&q=Nikola+Tesla&",
            "next": "https:\/\/google.com\/search?gl=US&hl=en&num=10&q=Nikola+Tesla&start=20&tbm=&",
            "other_pages": {
                "3": "https:\/\/google.com\/search?gl=US&hl=en&num=10&q=Nikola+Tesla&start=30&tbm=&",
                "4": "https:\/\/google.com\/search?gl=US&hl=en&num=10&q=Nikola+Tesla&start=40&tbm=&",
                "5": "https:\/\/google.com\/search?gl=US&hl=en&num=10&q=Nikola+Tesla&start=50&tbm=&",
                "6": "https:\/\/google.com\/search?gl=US&hl=en&num=10&q=Nikola+Tesla&start=60&tbm=&",
                "7": "https:\/\/google.com\/search?gl=US&hl=en&num=10&q=Nikola+Tesla&start=70&tbm=&",
                "8": "https:\/\/google.com\/search?gl=US&hl=en&num=10&q=Nikola+Tesla&start=80&tbm=&"
            }
        },
        "api": {
            "current": "https:\/\/api.ujeebu.com\/serp?device=desktop&lang=en&location=US&page=1&results_count=10&search=Nikola+Tesla&",
            "next": "https:\/\/api.ujeebu.com\/serp?device=desktop&lang=en&location=US&page=2&results_count=10&search=Nikola+Tesla&",
            "other_pages": {
                "3": "https:\/\/api.ujeebu.com\/serp?device=desktop&lang=en&location=US&page=3&results_count=10&search=Nikola+Tesla&",
                "4": "https:\/\/api.ujeebu.com\/serp?device=desktop&lang=en&location=US&page=4&results_count=10&search=Nikola+Tesla&",
                "5": "https:\/\/api.ujeebu.com\/serp?device=desktop&lang=en&location=US&page=5&results_count=10&search=Nikola+Tesla&",
                "6": "https:\/\/api.ujeebu.com\/serp?device=desktop&lang=en&location=US&page=6&results_count=10&search=Nikola+Tesla&",
                "7": "https:\/\/api.ujeebu.com\/serp?device=desktop&lang=en&location=US&page=7&results_count=10&search=Nikola+Tesla&",
                "8": "https:\/\/api.ujeebu.com\/serp?device=desktop&lang=en&location=US&page=8&results_count=10&search=Nikola+Tesla&"
            }
        }
    },
    "related_questions": [
        "What is Nikola Tesla famous for?",
        "How much money did Nikola Tesla have when he died?",
        "Why was Tesla's work destroyed?",
        "Who was Nikola Tesla to Elon Musk?"
    ],
    "top_stories": null,
    "videos": [
        {
            "author": "BMResearch",
            "date": "1 month ago",
            "link": "https:\/\/www.google.com\/search?gl=US&hl=en&num=10&q=Nikola+Tesla&sei=defQZ8riGZOt5NoPk7_S4AU#",
            "title": "Nikola Tesla: The Forgotten Genius of Electricity! (1856\u20131943)"
        },
        {
            "author": "Newsthink",
            "date": "Jul 16, 2020",
            "link": "https:\/\/www.google.com\/search?gl=US&hl=en&num=10&q=Nikola+Tesla&sei=defQZ8riGZOt5NoPk7_S4AU#",
            "title": "The Tragic Story of Nikola Tesla"
        },
        {
            "author": "Dare to do. Motivation",
            "date": "2 weeks ago",
            "link": "https:\/\/www.google.com\/search?gl=US&hl=en&num=10&q=Nikola+Tesla&sei=defQZ8riGZOt5NoPk7_S4AU#",
            "title": "The Story Of Nikola Tesla And The Broken Lightbulb"
        }
    ],
    "ai_overview": null
}

:::note The ai_overview field is included in web search responses. It contains Google's AI-generated overview when available, or null when Google does not display one for the given query. See the Search Types page for the full Google AI Overviews and AI Mode response schemas. :::

Usage Tracking

To track credit usage programmatically, call the /account endpoint. See Account API for the full reference, response shape, and rate limit (10 calls/minute).

Ready to build?

Spin up an API key in 60 seconds

Free trial: 5,000 credits for 7 days, no card, every endpoint on this page (proxy country needs a paid plan or a top-up pack).