Google API

Google web search, knowledge panels, query suggestions and dictionary lookups with stable schemas.

Base URL: https://api.endpointry.com/v1/google. All endpoints require Bearer authentication and return the standard response envelope. This reference is generated from the same schemas the gateway enforces at runtime.

Search the web

Returns ranked web results, exactly `per_page` per response (up to 10) until the result set ends. Pagination continues while results remain — typically 100–250 per query — and stops with `meta.pagination.next_page: null`. Each result carries its absolute position, so ranking is stable across pages. Results reflect a globally neutral locale; country and language targeting are not yet available.

Query parameters
query*stringThe search query.
page*integerPage number, starting at 1.
per_page*integerResults per page (1–10). Every page is full until the result set ends.
Response fields (data)
results*array<object>
position*integerAbsolute rank across the whole result set, starting at 1.
url*string · uri
domain*string
title*string
snippet*string | null
published_at*string · date-time | nullPublication date when the source exposes one, otherwise null.
Response meta

Platform fields, identical on every endpoint — what they mean.

curl "https://api.endpointry.com/v1/google/web-search" \
  -H "Authorization: Bearer sk_live_..."
const res = await fetch("https://api.endpointry.com/v1/google/web-search", {
  headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});

if (!res.ok) {
  const problem = await res.json();
  throw new Error(`${problem.code}: ${problem.detail} (${problem.request_id})`);
}
const { data, meta } = await res.json();
import os, requests

res = requests.get(
    "https://api.endpointry.com/v1/google/web-search",
    headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
    timeout=15,
)
body = res.json()
if res.status_code != 200:
    raise RuntimeError(f"{body['code']}: {body['detail']} ({body['request_id']})")
data, meta = body["data"], body["meta"]
200 · application/json
{
  "meta": {
    "request_id": "req_7729f93d3facf68ff83e5c50",
    "as_of": "2026-07-31T12:00:00.000Z",
    "cache": "MISS",
    "pagination": {
      "page": 1,
      "next_page": 2,
      "limit": 10,
      "returned": 10
    }
  },
  "data": {
    "results": [
      {
        "position": 1,
        "url": "https://www.salesforce.com/crm/best-crm/",
        "domain": "www.salesforce.com",
        "title": "Best CRM Software: Everything To Consider",
        "snippet": "Learn what to look for when comparing CRM platforms, from pipeline management to reporting and automation.",
        "published_at": null
      },
      {
        "position": 2,
        "url": "https://www.pipedrive.com/en/crm/compare/crm-tool",
        "domain": "www.pipedrive.com",
        "title": "Compare CRM Tools",
        "snippet": "A side-by-side comparison of popular CRM tools for sales teams.",
        "published_at": "2026-01-27T00:00:00.000Z"
      }
    ]
  }
}

GET/v1/google/rank

Check a domain's rank

Reports where a domain ranks for a query, scanning the whole measured result set — typically 100–250 results. Returns the best position, every appearance of the domain with its exact page, and `results_scanned` so a `null` position always names the set it was measured against. Shares its snapshot with `/web-search`, so a check right after a search costs nothing extra. Results reflect a globally neutral locale; country and language targeting are not yet available.

Query parameters
query*stringThe search query (keyword) to check rankings in.
domain*stringThe domain to look for, without scheme or path.
mode*"exact" | "subdomains"`subdomains` counts the domain and everything under it; `exact` counts only the domain itself (www is always treated as the domain).
Response fields (data)
query*string
domain*string
mode*"exact" | "subdomains"
position*integer | nullBest position the domain holds — the first entry of `matches`, surfaced as the headline answer. `null` means the domain is not in the measured result set.
matches*array<object>Every appearance of the domain, in rank order.
position*integerAbsolute rank across the whole result set, starting at 1.
url*string · uri
title*string
results_scanned*integerHow many results the verdict is based on — the full measured result set for the query, typically 100–250. A null position means "not in these", never more.
Response meta

Platform fields, identical on every endpoint — what they mean.

curl "https://api.endpointry.com/v1/google/rank" \
  -H "Authorization: Bearer sk_live_..."
const res = await fetch("https://api.endpointry.com/v1/google/rank", {
  headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});

if (!res.ok) {
  const problem = await res.json();
  throw new Error(`${problem.code}: ${problem.detail} (${problem.request_id})`);
}
const { data, meta } = await res.json();
import os, requests

