Bing SERP Rank Checker API — Position as JSON
Documentation menu
FetchLayer FetchLayer API

Check where a site ranks on Bing

Find where a domain or URL ranks in Bing’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 (lowest) position, and every match with its position, URL, title and result page, scanning up to depth positions (1–200, default 100). A domain target (example.com, or https://www.example.com/) matches that site and, by default, its subdomains; matching is on whole hostname labels, so notexample.com and example.com.evil.net never match, and www. is ignored on both sides. A URL with a path (example.com/blog) matches pages on that host under that path: /blog, /blog/ and /blog/post, but not /blogging. Positions are counted exactly as search counts them — organic results only, ads never take a position, a repeated URL once. The scan stops after the first result page containing a match, so several matches on that page are all reported; set allMatches to scan the full depth. found: false always means the whole depth was examined, or every result Bing lists when that is fewer (a note says so); if Bing cannot be read part-way through, the response is a retryable 503, never a "not found". Rankings differ by market and device and move between days — and noticeably between regions and between two checks minutes apart — so track a query over time. A depth-200 check typically takes around 30 seconds. Billing: A rank check costs 1 credit regardless of depth: scanning 200 positions across 10 or more result pages is billed as one request. serpPagesFetched reports how many result pages were read and is never billed.

POST /rank-check Web search
https://api.fetchlayer.dev/bing/rank-check
OpenAPI JSON

Headers

Authorization string required

Bearer token — your FetchLayer API key.

Parameters

query string required

The search query, as a searcher would type it (1–500 characters).

target string required

What to look for: a domain such as example.com (matches the site and its subdomains), or a URL with a path such as example.com/blog (matches pages under that path).

depth number optional

Organic positions to scan, e.g. 10, 20, 50 or 100 (1–200), or -1 for the maximum. One request at any depth. (default: 100)

allMatches boolean optional

Scan the full depth and report every matching position, instead of stopping after the first result page with a match. (default: false)

includeSubdomains boolean optional

For a domain target, whether subdomains such as blog.example.com count as the site. (default: true)

market string optional

Bing market: en-US, en-GB, en-CA, en-AU, en-IN, de-DE, fr-FR, es-ES, it-IT, nl-NL, pt-BR, ja-JP, zh-CN and 25 more (38 in all). Case-insensitive. Results and rankings differ by market. (default: en-US)

country string optional

Two-letter country, only when it should differ from the market’s (market en-US, country CA).

language string optional

Language code such as en, de or zh-hant, only when it should differ from the market’s.

safeSearch string optional

strict, moderate or off. (default: moderate)

timeRange string optional

any, day, week, month or year: only pages published or updated within it. (default: any)

device string optional

desktop or mobile: which results page to read. Bing ranks slightly differently on each. (default: desktop)

format string optional

json or markdown. (default: json)

timeoutMs number optional

Time limit for each page read, in milliseconds (1000–120000).

Response Fields

rank-check

Check where a site ranks on Bing

resultType string

search, rank-check, suggestions, news or videos.

requestedUrl string

The Bing page this result corresponds to.

notes string[]

Caveats about this particular result — a list that may be incomplete, a depth Bing could not reach, a later 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 "bing".

scrapedAt string

ISO 8601 timestamp of when the data was collected.

query string

The query that was run.

market string

The market the results are for.

country string

The two-letter country the results are for.

language string

The language the results are in.

safeSearch string

The safe search level applied.

target object

The target as understood: input, type (domain or url_prefix), value (the hostname, or host and path, that was matched) and includeSubdomains.

found boolean

Whether the target appeared within the scanned depth.

position number

Its best (lowest) organic position, or null.

matches object[]

Every match found: position, url, title and page.

depth number

The depth you asked for.

depthScanned number

Organic positions actually examined.

serpPagesFetched number

Result pages read. Informational only — never billed.

endOfResults boolean

Bing ran out of results before the requested depth.

pagesScraped number

Always 1: a rank check counts as one request against your plan, however deep it scans.

Request

curl -X POST "https://api.fetchlayer.dev/bing/rank-check" \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"query":"reddit api","target":"fetchlayer.dev","depth":200}'

Response

{
  "resultType": "rank-check",
  "requestedUrl": "https://www.bing.com/search?q=reddit+api&setlang=en&cc=US&mkt=en-US&adlt=moderate",
  "scrapedAt": "2026-09-15T21:19:53.823Z",
  "transport": "bing",
  "notes": [
    "Stopped after the first page containing the target; set allMatches to scan the full depth."
  ],
  "query": "reddit api",
  "market": "en-US",
  "country": "US",
  "language": "en",
  "safeSearch": "moderate",
  "timeRange": "any",
  "device": "desktop",
  "target": {
    "input": "fetchlayer.dev",
    "type": "domain",
    "value": "fetchlayer.dev",
    "includeSubdomains": true
  },
  "found": true,
  "position": 124,
  "matches": [
    {
      "position": 124,
      "url": "https://fetchlayer.dev/blog/reddit-api-closed-2026",
      "title": "Reddit API Shut Down in 2026: What Still Works | FetchLayer",
      "page": 10
    }
  ],
  "depth": 200,
  "depthScanned": 125,
  "serpPagesFetched": 10,
  "endOfResults": false,
  "pagesScraped": 1
}