Get Google Organic SERP Results by id

checked GET
Pricing

Your account will be charged only for posting a task. You can get the results of the task within the next 30 days for free.
The cost can be calculated on the Pricing page.

Description of the fields for sending a request:

Field name Type Description
id string task identifier
unique task identifier in our system in the UUID format
you will be able to use it within 30 days to request the results of the task at any time

‌‌‌‌
‌‌As a response of the API server, you will receive JSON-encoded data containing a tasks array with the information specific to the set tasks.

You can also get all available SERP features by making a request to the following Sandbox URL:
https://sandbox.dataforseo.com/v3/serp/google/organic/task_get/regular/00000000-0000-0000-0000-000000000000
The response will include all available items in the Google Organic SERP Regular endpoint with the fields containing dummy data.
You won’t be charged for using Sandbox endpoints.

Description of the fields in the results array:

Field nameTypeDescription
versionstring

the current version of the API

status_codeinteger

general status code
you can find the full list of the response codes here
Note: we strongly recommend designing a necessary system for handling related exceptional or error conditions

status_messagestring

general informational message
you can find the full list of general informational messages here

timestring

execution time, seconds

costfloat

total tasks cost, USD

tasks_countinteger

the number of tasks in the tasks array

tasks_errorinteger

the number of tasks in the tasks array that were returned an error

tasksarray

array of tasks

    idstring

task identifier
unique task identifier in our system in the UUID format

    status_codeinteger

status code of the task
generated by DataForSEO; can be within the following range: 10000-60000
you can find the full list of the response codes here

    status_messagestring

informational message of the task
you can find the full list of general informational messages here

    timestring

execution time, seconds

    costfloat

cost of the task, USD

    result_countinteger

number of elements in the result array

    patharray

URL path

    dataobject

contains the same parameters that you specified in the POST request

    resultarray

array of results

        keywordstring

keyword received in a POST array
keyword is returned with decoded %## (plus symbol '+' will be decoded to a space character)

        typestring

search engine type in a POST array

        se_domainstring

search engine domain in a POST array

        location_codeinteger

location code in a POST array

        language_codestring

language code in a POST array

        check_urlstring

direct URL to search engine results
you can use it to make sure that we provided accurate results

        datetimestring

date and time when the result was received
in the UTC format: “yyyy-mm-dd hh-mm-ss +00:00”
example:
2019-11-15 12:57:46 +00:00

        spellobject

autocorrection of the search engine
if the search engine provided results for a keyword that was corrected, we will specify the keyword corrected by the search engine and the type of autocorrection;
if there is none, the value is null

            keywordstring

keyword obtained as a result of search engine autocorrection
the results will be provided for the corrected keyword

            typestring

type of autocorrection
possible values:
did_you_mean, showing_results_for, no_results_found_for, including_results_for
note: Yahoo supports only the following autocorrection type:
including_results_for

        refinement_chipsobject

search refinement chips
if there are none, the value is null

            typestring

type of element='refinement_chips'

            xpathstring

the XPath of the element

            itemsarray

items of the element

                typestring

type of element='refinement_chips_element'

                titlestring

title of the element

                urlstring

search URL with refinement parameters

                domainstring

domain in SERP

                optionsarray

further search refinement options

                    typestring

type of element='refinement_chips_option'

                    titlestring

title of the element

                    urlstring

search URL with refinement parameters

                    domainstring

domain in SERP

        item_typesarray

types of search results found in SERP
contains types of all search results (items) found in the returned SERP
possible item types:
answer_box, app, carousel, multi_carousel, featured_snippet, google_flights, google_reviews, third_party_reviews, images, jobs, knowledge_graph, local_pack, hotels_pack, map, organic, paid, people_also_ask, related_searches, people_also_search, shopping, top_stories, twitter, video, events, recipes, top_sights, scholarly_articles, popular_products, questions_and_answers, find_results_on, stocks_box, commercial_units, local_services, google_hotels, math_solver, currency_box, product_considerations, short_videos, refine_products, perspectives, discussions_and_forums, compare_sites, ai_overview

note that this array contains all types of search results found in the returned SERP;
however, this endpoint provides data for featured_snippet, organic and paid types only;
to get all items (including SERP features and rich snippets) found in the returned SERP, please refer to the Google Organiс Advanced SERP endpoint

        se_results_countinteger

