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/migrations

Request

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: 25

Page size, 1–100.

cursorstring

`pagination.nextCursor` from the previous page.

Get a migration

GET/v1/migrations/:workspaceId

Note

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/report

Request

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-map

Note

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/import

Request

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-check

Request

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 }[]Required

Every upcoming reservation the destination holds (dates YYYY-MM-DD). Read-only.

Cut over

POST/v1/migrations/:workspaceId/cutover

Note

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/:workspaceId

Note

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