Read a batch and each charger's step
get/v1/migrations/{migration_id}/batches/{batch_id}
Requires an API key
The batch with each charger's step (pending, moving, moved, blocked, failed, superseded, skipped), its move request and how long the move took, and the rollback jobs of its chargers with their timings. Any participant; a narrowed team sees the chargers at its sites. Errors: 404 migration_batch_not_found, 404 migration_not_found. See Errors and statuses.
Path parameters
- batch_idstringRequiredPattern
^bat_[0-9a-f]{32}$ - migration_idstringRequiredPattern
^mig_[0-9a-f]{32}$
Returns · 200
- idstringRequiredbat_...
- migration_idstringRequired
- namestringRequired
- statusenumRequireddraft, submitted (waiting for the client's approval), approved, running, paused, completed, cancelled (moved chargers stay on Ivora) or rolled_back (a rollback of the batch was asked).One of
draft,submitted,approved,running,paused,completed,cancelled,rolled_back - pacingPacingRequired
Child attributes
- wave_sizeintegerRequired
- interval_secondsintegerRequired
- canaryintegerRequired
- max_failure_rationumberRequired
- idle_timeout_minutesintegerRequired
- move_timeout_minutesintegerRequired
- countsobjectRequiredChargers per step, and total (of the caller's sites when narrowed).
- waveintegerRequiredWaves started.
- wave_openbooleanRequiredA wave's moves are out and not all answered.
- next_wave_atstring | nullRequiredWhen the next wave may start (running, between waves).
- paused_reasonenum | nullRequiredWhy a paused batch paused: manual, canary (after its first wave), failure_ratio, rollback_requested (a rollback anywhere in the migration), runner_unhealthy or migration_paused (the migration was paused).One of
manual,canary,failure_ratio,rollback_requested,runner_unhealthy,migration_paused - paused_atstring | nullRequired
- job_idstringRequiredThe job of its moves (GET .../jobs/{job_id}).
- created_bystringRequired
- created_atstringRequired
- updated_atstringRequired
- submitted_bystring | nullRequired
- submitted_atstring | nullRequired
- approvalobject | nullRequiredThe client's approval; null until approved, and again after an edit.
Child attributes
- bystringRequired
- roleenumRequiredOne of
client,support,partner,observer - team_idstring | nullRequired
- atstringRequired
- chargersintegerRequiredChargers in the batch when it was approved.
- digeststringRequiredSHA-256 of the approved charger set and pacing; any edit revokes the approval.
- started_bystring | nullRequiredWho started it, or resumed it last: its moves are asked in their name.
- started_atstring | nullRequired
- finished_atstring | nullRequired
- duration_snumber | nullRequiredSeconds from its start to its end (or now while it runs).
- rollbacksarray of BatchRollbackRequiredRollback jobs of its chargers, with their timings.
Child attributes
- job_idstringRequiredThe rollback job (GET .../jobs/{job_id}).
- requested_atstringRequired
- requested_bystringRequired
- reasonstringRequired
- chargersintegerRequiredChargers it rolls back (skipped ones left out).
- appliedintegerRequiredChargers switched back by the proxy.
- statusenumRequiredOne of
running,succeeded,failed - last_applied_atstring | nullRequiredWhen the proxy switched the last of them back.
- switch_snumber | nullRequiredSeconds from the request to the last switch back.
- chargersarray of BatchCharger | nullRequiredEach charger's step; null in a list.
Child attributes
- station_idintegerRequired
- charger_keystringRequired
- location_idinteger | nullRequired
- stepenumRequiredpending: waiting for its wave (detail busy: refused while charging, retried at retry_at). moving: its move request is out. moved: on Ivora. blocked: not moved (detail not_idle, not_proxied, shadow, rollback_pending). failed: the proxy failed or refused it, or did not answer in time (detail refused_parity, failed, expired). superseded: a rollback took over. skipped: the batch was cancelled or rolled back first, or the charger left the migration (detail).One of
pending,moving,moved,blocked,failed,superseded,skipped - detailstring | nullRequired
- waveinteger | nullRequiredThe wave of its latest move request.
- attemptsintegerRequiredMove requests sent for it (a busy charger is retried).
- request_idstring | nullRequiredIts latest move request (rr_...).
- requested_atstring | nullRequired
- retry_atstring | nullRequiredA busy charger's next attempt at the earliest.
- settled_atstring | nullRequired
- move_snumber | nullRequiredSeconds from its move request to the proxy's report that it moved.
GET /v1/migrations/{migration_id}/batches/{batch_id}
curl --fail-with-body "https://api.ivoracharge.com/v1/migrations/mig_0123456789abcdef0123456789abcdef/batches/bat_0123456789abcdef0123456789abcdef" \
-H "Authorization: Bearer $IVORA_API_KEY"Response · 200JSON
{
"id": "id_0123456789abcdef",
"migration_id": "migration_0123456789abcdef",
"name": "bay-01",
"status": "draft",
"pacing": {
"wave_size": 1,
"interval_seconds": 1,
"canary": 1,
"max_failure_ratio": 1.5,
"idle_timeout_minutes": 1,
"move_timeout_minutes": 1
},
"counts": {},
"wave": 1,
"wave_open": false,
"next_wave_at": "2026-09-30T17:00:00Z",
"paused_reason": "manual",
"paused_at": "2026-09-30T17:00:00Z",
"job_id": "job_0123456789abcdef",
"created_by": "string",
"created_at": "2026-09-30T17:00:00Z",
"updated_at": "2026-09-30T17:00:00Z",
"submitted_by": "string",
"submitted_at": "2026-09-30T17:00:00Z",
"approval": {
"by": "string",
"role": "client",
"team_id": "team_0123456789abcdef",
"at": "string",
"chargers": 1,
"digest": "string"
},
"started_by": "string",
"started_at": "2026-09-30T17:00:00Z",
"finished_at": "2026-09-30T17:00:00Z",
"duration_s": 1.5,
"rollbacks": [
{
"job_id": "job_0123456789abcdef",
"requested_at": "2026-09-30T17:00:00Z",
"requested_by": "string",
"reason": "string",
"chargers": 1,
"applied": 1,
"status": "running",
"last_applied_at": "2026-09-30T17:00:00Z",
"switch_s": 1.5
}
],
"chargers": [
{
"station_id": 1,
"charger_key": "string",
"location_id": 7,
"step": "pending",
"detail": "string",
"wave": 1,
"attempts": 1,
"request_id": "request_0123456789abcdef",
"requested_at": "2026-09-30T17:00:00Z",
"retry_at": "2026-09-30T17:00:00Z",
"settled_at": "2026-09-30T17:00:00Z",
"move_s": 1.5
}
]
}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.



