Skip to main content
Track SERP rankings, monitor competitors, research keywords, and audit SEO presence at scale. Returns position, keyword, title, link, displayedLink, snippet, highlighted words, source, rich snippet blocks, and sitelinks for every query × location combination. This scraper job is asynchronous. You’ll receive a jobId, and can fetch results via polling or webhook delivery.

Request Cost

Each row of data returned consumes 2 credits from your balance.
Credits are deducted only for successful rows.

Example Request

curl --request POST \
  --url 'https://api.hasdata.com/scrapers/google-serp/jobs' \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: <your-api-key>' \
  --data '{"keywords":["pizza in new york","beef in new york"],"location":"Austin,Texas,United States","limit":0}'
const axios = require('axios').default;

const options = {
  method: 'POST',
  url: 'https://api.hasdata.com/scrapers/google-serp/jobs',
  headers: {'Content-Type': 'application/json', 'x-api-key': '<your-api-key>'},
  data: {
    keywords: ['pizza in new york', 'beef in new york'],
    location: 'Austin,Texas,United States',
    limit: 0
  }
};

try {
  const { data } = await axios.request(options);
  console.log(data);
} catch (error) {
  console.error(error);
}
import requests

url = "https://api.hasdata.com/scrapers/google-serp/jobs"

payload = {
    "keywords": ["pizza in new york", "beef in new york"],
    "location": "Austin,Texas,United States",
    "limit": 0
}
headers = {
    "Content-Type": "application/json",
    "x-api-key": "<your-api-key>"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
<?php

$payload = [
    "keywords" => ["pizza in new york", "beef in new york"],
    "location" => "Austin,Texas,United States",
    "limit" => 0,
];

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://api.hasdata.com/scrapers/google-serp/jobs",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => json_encode($payload),
  CURLOPT_HTTPHEADER => [
    "Content-Type: application/json",
    "x-api-key: <your-api-key>",
  ],
]);

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

echo $response;
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
String json = """
  {
    "keywords": [
      "pizza in new york",
      "beef in new york"
    ],
    "location": "Austin,Texas,United States",
    "limit": 0
  }
""";
RequestBody requestBody = RequestBody.create(json, mediaType);

Request request = new Request.Builder()
  .url("https://api.hasdata.com/scrapers/google-serp/jobs")
  .post(requestBody)
  .addHeader("Content-Type", "application/json")
  .addHeader("x-api-key", "<your-api-key>")
  .build();

Response response = client.newCall(request).execute();
using System.Net.Http;
using System.Text;

var client = new HttpClient();

var json = """
{
  "keywords": [
    "pizza in new york",
    "beef in new york"
  ],
  "location": "Austin,Texas,United States",
  "limit": 0
}
""";
var content = new StringContent(json, Encoding.UTF8, "application/json");

var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.hasdata.com/scrapers/google-serp/jobs")
{
    Content = content,
};
request.Headers.Add("x-api-key", "<your-api-key>");

using var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
require 'net/http'
require 'uri'
require 'json'

uri = URI("https://api.hasdata.com/scrapers/google-serp/jobs")
payload = {
  "keywords" => ["pizza in new york", "beef in new york"],
  "location" => "Austin,Texas,United States",
  "limit" => 0,
}

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri)
request["Content-Type"] = 'application/json'
request["x-api-key"] = '<your-api-key>'
request.body = payload.to_json

response = http.request(request)
puts response.read_body
use reqwest::blocking::Client;
use serde_json::json;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();
    let payload = json!({
        "keywords": [
            "pizza in new york",
            "beef in new york"
        ],
        "location": "Austin,Texas,United States",
        "limit": 0
    });
    let res = client
        .post("https://api.hasdata.com/scrapers/google-serp/jobs")
        .header("Content-Type", "application/json")
        .header("x-api-key", "<your-api-key>")
        .json(&payload)
        .send()?
        .text()?;
    println!("{}", res);
    Ok(())
}
package main

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

func main() {
	payload := []byte(`{
  "keywords": [
    "pizza in new york",
    "beef in new york"
  ],
  "location": "Austin,Texas,United States",
  "limit": 0
}`)

	req, _ := http.NewRequest("POST", "https://api.hasdata.com/scrapers/google-serp/jobs", bytes.NewBuffer(payload))
	req.Header.Add("Content-Type", "application/json")
	req.Header.Add("x-api-key", "<your-api-key>")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()

	responseBody, _ := io.ReadAll(res.Body)
	fmt.Println(string(responseBody))
}

Job Parameters

keywords
string[]
required
Put each keyword on the different line
location
string
required
Google canonical location for the search.
limit
number
Results per each keyword (min. 10). The default value of 0 means no limit.

Supported Enrichments

Request any of the fields below via the enrichments array in your job payload.
IDTitleDescriptionCost per Request
emailEmail AddressWebsite-associated email address5 credits
phonePhone NumberWebsite-associated phone number5 credits
revenueRevenueCompany revenue5 credits
trafficWebsite TrafficWebsite traffic5 credits

Getting Results

Webhooks

Receive real-time updates when your scraper job starts, completes, or collects data.

Results API

Use the Results API to fetch your data using the jobId, with support for polling and pagination.

Stopping a Job

Cancel an active scraper job early if it’s no longer needed or you want to save credits.