Skip to content

Roll a cutover back to the source PMS

POST
/v1/switchover/{connector_id}/roll-back
curl --request POST \
--url https://api.aerandil.com/v1/switchover/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/roll-back \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "reason": "example" }'

The cutover reversed (roll_back_connector_cutover, one transaction): the connector is active again and syncing, its cut_over_* record cleared (the events keep the history) and the reason appended to its notes; the conduits the cutover brought live are paused with a reason naming the rollback — a suspended one is left to the partner that stopped it, a closed one where it ended.

The answer counts the bookings taken in Aerandil since the cutover that the source PMS never saw (booked_in_aerandil_since_cutover: live reservations at a house this connector feeds, created after cut_over_at, not carrying the connector’s external ref) — they must be keyed back into the old PMS. 409 not_cut_over when there is no cutover to reverse, 409 connector_retired for a retired connector.

Needs the catch-all actions:apply or the route’s own grant; not from a desk bound to one property. Accepts an Idempotency-Key. Live data: Cache-Control: no-store.

connector_id
required
string format: uuid

The connector object’s id.

Idempotency-Key
string
>= 1 characters

Opaque idempotency token (Stripe-shape). Repeated POSTs with the same key replay the original response within the cache TTL rather than creating a duplicate object.

Media typeapplication/json
object
reason
required

Why, recorded on the connector and the paused conduits.

string
>= 1 characters
Examplegenerated
{
"reason": "example"
}

Rolled back.

Media typeapplication/json
object
booked_in_aerandil_since_cutover
required
integer format: int64
booked_in_aerandil_since_cutover_ids
required

Those reservations’ ids (at most 500).

Array<string>
conduits_left
required

Conduits the rollback did not pause (suspended or closed).

Array<object>
object
id
required
string format: uuid
status
required
string
conduits_paused
required
Array<string>
connector_business_id
required
string
connector_id
required
string format: uuid
idempotent_replay
boolean
resumed
required
boolean
rolled_back_cut_over_at
required

The cutover reversed.

string format: date-time
status
required
string
Allowed values: active
Example
{
"status": "active"
}
Cache-Control
string

Always no-store. Object and link state is live data and is never cacheable.

Token lacks actions:apply and the route’s own grant, or is a desk session bound to one property.

Media typeapplication/json

Structured error wrapper. Every non-2xx response from any Aerandil endpoint serialises to this shape; the HTTP status carries the failure class (4xx/5xx), the body adds a stable code for programmatic dispatch plus a human-readable message.

object
error
required
object
code
required

Stable, programmatic error code (e.g. unauthorized, forbidden, not_found, invalid_body, invalid_url, precondition_failed, no_secondary_key). Clients dispatch on code, not on the message (which may be localised or contextualised in future versions).

string
instance_id

Request-id correlation handle echoed on the request-id response header — support teams correlate without scraping logs.

string
message
required

Human-readable explanation of the failure.

string
parameters

Per-error structured detail. The shape varies by code (e.g. forbidden_action carries {"action": "..."}; precondition_failed carries {"current_version": N}).

Examplegenerated
{
"error": {
"code": "example",
"instance_id": "example",
"message": "example",
"parameters": "example"
}
}

No such connector.

Media typeapplication/json

Structured error wrapper. Every non-2xx response from any Aerandil endpoint serialises to this shape; the HTTP status carries the failure class (4xx/5xx), the body adds a stable code for programmatic dispatch plus a human-readable message.

object
error
required
object
code
required

Stable, programmatic error code (e.g. unauthorized, forbidden, not_found, invalid_body, invalid_url, precondition_failed, no_secondary_key). Clients dispatch on code, not on the message (which may be localised or contextualised in future versions).

string
instance_id

Request-id correlation handle echoed on the request-id response header — support teams correlate without scraping logs.

string
message
required

Human-readable explanation of the failure.

string
parameters

Per-error structured detail. The shape varies by code (e.g. forbidden_action carries {"action": "..."}; precondition_failed carries {"current_version": N}).

Examplegenerated
{
"error": {
"code": "example",
"instance_id": "example",
"message": "example",
"parameters": "example"
}
}

not_cut_over (nothing to roll back), connector_retired, connector_pipeline_invalid, or an Idempotency-Key still in flight.

Media typeapplication/json

Structured error wrapper. Every non-2xx response from any Aerandil endpoint serialises to this shape; the HTTP status carries the failure class (4xx/5xx), the body adds a stable code for programmatic dispatch plus a human-readable message.

object
error
required
object
code
required

Stable, programmatic error code (e.g. unauthorized, forbidden, not_found, invalid_body, invalid_url, precondition_failed, no_secondary_key). Clients dispatch on code, not on the message (which may be localised or contextualised in future versions).

string
instance_id

Request-id correlation handle echoed on the request-id response header — support teams correlate without scraping logs.

string
message
required

Human-readable explanation of the failure.

string
parameters

Per-error structured detail. The shape varies by code (e.g. forbidden_action carries {"action": "..."}; precondition_failed carries {"current_version": N}).

Examplegenerated
{
"error": {
"code": "example",
"instance_id": "example",
"message": "example",
"parameters": "example"
}
}

Malformed body, or an empty reason.

Media typeapplication/json

Structured error wrapper. Every non-2xx response from any Aerandil endpoint serialises to this shape; the HTTP status carries the failure class (4xx/5xx), the body adds a stable code for programmatic dispatch plus a human-readable message.

object
error
required
object
code
required

Stable, programmatic error code (e.g. unauthorized, forbidden, not_found, invalid_body, invalid_url, precondition_failed, no_secondary_key). Clients dispatch on code, not on the message (which may be localised or contextualised in future versions).

string
instance_id

Request-id correlation handle echoed on the request-id response header — support teams correlate without scraping logs.

string
message
required

Human-readable explanation of the failure.

string
parameters

Per-error structured detail. The shape varies by code (e.g. forbidden_action carries {"action": "..."}; precondition_failed carries {"current_version": N}).

Examplegenerated
{
"error": {
"code": "example",
"instance_id": "example",
"message": "example",
"parameters": "example"
}
}