total number of results in SERP

        pages_countinteger

total search results pages retrieved
total number of retrieved SERPs in the result

        items_countinteger

the number of results returned in the items array

        itemsarray

items in SERP

        organic_element_in_serpobject
            typestring

type of element='organic'

            rank_groupinteger

group rank in SERP
position within a group of elements with identical type values
positions of elements with different type values are omitted from rank_group

            rank_absoluteinteger

absolute rank in SERP
absolute position among all the elements found in SERPnote values are returned in the ascending order, with values corresponding to advanced SERP features omitted from the results;
to get all items (including SERP features and rich snippets) with their positions, please refer to the Google Organiс Advanced SERP endpoint

            pageinteger

search results page number
indicates the number of the SERP page on which the element is located

            domainstring

domain in SERP

            titlestring

title of the results element in SERP

            descriptionstring

description of the results element in SERP

            urlstring

relevant URL in SERP

            breadcrumbstring

breadcrumb in SERP

        paid_element_in_serpobject
            typestring

type of element='paid'

            rank_groupinteger

group rank in SERP
position within a group of elements with identical type values
positions of elements with different type values are omitted from rank_group

            rank_absoluteinteger

absolute rank in SERP
absolute position among all the elements found in SERPnote values are returned in the ascending order, with values corresponding to advanced SERP features omitted from the results;
to get all items (including SERP features and rich snippets) with their positions, please refer to the Google Organiс Advanced SERP endpoint

            pageinteger

search results page number
indicates the number of the SERP page on which the element is located

            titlestring

title of the ad element in SERP

            domainstring

domain of the ad element in SERP

            descriptionstring

description of the ad element in SERP

            urlstring

relevant URL of the ad element in SERP

            breadcrumbstring

breadcrumb of the ad element in SERP

        featured_snippet_element_in_serpobject
            typestring

type of element='featured_snippet'

            rank_groupinteger

group rank in SERP
position within a group of elements with identical type values
positions of elements with different type values are omitted from rank_group

            rank_absoluteinteger

absolute rank in SERP
absolute position among all the elements found in SERPnote values are returned in the ascending order, with values corresponding to advanced SERP features omitted from the results;
to get all items (including SERP features and rich snippets) with their positions, please refer to the Google Organiс Advanced SERP endpoint

            pageinteger

search results page number
indicates the number of the SERP page on which the element is located

            domainstring

domain in SERP

            titlestring

title of the result in SERP

            descriptionstring

description of the results element in SERP

            urlstring

relevant URL

            breadcrumbstring

always equals null


‌‌

Instead of ‘login’ and ‘password’ use your credentials from https://app.dataforseo.com/api-access

# Instead of 'login' and 'password' use your credentials from https://app.dataforseo.com/api-access 
login="login" 
password="password" 
cred="$(printf ${login}:${password} | base64)" 
id="09171517-0696-0242-0000-a96bc1ad0bce" 
curl --location --request GET "https://api.dataforseo.com/v3/serp/google/organic/task_get/regular/${id}" 
--header "Authorization: Basic ${cred}"  
--header "Content-Type: application/json" 
--data-raw ""
<?php
// You can download this file from here https://cdn.dataforseo.com/v3/examples/php/php_RestClient.zip
require('RestClient.php');
$api_url = 'https://api.dataforseo.com/';
try {
	// Instead of 'login' and 'password' use your credentials from https://app.dataforseo.com/api-access
	$client = new RestClient($api_url, null, 'login', 'password');
} catch (RestClientException $e) {
	echo "n";
	print "HTTP code: {$e->getHttpCode()}n";
	print "Error code: {$e->getCode()}n";
	print "Message: {$e->getMessage()}n";
	print  $e->getTraceAsString();
	echo "n";
	exit();
}
try {
	$result = array();
	// #1 - using this method you can get a list of completed tasks
	// GET /v3/serp/google/organic/tasks_ready
	// in addition to 'google' and 'organic' you can also set other search engine and type parameters
	// the full list of possible parameters is available in documentation
	$tasks_ready = $client->get('/v3/serp/google/organic/tasks_ready');
	// you can find the full list of the response codes here https://docs.dataforseo.com/v3/appendix/errors
	if (isset($tasks_ready['status_code']) AND $tasks_ready['status_code'] === 20000) {
		foreach ($tasks_ready['tasks'] as $task) {
			if (isset($task['result'])) {
				foreach ($task['result'] as $task_ready) {
					// #2 - using this method you can get results of each completed task
					// GET /v3/serp/google/organic/task_get/regular/$id
					if (isset($task_ready['endpoint_regular'])) {
						$result[] = $client->get($task_ready['endpoint_regular']);
					}
					// #3 - another way to get the task results by id
					// GET /v3/serp/google/organic/task_get/regular/$id
					/*
					if (isset($task_ready['id'])) {
						$result[] = $client->get('/v3/serp/google/organic/task_get/regular/' . $task_ready['id']);
					}
					*/
				}
			}
		}
	}
	print_r($result);
	// do something with result
} catch (RestClientException $e) {
	echo "n";
	print "HTTP code: {$e->getHttpCode()}n";
	print "Error code: {$e->getCode()}n";
	print "Message: {$e->getMessage()}n";
	print  $e->getTraceAsString();
	echo "n";
}
$client = null;
?>
const task_id = '02201650-1073-0066-2000-1d132bb28897';