res = requests.get(
    "https://api.endpointry.com/v1/google/rank",
    headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
    timeout=15,
)
body = res.json()
if res.status_code != 200:
    raise RuntimeError(f"{body['code']}: {body['detail']} ({body['request_id']})")
data, meta = body["data"], body["meta"]
200 · application/json
{
  "meta": {
    "request_id": "req_7729f93d3facf68ff83e5c50",
    "as_of": "2026-07-31T12:00:00.000Z",
    "cache": "MISS"
  },
  "data": {
    "query": "best crm software",
    "domain": "pipedrive.com",
    "mode": "subdomains",
    "position": 2,
    "matches": [
      {
        "position": 2,
        "url": "https://www.pipedrive.com/en/crm/compare/crm-tool",
        "title": "Compare CRM Tools"
      },
      {
        "position": 41,
        "url": "https://www.pipedrive.com/en/blog/crm-comparison",
        "title": "CRM Comparison: Top Tools Reviewed"
      }
    ],
    "results_scanned": 187
  }
}

GET/v1/google/knowledge-panel

Get the knowledge panel for a query

Returns structured entity data — name, type, summary, image and attributes — for queries that resolve to a known entity. Returns `404 NOT_FOUND` when the query has no panel. Sharing a warm result set with `/web-search`, so a lookup after a search is served from cache.

Query parameters
query*stringThe entity or topic to look up.
Response fields (data)
name*string
label*string | nullShort type descriptor, e.g. "Software company".
description*object | null
text*string
source_url*string · uri | null
source_name*string | null
image*object | null
url*string · uri
width*integer | null
height*integer | null
page_url*string · uri | null
attributes*array<object>Structured facts, e.g. Founded → ["2021"].
label*string
values*array<string>
Response meta

Platform fields, identical on every endpoint — what they mean.

curl "https://api.endpointry.com/v1/google/knowledge-panel" \
  -H "Authorization: Bearer sk_live_..."
const res = await fetch("https://api.endpointry.com/v1/google/knowledge-panel", {
  headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});

if (!res.ok) {
  const problem = await res.json();
  throw new Error(`${problem.code}: ${problem.detail} (${problem.request_id})`);
}
const { data, meta } = await res.json();
import os, requests

res = requests.get(
    "https://api.endpointry.com/v1/google/knowledge-panel",
    headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
    timeout=15,
)
body = res.json()
if res.status_code != 200:
    raise RuntimeError(f"{body['code']}: {body['detail']} ({body['request_id']})")
data, meta = body["data"], body["meta"]
200 · application/json
{
  "meta": {
    "request_id": "req_7729f93d3facf68ff83e5c50",
    "as_of": "2026-07-31T12:00:00.000Z",
    "cache": "MISS"
  },
  "data": {
    "name": "Claude",
    "label": "Language model",
    "description": {
      "text": "Claude is a family of large language models developed by Anthropic.",
      "source_url": "https://en.wikipedia.org/wiki/Claude_(language_model)",
      "source_name": "Wikipedia"
    },
    "image": {
      "url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:UQV8oMkcm41-NM",
      "width": 268,
      "height": 188,
      "page_url": "https://www.anthropic.com"
    },
    "attributes": [
      {
        "label": "Developer",
        "values": [
          "Anthropic"
        ]
      }
    ]
  }
}

GET/v1/google/autocomplete

Get query suggestions

Returns the suggestions Google offers for a partial query, in rank order, plus a spelling correction when the input looks misspelled. Each suggestion is provided as plain text and with highlight markup, and carries entity details when the suggestion maps to one. Useful for keyword research and search-as-you-type experiences.

Query parameters
query*stringPartial query to complete.
Response fields (data)
suggestions*array<object>
position*integer
keyword*stringThe full suggested query, as plain text.
keyword_html*stringSame suggestion with <b> around the completed portion, for UI highlighting.
entity*object | nullSet when the suggestion maps to a known entity.
title*string
label*string | null
image_url*string · uri | null
spelling_suggestion*string | nullCorrected query when the input looks misspelled, otherwise null.
Response meta

Platform fields, identical on every endpoint — what they mean.

curl "https://api.endpointry.com/v1/google/autocomplete" \
  -H "Authorization: Bearer sk_live_..."
