Log inTalk to us

Roll chargers back to the previous platform: some, a site or all

post/v1/migrations/{migration_id}/rollback
Requires an API key

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_idstringRequired
    Pattern ^mig_[0-9a-f]{32}$

Headers

  • idempotency-keystringRequired

Request body

  • station_idsarray of integer | null
    Roll these chargers back.
  • location_idsarray of integer | null
    Or every migration charger at these sites.
  • batch_idstring | null
    Or every charger of this batch; the batch then stops for good (rolled_back).
    Pattern ^bat_[0-9a-f]{32}$
  • allboolean | null
    Or true: every charger of the migration.
  • reasonstringRequired
    Why, for the record: kept with each rollback, the audit log and the proxy's own audit.
    3–300 characters

Returns · 202

  • idstringRequired
    job_...
  • migration_idstringRequired
  • kindenumRequired
    rollback: a rollback job. move: a batch's moves (each attempt is one request).
    One of rollback, move
  • batch_idstring | nullRequired
    The batch of a move job, or of a rollback of a batch; null otherwise.
  • statusenumRequired
    running 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
  • pacedbooleanRequired
    A rollback of more than 50 chargers: socket closes are spread at drain_per_second.
  • countsobjectRequired
    Chargers per outcome (open for those still running).
  • chargersarray of JobChargerRequired
    Child attributes
    • station_idintegerRequired
    • charger_keystringRequired
    • request_idstringRequired
    • revisioninteger | nullRequired
    • not_beforestringRequired
      When the runner may apply it: now, or later for a paced mass rollback.
    • outcomeenum | nullRequired
      null 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 | nullRequired
      Why it was skipped: already_rolled_back, rollback_pending or not_proxied.
    • rollback_idstring | nullRequired
    • rollback_statusstring | nullRequired
    • reconnectstring | nullRequired
    • reported_atstring | nullRequired
POST /v1/migrations/{migration_id}/rollback
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"
}'
Response · 202JSON
{
  "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"
    }
  ]
}
Requires an approved production API keyProduction access starts with a request, a short meeting with Ivora and a card on file, after which Ivora staff grant your account access. How to request access
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.