List site migration candidates

GET/v1/api/sites/{site_id}/migrations/candidates

List the site's migration candidates.

Scope
sites:read
Token
API key or OAuth access token
Role
Any workspace member
MCP tool
list_migration_candidates · preview: MCP write tools are in preview
What scopes, tokens and roles mean →
Request
curl "https://api.crawle.io/v1/api/sites/11111111-1111-1111-1111-111111111111/migrations/candidates" \
  -H "Authorization: Bearer $CRAWLE_API_KEY"
const response = await fetch("https://api.crawle.io/v1/api/sites/11111111-1111-1111-1111-111111111111/migrations/candidates", {
  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/migrations/candidates",
    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
{
  "detector_status": "unknown",
  "fetch_errors": 0,
  "items": [
    {
      "avg_path_similarity": 1.5,
      "central_project_id": "example",
      "central_project_status": "example",
      "central_site_id": "example",
      "confidence": 1.5,
      "confirm_blocked_reason": "example",
      "confirmable": true,
      "details": {},
      "first_detected_at": "example",
      "homepage_redirect_count": 1,
      "id": 1,
      "last_detected_at": "example",
      "migration_type": "example",
      "permanent_redirect_count": 1,
      "redirect_count": 1,
      "redirect_coverage": 1.5,
      "samples": [
        {
          "first_seen_at": "example",
          "id": 1,
          "is_homepage_target": true,
          "last_seen_at": "example",
          "path_similarity": 1.5,
          "redirect_count": 1,
          "source_url": "https://example.com/",
          "status_code": 1,
          "target_url": "https://example.com/"
        }
      ],
      "source_domain": "example.com",
      "status": "example",
      "target_domain": "example.com",
      "target_site_id": "example",
      "target_verified": false,
      "temporary_redirect_count": 1,
      "website_id": 1
    }
  ],
  "total": 1
}

Example generated from the API contract.

Parameters

site_idpath · string (uuid)required

Response 200

itemsarray of MigrationCandidaterequired
avg_path_similaritynumberrequired
central_project_idstring or null
central_project_statusstring or null
central_site_idstringrequired
confidencenumberrequired
confirm_blocked_reasonstring or null
Why confirmable is false, in words a customer can read; null when confirmable.
confirmableboolean
Whether the candidate can be confirmed as a migration now. A new confirmation needs at least one permanent (301 or 308) redirect to the target; an already confirmed project stays confirmable for its retry.default true
detailsobject or null
first_detected_atstringrequired
homepage_redirect_countintegerrequired
idintegerrequired
last_detected_atstringrequired
migration_typestringrequired
permanent_redirect_countintegerrequired
redirect_countintegerrequired
redirect_coveragenumberrequired
samplesarray of MigrationCandidateMapping
first_seen_atstringrequired
idintegerrequired
is_homepage_targetbooleanrequired
last_seen_atstringrequired
path_similaritynumberrequired
redirect_countintegerrequired
source_urlstringrequired
status_codeintegerrequired
target_urlstringrequired
source_domainstringrequired
statusstringrequired
target_domainstringrequired
target_site_idstring or null
target_verifiedboolean
default false
temporary_redirect_countintegerrequired
website_idintegerrequired
totalintegerrequired
detector_statusstring
default "unknown"
fetch_errorsinteger
default 0

Errors

  • 401

    When
    Missing, invalid, or expired token.
  • 403

    When
    The token has none of the accepted scopes (sites:read).
  • 422

    When
    The request did not match the schema. detail lists each problem.
  • 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.