Docs/Webhooks/Migrations

migration.failed

An import into a Repull Migrate workspace stopped with an error. The connection is kept.

When it fires

When an import run ends in an error — most often the old system rejecting the credentials, or its API rate limit. data.error says what happened. Fix the cause (usually the property manager reconnecting on a new migrate session with X-Workspace-Id) and run it again with POST /v1/migrations/{workspaceId}/import.

Payload

Every delivery uses the same outer envelope (event, eventId, apiVersion, timestamp, data). Dedupe on eventId — it stays stable across retries and replays, while the X-Repull-Delivery-Id header changes on every attempt.

{
  "event": "migration.failed",
  "eventId": "3f1c9a2e-8b7d-4c6a-9e0f-1a2b3c4d5e6f",
  "apiVersion": "2026-04",
  "timestamp": "2026-05-01T12:34:56.000Z",
  "data": {
    "workspaceId": "1204",
    "provider": "guesty",
    "connectionId": "812",
    "status": "failed",
    "startedAt": "2026-09-24T18:02:11.000Z",
    "finishedAt": "2026-09-24T18:02:14.000Z",
    "entities": [
      "listings",
      "reservations"
    ],
    "error": "Guesty rejected the credentials (401). Reconnect the source and run the import again."
  }
}

Verifying signatures

Every delivery includes a timestamped X-Repull-Signature header of the form t=<unix_ts>,v1=<hex>, where v1 is HMAC-SHA256(signing_secret, `${t}.${raw_body}`). Verify it before processing — see Verify Signatures for full Node.js and Python examples.

Use the raw body

Sign the raw request body exactly as received, not a re-stringified JSON object. Re-serialisation can reorder keys or change whitespace and break the signature.

Tip: Acknowledge with a 2xx status within 10 seconds. Failed deliveries are retried up to 5 times with exponential backoff.Webhook reliability →

AI