Check where a site ranks on Google
Find where a domain or URL ranks in Google’s organic results for a query — built for SEO rank tracking. Send a query and a target and get back whether it was found, its best position, the page that position is on, the best-ranked matching URL, and every match with its position, page, place on the page, URL and title, examining up to depth organic results (1–100, default 50). match decides what counts: domain (any page of the site), exact_url (that URL only) or url_prefix (the URL and everything under it, at a path boundary, so /blog matches /blog/post but not /blogging); it defaults to domain for a bare domain and url_prefix for a URL with a path. Matching is on whole hostnames, so notexample.com and example.com.other.net never count; www. and m. always count, and other subdomains count unless includeSubdomains is false. Positions are counted exactly as search counts them — organic results only, ads never take a position. The check stops at the page where the target is first found (stoppedAtFirstMatch) unless allMatches is set. It also reports otherAppearances: where the target shows up outside the organic ranking on the pages it read — as a sitelink, an ad, in top stories, videos or discussions, in the knowledge panel or the answer box — each with its feature, page, URL and title. found: false means depthScanned results were examined, or every result Google had when there were fewer (endOfResults). Rankings differ by country, language, location and device and move over time; results reflect a US, English, desktop searcher unless you set otherwise. A deep check can take 15 seconds or more, and up to about 150 seconds when Google turns requests away. Billing: A rank check costs 1 credit regardless of depth: scanning 100 positions across 10 or more result pages is billed as one request. serpPagesFetched reports how many result pages were read and is never billed.
/rank-check Web search https://api.fetchlayer.dev/google-search/rank-check Headers
Authorization string required Bearer token — your FetchLayer API key.
Parameters
query string required The search query, exactly as typed into Google (1–2048 characters).
target string required The site or page to find: a domain such as example.com, or a URL such as https://example.com/pricing. A leading www. and the scheme are ignored.
match string optional domain, exact_url or url_prefix. Defaults to domain for a bare domain and url_prefix for a URL with a path.
includeSubdomains boolean optional For a domain target, whether subdomains such as blog.example.com count. (default: true)
depth number optional Organic results to examine at most, e.g. 10, 30, 50 or 100 (1–100). One request at any depth. (default: 50)
allMatches boolean optional Keep looking after the first match and report every matching result within the depth. (default: false)
country string optional Two-letter country the results are for: US, GB, DE, FR, IN, BR and so on. Case-insensitive. Rankings differ by country. (default: US)
language string optional Interface and snippet language: en, de, fr, pt-BR and so on. (default: en)
location string optional A city to localize results to, as a canonical location name "City,Region,Country", e.g. "Austin,Texas,United States". Local results and rankings follow it.
device string optional desktop or mobile results. A mobile search takes about 15 seconds. (default: desktop)
format string optional json or markdown. (default: json)
timeoutMs number optional Time limit for each result page read, in milliseconds (1000–60000).
Response Fields
rank-check
Check where a site ranks on Google
resultType string search, rank-check or autocomplete.
requestedUrl string The Google page this result corresponds to.
notes string[] Caveats about this particular result — a result whose link could not be followed, a page that could not be read. Empty when there are none. Read it on every call.
transport string The source this data came from. Always "google".
scrapedAt string ISO 8601 timestamp of when the data was collected.
parameters object The searcher the results are for, after defaults: query, country (lower case), language, location, device, safeSearch and timeRange.
target object The target as understood: input, match (domain, exact_url or url_prefix), host (without www.), path (for URL targets, else null) and includeSubdomains.
found boolean Whether the target appears in the organic results examined.
position number Its best organic position across pages, or null.
foundOnPage number The result page that position is on, or null.
url string The best-ranked matching URL, or null.
matches object[] Every matching organic result found: position, page, pagePosition, url and title. Without allMatches, the matches on the page where the target was first found.
otherAppearances object[] Where the target also appears on the pages examined: feature (sitelink, ad, top_stories, video, discussion, knowledge_panel or answer_box), page, url and title.
depthScanned number Organic results examined.
depthRequested number The depth you asked for.
stoppedAtFirstMatch boolean True when the check stopped at the first match rather than examining the full depth.
endOfResults boolean True when Google had fewer results than the depth.
serpPagesFetched number Result pages read. Informational only — never billed.
pagesScraped number Always 1: a rank check counts as one request against your plan, however many pages it reads.
Request
curl -X POST "https://api.fetchlayer.dev/google-search/rank-check" \
-H "Authorization: Bearer ss-your-key" \
-H "Content-Type: application/json" \
-d '{"query":"open source crm","target":"github.com","depth":30}'Response
{
"requestedUrl": "https://www.google.com/search?q=open+source+crm&hl=en&gl=us&pws=0&safe=off",
"scrapedAt": "2026-09-15T20:59:30.000Z",
"transport": "google",
"notes": [],
"resultType": "rank-check",
"parameters": {
"query": "open source crm",
"country": "us",
"language": "en",
"location": null,
"device": "desktop",
"safeSearch": "off",
"timeRange": "any"
},
"target": {
"input": "github.com",
"match": "domain",
"host": "github.com",
"path": null,
"includeSubdomains": true
},
"found": true,
"position": 3,
"foundOnPage": 1,
"url": "https://github.com/SuiteCRM/SuiteCRM",
"matches": [
{
"position": 3,
"page": 1,
"pagePosition": 3,
"url": "https://github.com/SuiteCRM/SuiteCRM",
"title": "SuiteCRM - Open source CRM for the world"
}
],
"otherAppearances": [],
"depthScanned": 9,
"depthRequested": 30,
"stoppedAtFirstMatch": true,
"endOfResults": false,
"serpPagesFetched": 1,
"pagesScraped": 1
}