Google Search
Perform a Google search and get structured results using the same reliable Google retrieval path as Search Advanced. gl=us and hl=en are used when omitted. page is 0-based: page=0 is the first page and page=1 is the second; start is the preferred explicit result offset. total_results is Google's estimate when exposed and may be null; organic_results_count is the number of returned organic rows. Scrappa does not impose fixed per-key concurrency or requests-per-minute limits. Transient capacity responses include Retry-After, and failed responses including 503 are never charged. External text is returned as valid UTF-8; malformed byte sequences are replaced with the Unicode replacement character (�), while valid Unicode is preserved. Account balance and recent usage are available from GET /api/account/usage and in the dashboard. YouTube results include raw views/date text plus normalized view_count and publication_age when Google provides them.
Run this endpoint
Endpoint
https://scrappa.co/api/search?query=best+restaurants+in+Berlin&hl=en&safe=off
https://scrappa.co/api/search?query=best+restaurants+in+Berlin&hl=en&safe=off
x-api-key
query
= best restaurants in Berlin
{
"search_information": {
"query_displayed": "best restaurants in Berlin",
"total_results": 428000000,
"time_taken_displayed": 0.42
},
"organic_results": [
{
"position": 1,
"title": "The 38 Best Restaurants in Berlin",
"link": "https://www.example.com/berlin/best-restaurants",
"redirect_link": "https://www.google.com/url?q=https://www.example.com/berlin/best-restaurants",
"displayed_link": "www.example.com > berlin > best-restaurants",
"snippet": "A curated guide to Berlin restaurants, from modern German dining rooms to casual neighborhood favorites.",
...
Parameters
Start with the required fields, then add optional filters only when your use case needs them.
Runnable path
1 required parameter needed before sending a request.
25 optional filters available.
string
Required
Search query
best restaurants in Berlin
string
Optional
Location for results (currently ignored by backend)
Austin, Texas
string
Optional
Encoded location (deprecated; supported)
example
string
Optional
Google domain (e.g., google.de)
example
string
Optional
Country code (e.g., us, de, fr; default: us)
us
string
Optional
Restrict results to countries (e.g., countryUS|countryDE)
countryUS
string
Optional
Interface language code (default: en)
en
string
Optional
Restrict results to language (e.g., lang_en)
lang_en
string
Optional
Google Customer ID for places
example
string
Optional
Knowledge graph map signature
example
string
Optional
Knowledge graph entity ID (e.g., /g/11b6gq7c8p)
example
string
Optional
Encrypted cached search parameters
example
string
Optional
Controls rendering layouts and expansions
example
string
Optional
Google-provided filter strings
example
string
Optional
Original Google query value, passed through and encoded once in the upstream URL.
example
string
Optional
Google search client identifier, passed through and encoded once in the upstream URL.
example
string
Optional
Opaque Google SERP context value, passed through and encoded once in the upstream URL.
example
string
Optional
Advanced search filters (dates, patents, etc.)
example
string
Optional
Simple time range filter (e.g., d, w, m, y)
example
string
Optional
Safe search mode (active, off)
off
integer
Optional
Exclude auto-corrected results (0 or 1)
10
integer
Optional
Enable/disable similar/omitted filters (0 or 1)
1
string
Optional
Search type (isch, vid, nws, lcl, shop, pts)
example
integer
Optional
Result offset for pagination (0-indexed)
0
integer
Optional
0-based page number: 0 is the first page and 1 is the second. Prefer start for new integrations.
1
integer
Optional
Results per page (1-10, may return fewer)
10
Request Examples
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrappa.co/api/search?query=best+restaurants+in+Berlin&hl=en&safe=off",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: YOUR_API_KEY_HERE"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
<?php
use Illuminate\Support\Facades\Http;
$response = Http::timeout(30)
->withHeaders(['x-api-key' => 'YOUR_API_KEY_HERE'])
->get('https://scrappa.co/api/search?query=best+restaurants+in+Berlin&hl=en&safe=off');
if ($response->successful()) {
echo $response->body();
} else {
echo "Error: " . $response->status();
}
const options = {
method: 'GET',
headers: {
'x-api-key': 'YOUR_API_KEY_HERE'
}
};
fetch('https://scrappa.co/api/search?query=best+restaurants+in+Berlin&hl=en&safe=off', options)
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.text();
})
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
const axios = require('axios');
const options = {
method: 'GET',
url: 'https://scrappa.co/api/search?query=best+restaurants+in+Berlin&hl=en&safe=off',
headers: {
x-api-key: 'YOUR_API_KEY_HERE',
}
};
try {
const response = await axios(options);
console.log(response.data);
} catch (error) {
console.error('Error:', error.message);
}
require 'net/http'
require 'uri'
uri = URI.parse("https://scrappa.co/api/search?query=best+restaurants+in+Berlin&hl=en&safe=off")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'
request = Net::HTTP::Get.new(uri.request_uri)
request['x-api-key'] = 'YOUR_API_KEY_HERE'
begin
response = http.request(request)
puts response.body
rescue => e
puts "Error: #{e.message}"
end
import http.client
import json
conn = http.client.HTTPSConnection("scrappa.co")
headers = {
'x-api-key': 'YOUR_API_KEY_HERE',
}
try:
conn.request("GET", "/api/search?query=best+restaurants+in+Berlin&hl=en&safe=off", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
except Exception as e:
print(f"Error: {e}")
finally:
conn.close()
import requests
headers = {
'x-api-key': 'YOUR_API_KEY_HERE',
}
try:
response = requests.get('https://scrappa.co/api/search?query=best+restaurants+in+Berlin&hl=en&safe=off', headers=headers)
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print(f"Error: {e}")
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class ApiExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://scrappa.co/api/search?query=best+restaurants+in+Berlin&hl=en&safe=off")
.addHeader("x-api-key", "YOUR_API_KEY_HERE")
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
System.out.println(response.body().string());
} else {
System.out.println("Error: " + response.code());
}
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
package main
import (
"fmt"
"net/http"
"io/ioutil"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest("GET", "https://scrappa.co/api/search?query=best+restaurants+in+Berlin&hl=en&safe=off", nil)
if err != nil {
fmt.Println("Error creating request:", err)
return
}
req.Header.Set("x-api-key", "YOUR_API_KEY_HERE")
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error making request:", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error reading response:", err)
return
}
fmt.Println(string(body))
}
#!/bin/bash
curl -X GET \
-H "x-api-key: YOUR_API_KEY_HERE" \
"https://scrappa.co/api/search?query=best+restaurants+in+Berlin&hl=en&safe=off"
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY_HERE");
try
{
var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "https://scrappa.co/api/search?query=best+restaurants+in+Berlin&hl=en&safe=off"));
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
import axios from 'axios';
async function run(): Promise<void> {
try {
const response = await axios({
method: 'GET',
url: 'https://scrappa.co/api/search?query=best+restaurants+in+Berlin&hl=en&safe=off',
headers: {
'x-api-key': 'YOUR_API_KEY_HERE',
},
});
console.log(response.data);
} catch (error) {
console.error('Error:', error);
}
}
void run();
use reqwest::Client;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::new();
let response = client
.get("https://scrappa.co/api/search?query=best+restaurants+in+Berlin&hl=en&safe=off")
.header("x-api-key", "YOUR_API_KEY_HERE")
.send()
.await?;
println!("{}", response.text().await?);
Ok(())
}
Response Schema
Example response fields are illustrative; inspect the JSON before integrating.
Example response fields
Scan these fields before integrating.
search_information
organic_results
related_searches
people_also_search_for
related_questions
local_results
knowledge_graph
inline_images
+6 more
Common organic_results fields
position
title
link
redirect_link
{
"search_information": {
"query_displayed": "best restaurants in Berlin",
"total_results": 428000000,
"time_taken_displayed": 0.42
},
"organic_results": [
{
"position": 1,
"title": "The 38 Best Restaurants in Berlin",
"link": "https://www.example.com/berlin/best-restaurants",
"redirect_link": "https://www.google.com/url?q=https://www.example.com/berlin/best-restaurants",
"displayed_link": "www.example.com > berlin > best-restaurants",
"snippet": "A curated guide to Berlin restaurants, from modern German dining rooms to casual neighborhood favorites.",
"source": "example.com",
"sitelinks": {
"inline": [
{
"title": "Fine Dining",
"link": "https://www.example.com/berlin/fine-dining"
},
{
"title": "Neighborhood Guides",
"link": "https://www.example.com/berlin/neighborhoods"
}
]
}
},
{
"position": 2,
"title": "Berlin Restaurant Guide",
"link": "https://guide.example.org/berlin-restaurants",
"displayed_link": "guide.example.org > berlin-restaurants",
"snippet": "Compare highly rated restaurants in Berlin by cuisine, district, price level, and opening hours.",
"source": "guide.example.org"
}
],
"related_searches": [
{
"query": "best restaurants berlin mitte",
"link": "https://www.google.com/search?q=best+restaurants+berlin+mitte"
},
{
"query": "berlin restaurants with tasting menu",
"link": "https://www.google.com/search?q=berlin+restaurants+with+tasting+menu"
}
],
"people_also_search_for": [
{
"name": "Berlin food guide",
"query": "Berlin food guide",
"link": "https://www.google.com/search?q=Berlin+food+guide"
},
{
"name": "Restaurants in Kreuzberg",
"query": "restaurants in Kreuzberg",
"link": "https://www.google.com/search?q=restaurants+in+Kreuzberg"
},
{
"name": "Michelin restaurants Berlin",
"query": "Michelin restaurants Berlin",
"link": "https://www.google.com/search?q=Michelin+restaurants+Berlin"
}
],
"related_questions": [
{
"question": "What food is Berlin best known for?",
"text_blocks": [
{
"type": "paragraph",
"snippet": "Berlin is known for currywurst, doner kebab, schnitzel, and a large international restaurant scene."
}
]
}
],
"local_results": {
"places": [
{
"position": 1,
"title": "Example Berlin Bistro",
"rating": 4.7,
"reviews": 1842,
"type": "Restaurant",
"address": "Mitte, Berlin"
}
]
},
"knowledge_graph": null,
"inline_images": [
{
"title": "Berlin restaurant dining room",
"thumbnail": "https://images.example.com/berlin-restaurant.jpg",
"source": "example.com"
}
],
"inline_videos": [
{
"position": 1,
"title": "Adobe Express Brand Kit Tutorial 2026",
"link": "https://www.youtube.com/watch?v=example123",
"platform": "YouTube",
"channel": "XayLi Barclay",
"views": "720+ views",
"view_count": 720,
"date": "4 months ago",
"publication_age": "4 months ago"
}
],
"pagination": {
"next": null
},
"organic_results_count": 2,
"total_results": 428000000,
"engine_used": "google",
"service_used": "google"
}
Errors
Handle these documented responses before retrying or showing customer-facing failures.
Validation Error
One or more query parameters failed validation.
{
"message": "The request validation failed",
"errors": {
"query": [
"The query field is required."
]
}
}
Search Providers Unavailable
Google Search and fallback providers are temporarily unavailable.
{
"error": "Search providers are temporarily unavailable. Please retry shortly.",
"retry_after": 30
}
Generate Code with AI
Copy a ready-made prompt with all the endpoint details, parameters, and example responses. Paste it into ChatGPT, Claude, or any AI assistant to instantly generate working code.
Related reading
Pay-as-you-go scraping API
Compare flexible scraping API billing before scaling Google Search traffic.
Best MCP servers for web scraping
Compare MCP server options for running structured scraping endpoints from AI agents.
Serper.dev alternative
Compare Google Search API pricing, free credits, request limits, and no-credit-card testing.