Migrations
Repull Migrate — every property manager you move gets a workspace of their own. Start one with POST /v1/connect and purpose: "migrate", then track it here. Read the workspace's data with the regular endpoints plus the X-Workspace-Id header.
List migrations
GET
/v1/migrationsRequest
curl https://api.repull.dev/v1/migrations?limit=25 \ -H "Authorization: Bearer $REPULL_API_KEY"
Response
{
"data": [ { "workspaceId": "1204", "name": "Seaside Rentals", "state": "imported", "counts": { "listings": 48, "reservations": 1312 } } ],
"pagination": { "nextCursor": null, "hasMore": false, "total": 1 }
}Query Parameters
limitintegerDefault: 25Page size, 1–100.
cursorstring`pagination.nextCursor` from the previous page.
Get a migration
GET
/v1/migrations/:workspaceIdNote
state: awaiting_connection → importing → imported, then cut_over. failed when the last import errored; deactivated after DELETE.
Request
curl https://api.repull.dev/v1/migrations/1204 \ -H "Authorization: Bearer $REPULL_API_KEY"
Response
{
"data": {
"workspaceId": "1204", "name": "Seaside Rentals", "externalRef": "acct_8812", "state": "imported", "cutoverAt": null,
"connections": [ { "id": "812", "provider": "guesty", "status": "active",
"import": { "status": "completed", "finishedAt": "2026-09-24T18:06:47Z", "results": [ { "entityType": "listings", "processed": 48, "errors": 0 } ] } } ],
"counts": { "listings": 48, "reservations": 1312, "upcomingReservations": 211, "guests": 1040, "conversations": 886 }
}
}Get the migration report
GET
/v1/migrations/:workspaceId/reportRequest
curl https://api.repull.dev/v1/migrations/1204/report \ -H "Authorization: Bearer $REPULL_API_KEY"
Response
{
"data": {
"workspaceId": "1204",
"issues": [ { "severity": "warning", "entity": "reservations", "code": "reservation_missing_guest_contact",
"message": "Upcoming reservations with neither a guest email nor a phone number.", "count": 3, "sampleIds": [215906, 215911, 215940] } ],
"capabilities": { "guesty": { "read": { "listings": { "level": "full" } } } }
}
}Get channel links
GET
/v1/migrations/:workspaceId/channel-mapNote
Read live from the source system on every call.
Request
curl https://api.repull.dev/v1/migrations/1204/channel-map \ -H "Authorization: Bearer $REPULL_API_KEY"
Response
{
"data": { "workspaceId": "1204", "sources": [ { "provider": "guesty", "supported": true, "error": null } ],
"listings": [ { "listingId": "5668", "name": "Ocean View 2BR", "provider": "guesty", "externalListingId": "63f1c0e2a9d1b2",
"airbnb": { "listingId": "1161202454004135464" }, "booking": { "hotelId": "10167991", "roomId": "110" }, "vrbo": null } ] }
}Run the import again
POST
/v1/migrations/:workspaceId/importRequest
curl -X POST https://api.repull.dev/v1/migrations/1204/import \
-H "Authorization: Bearer $REPULL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"entities": ["messages"]}'Response
{ "data": { "workspaceId": "1204", "queued": [ { "connectionId": "812", "provider": "guesty", "queued": true } ] } }Body Parameters
entitiesstring[]Any of listings, reservations, messages, calendar. Defaults to listings and reservations.
sincestring (ISO-8601)Only reservations changed after this.
Check reservations before switching
POST
/v1/migrations/:workspaceId/cutover-checkRequest
curl -X POST https://api.repull.dev/v1/migrations/1204/cutover-check \
-H "Authorization: Bearer $REPULL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"reservations": [{"confirmationCode": "HMABC123", "checkIn": "2026-10-01", "checkOut": "2026-10-04"}]}'Response
{ "data": { "matched": 210, "missing": [], "extra": [], "mismatched": [] } }Body Parameters
reservations{ confirmationCode, checkIn, checkOut }[]RequiredEvery upcoming reservation the destination holds (dates YYYY-MM-DD). Read-only.
Cut over
POST
/v1/migrations/:workspaceId/cutoverNote
Disconnects the source so it stops syncing. The imported data stays readable. Idempotent.
Request
curl -X POST https://api.repull.dev/v1/migrations/1204/cutover \ -H "Authorization: Bearer $REPULL_API_KEY"
Response
{ "data": { "workspaceId": "1204", "state": "cut_over", "cutoverAt": "2026-10-01T09:00:00Z", "disconnectedConnections": 1 } }End a migration
DELETE
/v1/migrations/:workspaceIdNote
Cuts over and deactivates the workspace. The imported data is kept.
Request
curl -X DELETE https://api.repull.dev/v1/migrations/1204 \ -H "Authorization: Bearer $REPULL_API_KEY"
Response
{ "data": { "workspaceId": "1204", "deactivated": true, "deactivatedAt": "2026-10-02T09:00:00Z" } }AI