Get redirect chain count

GET/v1/api/sites/{site_id}/redirect-chains/count

Count a site's redirect chains, as the Issues page counts them.

min_redirects 2 (the default) is a chain; 0 or 1 also counts single redirects. total is null while the availability is partial or unknown; confirmed_total is what was counted.

Scope
issues:read
Token
API key or OAuth access token
Role
Any workspace member
MCP tool
get_redirect_chain_count
What scopes, tokens and roles mean →
Request
curl "https://api.crawle.io/v1/api/sites/11111111-1111-1111-1111-111111111111/redirect-chains/count" \
  -H "Authorization: Bearer $CRAWLE_API_KEY"
const response = await fetch("https://api.crawle.io/v1/api/sites/11111111-1111-1111-1111-111111111111/redirect-chains/count", {
  headers: {
    Authorization: `Bearer ${process.env.CRAWLE_API_KEY}`,
  },
});
const data = await response.json();
import os

import requests

response = requests.request(
    "GET",
    "https://api.crawle.io/v1/api/sites/11111111-1111-1111-1111-111111111111/redirect-chains/count",
    headers={
        "Authorization": f"Bearer {os.environ['CRAWLE_API_KEY']}",
    },
)
data = response.json()
$CRAWLE_API_KEY
is an API key from Settings › API keys.
Response 200JSON
{
  "availability": {
    "awaiting_first_observation": 1,
    "known": 1,
    "not_applicable": 1,
    "observed_at": "example",
    "policy_generation": 1,
    "reasons": [
      "example"
    ],
    "state": "known",
    "substrate": "raw",
    "total": 1,
    "unknown": 1
  },
  "confirmed_total": 1,
  "issue_type": "example",
  "title": "Example",
  "total": 1,
  "website_id": 1
}

Example generated from the API contract.

Parameters

site_idpath · string (uuid)required
min_redirectsquery · integer
0–100 · default 2
min_hopsquery · integer or null
1–100
max_hopsquery · integer or null
1–100
chain_statusquery · string or null
up to 40 characters
response_status_classquery · string or null
up to 10 characters
cross_domainquery · boolean or null
directoryquery · string or null
up to 768 characters
segment_idquery · integer or null
at least 1
searchquery · string or null
up to 500 characters

Response 200

availabilityPublicObservationAvailabilityrequired
awaiting_first_observationinteger or null
knowninteger or null
not_applicableinteger or null
observed_atstring or null
policy_generationinteger or null
reasonsarray of string
stateenumrequired
known: every page in scope was observed. partial: some were not, so total is null. unknown: the scope could not be determined. not_applicable and awaiting_first_observation: there is nothing to observe yet.one of "known", "partial", "unknown", "not_applicable", "awaiting_first_observation"
substrateenum or null
Which kind of observation the availability is about.one of "raw", "content", "restrictions", "graph"
totalinteger or null
Pages in scope.
unknowninteger or null
confirmed_totalinteger or nullrequired
Chains found among the pages observed so far; a lower bound when partial.
issue_typestringrequired
titlestringrequired
totalinteger or nullrequired
Chains counted, or null while the availability is partial or unknown: a count over pages that were not all observed is not a total. confirmed_total is what was counted.
website_idintegerrequired

Errors

  • 401

    When
    Missing, invalid, or expired token.
  • 403

    When
    The token has none of the accepted scopes (issues:read).
  • 409

    When
    Conflict with the current state. detail says why.
  • 422

    When
    The request did not match the schema. detail lists each problem.
  • 502

    When
    The site's crawler answered outside the contract (crawler_response_invalid).
  • 503

    When
    Temporarily unavailable. detail says whether a retry is safe.
  • 429

    When
    Rate limited. Wait for Retry-After seconds.

All errors and what to do →

Generated from the API contract at 7e7039b0b, synced October 30, 2026.