const axios = require('axios');

axios({
    method: 'get',
    url: 'https://api.dataforseo.com/v3/serp/google/organic/task_get/regular/' + task_id,
    auth: {
        username: 'login',
        password: 'password'
    },
    headers: {
        'content-type': 'application/json'
    }
}).then(function (response) {
    var result = response['data']['tasks'];
    // Result data
    console.log(result);
}).catch(function (error) {
    console.log(error);
});
from client import RestClient
# You can download this file from here https://cdn.dataforseo.com/v3/examples/python/python_Client.zip
client = RestClient("login", "password")
# 1 - using this method you can get a list of completed tasks
# GET /v3/serp/google/organic/tasks_ready
# in addition to 'google' and 'organic' you can also set other search engine and type parameters
# the full list of possible parameters is available in documentation
response = client.get("/v3/serp/google/organic/tasks_ready")
# you can find the full list of the response codes here https://docs.dataforseo.com/v3/appendix/errors
if response['status_code'] == 20000:
    results = []
    for task in response['tasks']:
        if (task['result'] and (len(task['result']) > 0)):
            for resultTaskInfo in task['result']:
                # 2 - using this method you can get results of each completed task
                # GET /v3/serp/google/organic/regular/$id
                if(resultTaskInfo['endpoint_regular']):
                    results.append(client.get(resultTaskInfo['endpoint_regular']))                
                '''
                # 3 - another way to get the task results by id
                # GET /v3/serp/google/organic/task_get/regular/$id                
                if(resultTaskInfo['id']):
                    results.append(client.get("/v3/serp/google/organic/task_get/regular/" + resultTaskInfo['id']))
                '''
    print(results)
    # do something with result
