Get redirect chain
GET
/v1/api/sites/{site_id}/redirect-chains/{chain_key}Read one redirect chain with its hops, from the list that showed it.
snapshot and the filters must be those of that list; a chain that is not in the snapshot is a 404.
- Scope
issues:read- Token
- API key or OAuth access token
- Role
- Any workspace member
- MCP tool
get_redirect_chain- What scopes, tokens and roles mean →
Request
cURL
curl "https://api.crawle.io/v1/api/sites/11111111-1111-1111-1111-111111111111/redirect-chains/example?snapshot=example" \ -H "Authorization: Bearer $CRAWLE_API_KEY"
JavaScript
const response = await fetch("https://api.crawle.io/v1/api/sites/11111111-1111-1111-1111-111111111111/redirect-chains/example?snapshot=example", {
headers: {
Authorization: `Bearer ${process.env.CRAWLE_API_KEY}`,
},
});
const data = await response.json();Python
import os
import requests
response = requests.request(
"GET",
"https://api.crawle.io/v1/api/sites/11111111-1111-1111-1111-111111111111/redirect-chains/example?snapshot=example",
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
{
"chain_key": "example",
"chain_status": "resolved",
"crawled_at": "example",
"cross_domain": true,
"final_url": "https://example.com/",
"hop_count": 1,
"hops": [
{
"is_redirect_step": true,
"location": "example",
"status_code": 1,
"unique_internal_source_count": 1,
"url": "https://example.com/"
}
],
"inlinks_evaluated_at": "example",
"last_known_url": "https://example.com/",
"redirect_count": 1,
"redirect_transition_count": 1,
"site_id": 1,
"start_url": "https://example.com/",
"terminal_status_code": 1,
"unavailable_reason": "example",
"unique_internal_entry_source_count": 1,
"unique_internal_inlink_count": 1,
"url_id": 1
}Example generated from the API contract.
Parameters
site_idpath · string (uuid)requiredchain_keypath · stringrequired- 1–128 characters
snapshotquery · stringrequired- 1–4096 characters
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 nulldirectoryquery · 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
chain_keystringrequired- Identity of the chain within the snapshot it was listed in; opaque.
start_urlstringrequiredchain_statusenum or null- resolved: the chain ends at a final page. loop: it revisits a URL. break: a hop is missing or failed. truncated: it was cut at the crawler's hop limit. unavailable: the chain could not be read; see unavailable_reason.one of "resolved", "loop", "break", "truncated", "unavailable"
crawled_atstring or nullcross_domainboolean or nullfinal_urlstring or nullhop_countinteger or nullhopsarray of PublicRedirectHopis_redirect_stepboolean or nulllocationstring or nullstatus_codeinteger or nullunique_internal_source_countinteger or nullurlstringrequiredinlinks_evaluated_atstring or nulllast_known_urlstring or nullredirect_countinteger or nullredirect_transition_countinteger or nullsite_idinteger or nullterminal_status_codeinteger or nullunavailable_reasonstring or nullunique_internal_entry_source_countinteger or nullunique_internal_inlink_countinteger or nullurl_idinteger or null
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.
detailsays why.
422
- When
- The request did not match the schema.
detaillists each problem.
502
- When
- The site's crawler answered outside the contract (
crawler_response_invalid).
503
- When
- Temporarily unavailable.
detailsays whether a retry is safe.
429
- When
- Rate limited. Wait for
Retry-Afterseconds.
Generated from the API contract at 7e7039b0b, synced October 30, 2026.