Roll chargers back to the previous platform: some, a site or all
A rollback job: every charger in scope (station_ids, location_ids, batch_id or all: true) that is routed to or connected on Ivora, or whose move is still out, gets a rollback that the charger proxy applies within seconds, immediate and also while charging (a session running on Ivora is then reconciled by hand). Nothing is sent to a charger. Chargers that cannot be rolled back now are listed as skipped (already_rolled_back, rollback_pending, not_proxied). Above 50 chargers socket closes are paced at the migration's drain_per_second; 50 or fewer go at once. Each rollback is the one GET /v1/tenants/{tenant_id}/migration/rollbacks/{rollback_id} reads. Needs the client or support role (a key needs stations:admin), which roll back any charger, or the partner role, which rolls back the chargers its own team moved while inside the migration's rollback window (403 migration_rollback_not_permitted otherwise; with location_ids or all: true the others are left out). A narrowed team's scope is its sites. A rollback pauses every running batch of the migration; with batch_id (refused unless every charger of the batch is at the caller's sites; with a partner, its own moves only) the batch stops for good (rolled_back) once the job takes back every charger it moved or is moving, and otherwise stays paused. Whatever the migration's status: Ivora can always roll back, so a paused, completed or archived migration's runner still applies it (after completion the previous platform may have dropped the charger; check it there first). A retry with the same Idempotency-Key returns the job as it is now. Its audit entries never block it. Errors: 403 forbidden, 403 migration_rollback_not_permitted, 404 migration_batch_not_found, 404 migration_charger_not_in_migration, 404 migration_not_found, 409 migration_nothing_to_roll_back. See Errors and statuses.
Path parameters
- migration_idstringRequiredPattern
^mig_[0-9a-f]{32}$
Headers
- idempotency-keystringRequired
Request body
- station_idsarray of integer | nullRoll these chargers back.
- location_idsarray of integer | nullOr every migration charger at these sites.
- batch_idstring | nullOr every charger of this batch; the batch then stops for good (rolled_back).Pattern
^bat_[0-9a-f]{32}$ - allboolean | nullOr true: every charger of the migration.
- reasonstringRequiredWhy, for the record: kept with each rollback, the audit log and the proxy's own audit.3–300 characters
Returns · 202
- idstringRequiredjob_...
- migration_idstringRequired
- kindenumRequiredrollback: a rollback job. move: a batch's moves (each attempt is one request).One of
rollback,move - batch_idstring | nullRequiredThe batch of a move job, or of a rollback of a batch; null otherwise.
- statusenumRequiredrunning while a charger is still open; then failed if any failed or expired (a rollback refused as busy too; a batch retries a busy move instead), else succeeded.One of
running,succeeded,failed - reasonstringRequired
- requested_bystringRequired
- requested_atstringRequired
- pacedbooleanRequiredA rollback of more than 50 chargers: socket closes are spread at drain_per_second.
- countsobjectRequiredChargers per outcome (open for those still running).
- chargersarray of JobChargerRequired
Child attributes
- station_idintegerRequired
- charger_keystringRequired
- request_idstringRequired
- revisioninteger | nullRequired
- not_beforestringRequiredWhen the runner may apply it: now, or later for a paced mass rollback.
- outcomeenum | nullRequirednull while open. applied, failed, superseded or expired: the proxy's result (or the rollback's expiry). skipped: not rolled back by this job (detail).One of
applied,refused_busy,refused_parity,failed,superseded,expired,skipped - detailstring | nullRequiredWhy it was skipped: already_rolled_back, rollback_pending or not_proxied.
- rollback_idstring | nullRequired
- rollback_statusstring | nullRequired
- reconnectstring | nullRequired
- reported_atstring | nullRequired
curl --fail-with-body -X POST "https://api.ivoracharge.com/v1/migrations/mig_0123456789abcdef0123456789abcdef/rollback" \
-H "Authorization: Bearer $IVORA_API_KEY" \
-H "Idempotency-Key: order-2026-09-30-0001" \
-H "Content-Type: application/json" \
-d '{
"reason": "string"
}'{
"id": "id_0123456789abcdef",
"migration_id": "migration_0123456789abcdef",
"kind": "rollback",
"batch_id": "batch_0123456789abcdef",
"status": "running",
"reason": "string",
"requested_by": "string",
"requested_at": "2026-09-30T17:00:00Z",
"paced": false,
"counts": {},
"chargers": [
{
"station_id": 1,
"charger_key": "string",
"request_id": "request_0123456789abcdef",
"revision": 1,
"not_before": "string",
"outcome": "applied",
"detail": "string",
"rollback_id": "rollback_0123456789abcdef",
"rollback_status": "string",
"reconnect": "string",
"reported_at": "2026-09-30T17:00:00Z"
}
]
}Try itproduction · api.ivoracharge.com
Paste a production api key (iv_live_…). Create keys in Developer tools. The key stays in this page's memory, is sent only to https://api.ivoracharge.com and clears when you reload. Test keys are refused.
POST is a write: you confirm the method, path and project before it is sent, with a generated Idempotency-Key.