else:
    print("error. Code: %d Message: %s" % (response["status_code"], response["status_message"]))
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace DataForSeoDemos
{
    public static partial class Demos
    {
        public static async Task serp_task_get()
        {
            var httpClient = new HttpClient
            {
                BaseAddress = new Uri("https://api.dataforseo.com/"),
                // Instead of 'login' and 'password' use your credentials from https://app.dataforseo.com/api-access
                DefaultRequestHeaders = { Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password"))) }
            };
            // #1 - using this method you can get a list of completed tasks
            // GET /v3/serp/google/organic/tasks_ready
            // in addition to 'google' and 'organic' you can also set other search engine and type parameters
            // the full list of possible parameters is available in documentation
            var response = await httpClient.GetAsync("/v3/serp/google/organic/tasks_ready");
            var tasksInfo = JsonConvert.DeserializeObject<dynamic>(await response.Content.ReadAsStringAsync());
            var tasksResponses = new List<object>();
            // you can find the full list of the response codes here https://docs.dataforseo.com/v3/appendix/errors
            if (tasksInfo.status_code == 20000)
            {
                if (tasksInfo.tasks != null)
                {
                    foreach (var tasks in tasksInfo.tasks)
                    {
                        if (tasks.result != null)
                        {
                            foreach (var task in tasks.result)
                            {
                                if (task.endpoint_regular != null)
                                {
                                    // #2 - using this method you can get results of each completed task
                                    // GET /v3/serp/google/organic/task_get/regular/$id
                                    var taskGetResponse = await httpClient.GetAsync((string)task.endpoint_regular);
                                    var taskResultObj = JsonConvert.DeserializeObject<dynamic>(await taskGetResponse.Content.ReadAsStringAsync());
                                    if (taskResultObj.tasks != null)
                                    {
                                        var fst = taskResultObj.tasks.First;
                                        // you can find the full list of the response codes here https://docs.dataforseo.com/v3/appendix/errors
                                        if (fst.status_code >= 40000 || fst.result == null)
                                            Console.WriteLine($"error. Code: {fst.status_code} Message: {fst.status_message}");
                                        else
                                            tasksResponses.Add(fst.result);
                                    }
                                    // #3 - another way to get the task results by id
                                    // GET /v3/serp/google/organic/task_get/regular/$id
                                    /*
                                    var tasksGetResponse = await httpClient.GetAsync("/v3/serp/google/organic/task_get/regular/" + (string)task.id);
                                    var tasksResultObj = JsonConvert.DeserializeObject<dynamic>(await tasksGetResponse.Content.ReadAsStringAsync());
                                    if (tasksResultObj.tasks != null)
                                    {
                                        var fst = taskResultObj.tasks.First;
                                        // you can find the full list of the response codes here https://docs.dataforseo.com/v3/appendix/errors
                                        if (fst.status_code >= 40000 || fst.result == null)
                                            Console.WriteLine($"error. Code: {fst.status_code} Message: {fst.status_message}");
                                        else
                                            tasksResponses.Add(fst.result);
                                    }
                                    */
                                }
                            }
                        }
                    }
                }
                if (tasksResponses.Count > 0)
                    // do something with result
                    Console.WriteLine(String.Join(Environment.NewLine, tasksResponses));
                else
                    Console.WriteLine("No completed tasks");
            }
            else
                Console.WriteLine($"error. Code: {tasksInfo.status_code} Message: {tasksInfo.status_message}");
        }
    }
}

The above command returns JSON structured like this:

{
  "version": "0.1.20200129",
  "status_code": 20000,
  "status_message": "Ok.",
  "time": "0.3059 sec.",
  "cost": 0,
  "tasks_count": 1,
  "tasks_error": 0,
  "tasks": [
    {
      "id": "11151456-0696-0066-0000-002a5915da37",
      "status_code": 20000,
      "status_message": "Ok.",
      "time": "0.0952 sec.",
      "cost": 0,
      "result_count": 1,
      "path": [
        "v3",
        "serp",
        "google",
        "organic",
        "task_get",
        "regular",
        "11151456-0696-0066-0000-002a5915da37"
      ],
      "data": {
        "api": "serp",
        "function": "task_get",
        "se": "google",
        "se_type": "organic",
        "language_code": "en",
        "location_code": 2840,
        "keyword": "flight ticket new york san francisco",
        "priority": "2",
        "tag": "tag2",
        "device": "desktop",
        "os": "windows"
      },
      "result": [
        {
          "keyword": "flight ticket new york san francisco",
          "type": "organic",
          "se_domain": "google.com",
          "location_code": 2840,
          "language_code": "en",
          "check_url": "https://www.google.com/search?q=flight%20ticket%20new%20york%20san%20francisco&num=100&hl=en&gl=US&gws_rd=cr&ie=UTF-8&oe=UTF-8&uule=w+CAIQIFISCQs2MuSEtepUEUK33kOSuTsc",
          "datetime": "2019-11-15 12:57:46 +00:00",
          "spell": null,
          "refinement_chips": {
            "type": "refinement_chips",
            "xpath": "/html[1]/body[1]/div[3]/div[1]/div[9]/div[1]/div[1]/div[3]/div[1]/div[1]",
            "items": [
              {
                "type": "refinement_chips_element",
                "title": "Remote",
                "url": "https://www.google.com/search?num=100&sca_esv=427163c40a0d98b7&hl=en&gl=US&glp=1&q=bristol+temp+agencies+remote&uds=ADvngMjcH0KdF7qGWtwTBrP0nt7drlQNXJ_q6WhUnfcnlFQAOVqvQ09aiEx7jUP4Wb5sg6FzKTGyEoBQg36hfgreicnnhtBQv8H25iRkUIMWBSqTcu0nGLObB57jKDn4sIHqgjkv6AqtXzA0gTV6n6-p1_aOUPMmYdgJOPy5xybgxI0ZY3-OZUg&sa=X&ved=2ahUKEwjEjMPzrvyIAxVgpIkEHYTyBqEQxKsJegQIHRAB&ictx=0",
                "domain": "www.google.com",
                "options": null
              },
              {
                "type": "refinement_chips_element",
                "title": "Date posted",
                "url": null,
                "domain": null,
                "options": [
                  {
                    "type": "refinement_chips_option",
                    "title": "Yesterday",
                    "url": "https://www.google.com/search?num=100&sca_esv=427163c40a0d98b7&hl=en&gl=US&glp=1&q=bristol+temp+agencies+since+yesterday&uds=ADvngMjcH0KdF7qGWtwTBrP0nt7d1cxhUU_4I1tnZ_YIEcACz8ZYvzwewv2vtaifFRGAtrClbFOcrHbTAbAeXm1jREcC6VS1VsCvY-sITnX4ozb-ILgfWEVwq_Z5ROUTUSIPShEnKXD5sUUbZbocrG609xSmt2d98g8y8m1lGjX2kp2G7tWTnMoyaYhx7tPHFsc1SlxiTTuylOmQpyaET98nEnMhDFUw8hSQnpfQcpEDEdBLwrOxN3gOZC4RtcHuKTyeCrFRnaDjQ17dNosh1yiBWrSXB9e1dQF-1Pt17wXCHwRUCH6wH0DbAN-oCNd7lMT2v24eI8rDkLQP3kTLpzGMUZReaWIAPw&sa=X&ved=2ahUKEwjEjMPzrvyIAxVgpIkEHYTyBqEQkbEKegQIDxAD",
                    "domain": "www.google.com"
                  },
                  {
                    "type": "refinement_chips_option",
                    "title": "Last 3 days",
                    "url": "https://www.google.com/search?num=100&sca_esv=427163c40a0d98b7&hl=en&gl=US&glp=1&q=bristol+temp+agencies+in+the+last+3+days&uds=ADvngMjcH0KdF7qGWtwTBrP0nt7dLQVdkfQJDu14-gF_eQoKa39tQdXyMUfu3HnnM3Pu4g5hOzwEez_H8t-yULnPJEgal7YGml0mtSaIuH3YeuIhPq5mBSo_ECo7hOJVwSRGkksXQg-RdTy8GhoT8Qm-ZFkyAQnSLmnlmv0Rm042YAlQ6JFqnfOW0VIOgTeTdYm6SLpzQ3a6YSvEf2tau3pEKxnGWKleL613vj0tLBWg4Jhsa0trdMkFPHDQYhc2caGQ8cmSYU4cqdB2Eq3PsNGgjgebvt7_7bbvjixC19O4L9ZB02rwY0EP30_mYAeTG9lYAx8ZJvGDslVLp0DHS93P8ynaiA7Bbw&sa=X&ved=2ahUKEwjEjMPzrvyIAxVgpIkEHYTyBqEQkbEKegQIDxAE",
                    "domain": "www.google.com"
                  }
                ]
              }
            ]
          },
          "item_types": [
            "featured_snippet",
            "organic",
            "paid",
            "ai_overview"
          ],
          "se_results_count": 85600000,
          "pages_count": 1,
          "items_count": 96,
          "items": [
            {
              "type": "paid",
              "rank_group": 1,
              "rank_absolute": 1,
              "page": 1,
              "domain": "www.bookingbuddy.com",
              "title": "Flights To Lwo | Unbelievably Cheap Flights | BookingBuddy.com‎",
              "description": "Compare Airlines & Sites. Cheap Flights on BookingBuddy, a TripAdvisor Company",
              "url": "https://www.bookingbuddy.com/en/hero/",
              "breadcrumb": "www.bookingbuddy.com/Flights"
            },
            {
              "type": "paid",
              "rank_group": 2,
              "rank_absolute": 2,
              "page": 1,
              "domain": "www.trip.com",
              "title": "Cheap Flight Tickets | Search & Find Deals on Flights | trip.com‎",
              "description": "Wide Selection of Cheap Flights Online. Explore & Save with Trip.com! Fast, Easy & Secure...",
              "url": "https://www.trip.com/flights/index?utm_campaign=GG_SE_All_en_Flight_Generic_NA_Phrase",
              "breadcrumb": "www.trip.com/"
            },
            {
              "type": "paid",
              "rank_group": 3,
              "rank_absolute": 4,
              "page": 1,
              "domain": "www.kayak.com",
              "title": "Find the Cheapest Flights | Search, Compare & Save Today‎",
              "description": "Cheap Flights, Airline Tickets and Flight Deals. Compare 100s of Airlines Worldwide. Search...",
              "url": "https://www.kayak.com/horizon/sem/flights/general",
              "breadcrumb": "www.kayak.com/flights"
            },
            {
              "type": "featured_snippet",
              "rank_group": 1,
              "rank_absolute": 5,
              "page": 1,
              "domain": "www.kayak.com",
              "title": "Cheap Flights from New York to San Francisco from $182 ...",
              "description": "Fly from New York to San Francisco on Frontier from $182, United Airlines from ... the cheapest round-trip tickets were found on Frontier ($182), United Airlines ...",
              "url": "https://www.kayak.com/flight-routes/New-York-NYC/San-Francisco-SFO",
              "breadcrumb": null
            },
            {
              "type": "organic",
              "rank_group": 1,
              "rank_absolute": 6,
              "page": 1,
              "domain": "www.skyscanner.com",
              "title": "Cheap flights from New York to San Francisco SFO from $123 ...",
              "description": "Flight information New York to San Francisco International .... tool will help you find the cheapest tickets from New York in San Francisco in just a few clicks.",
              "url": "https://www.skyscanner.com/routes/nyca/sfo/new-york-to-san-francisco-international.html",
              "breadcrumb": "https://www.skyscanner.com › United States › New York"
            },
            {
              "type": "organic",
              "rank_group": 2,
              "rank_absolute": 7,
              "page": 1,
              "domain": "www.expedia.com",
              "title": "JFK to SFO: Flights from New York to San Francisco for 2019 ...",
              "description": "Book your New York (JFK) to San Francisco (SFO) flight with our Best Price ... How much is a plane ticket to San Francisco (SFO) from New York (JFK)?.",
              "url": "https://www.expedia.com/lp/flights/jfk/sfo/new-york-to-san-francisco",
              "breadcrumb": "https://www.expedia.com › flights › jfk › sfo › new-york-to-san-francisco"
            },
            {
              "type": "organic",
              "rank_group": 94,
              "rank_absolute": 97,
              "page": 1,
              "domain": "www.ethiopianairlines.com",
              "title": "Ethiopian Airlines | Book your next flight online and Fly Ethiopian",
              "description": "Fly to your Favorite International Destination with Ethiopian Airlines. Book your Flights Online for Best Offers/Discounts and Enjoy African Flavored Hospitality.",
              "url": "https://www.ethiopianairlines.com/",
              "breadcrumb": "https://www.ethiopianairlines.com"
            },
            {
              "type": "organic",
              "rank_group": 95,
              "rank_absolute": 98,
              "page": 1,
              "domain": "www.vietnamairlines.com",
              "title": "Vietnam Airlines | Reach Further | Official website",
              "description": "Great value fares with Vietnam Airlines. Book today and save! Skytrax – 4 Star airline. Official website. Earn frequent flyer miles with Lotusmiles.",
              "url": "https://www.vietnamairlines.com/",
              "breadcrumb": "https://www.vietnamairlines.com"
            },
            {
              "type": "organic",
              "rank_group": 96,
              "rank_absolute": 99,
              "page": 1,
              "domain": "books.google.com",
              "title": "Code of Federal Regulations: 1985-1999",
              "description": "A purchases in New York a round-trip ticket for transportation by air from New York to ... B purchases a ticket in San Francisco for Combination rail and water ...",
              "url": "https://books.google.com/books?id=av3umFsqbAEC&pg=PA305&lpg=PA305&dq=flight+ticket+new+york+san+francisco&source=bl&ots=fJJY5RUS9l&sig=ACfU3U16ejUqNf23jHD32QNCxDCa05Vn9g&hl=en&ppis=_e&sa=X&ved=2ahUKEwjs_4OnouzlAhXJ4zgGHeBcD3oQ6AEwdXoECHEQAQ",
              "breadcrumb": "https://books.google.com › books"
            }
          ]
        }
      ]
    }
  ]
}