const res = await fetch("https://api.endpointry.com/v1/google/autocomplete", {
  headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});

if (!res.ok) {
  const problem = await res.json();
  throw new Error(`${problem.code}: ${problem.detail} (${problem.request_id})`);
}
const { data, meta } = await res.json();
import os, requests

res = requests.get(
    "https://api.endpointry.com/v1/google/autocomplete",
    headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
    timeout=15,
)
body = res.json()
if res.status_code != 200:
    raise RuntimeError(f"{body['code']}: {body['detail']} ({body['request_id']})")
data, meta = body["data"], body["meta"]
200 · application/json
{
  "meta": {
    "request_id": "req_7729f93d3facf68ff83e5c50",
    "as_of": "2026-07-31T12:00:00.000Z",
    "cache": "MISS"
  },
  "data": {
    "suggestions": [
      {
        "position": 1,
        "keyword": "anthropic claude",
        "keyword_html": "anthropic<b> claude</b>",
        "entity": {
          "title": "Anthropic",
          "label": "Artificial intelligence company",
          "image_url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTCbP0WqDxmPhD2"
        }
      },
      {
        "position": 2,
        "keyword": "anthropic api pricing",
        "keyword_html": "anthropic<b> api pricing</b>",
        "entity": null
      }
    ],
    "spelling_suggestion": "anthropic"
  }
}

GET/v1/google/dictionary

Look up a word

Returns the dictionary entry for an English word: syllabification, phonetic pronunciations with audio, etymology, and one entry per part of speech with its inflections, numbered senses, synonyms and usage examples. Returns `404 NOT_FOUND` when the word has no entry. Definitions are stable, so responses are cached for 24 hours.

Query parameters
word*stringThe word or phrase to define.
Response fields (data)
word*string
syllables*string | nullThe word split into syllables, when the source provides it.
etymology*string | nullWord origin, when available.
pronunciations*array<object>
text*string
notation*string | nullThe transcription system used, when the source states one.
audio_url*string · uri | nullSpoken pronunciation, when available.
entries*array<object>One entry per part of speech, in the order the source ranks them.
part_of_speech*string
inflections*array<object>
label*string
text*string
definitions*array<object>
text*string
synonyms*array<string>
examples*array<string>
Response meta

Platform fields, identical on every endpoint — what they mean.

curl "https://api.endpointry.com/v1/google/dictionary" \
  -H "Authorization: Bearer sk_live_..."
const res = await fetch("https://api.endpointry.com/v1/google/dictionary", {
  headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});

if (!res.ok) {
  const problem = await res.json();
  throw new Error(`${problem.code}: ${problem.detail} (${problem.request_id})`);
}
const { data, meta } = await res.json();
import os, requests

res = requests.get(
    "https://api.endpointry.com/v1/google/dictionary",
    headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
    timeout=15,
)
body = res.json()
if res.status_code != 200:
    raise RuntimeError(f"{body['code']}: {body['detail']} ({body['request_id']})")
data, meta = body["data"], body["meta"]
200 · application/json
{
  "meta": {
    "request_id": "req_7729f93d3facf68ff83e5c50",
    "as_of": "2026-07-31T12:00:00.000Z",
    "cache": "MISS"
  },
  "data": {
    "word": "serendipity",
    "syllables": "ser·en·dip·i·ty",
    "etymology": "1750s: coined by Horace Walpole, suggested by The Three Princes of Serendip, the title of a fairy tale in which the heroes 'were always making discoveries, by accidents and sagacity, of things they were not in quest of'.",
    "pronunciations": [
      {
        "text": "/ˌserənˈdipədē/",
        "notation": "IPA",
        "audio_url": "https://ssl.gstatic.com/dictionary/static/sounds/oxford/serendipity--_us_1.mp3"
      }
    ],
    "entries": [
      {
        "part_of_speech": "noun",
        "inflections": [
          {
            "label": "plural",
            "text": "serendipities"
          }
        ],
        "definitions": [
          {
            "text": "the occurrence and development of events by chance in a happy or beneficial way.",
            "synonyms": [
              "chance",
              "happy chance",
              "accident",
              "fluke"
            ],
            "examples": [
              "a fortunate stroke of serendipity"
            ]
          }
        ]
      }
    ]
  }
}