Read a migration job and its per-charger progress
get/v1/migrations/{migration_id}/jobs/{job_id}
Requires an API key
A rollback job, or a batch's moves. Each charger: its route request (revision, not_before), the proxy's outcome, the rollback's status and the reconnect status. Any participant; a narrowed team sees the chargers at its sites. Errors: 404 migration_job_not_found, 404 migration_not_found. See Errors and statuses.
Path parameters
- job_idstringRequiredPattern
^job_[0-9a-f]{32}$ - migration_idstringRequiredPattern
^mig_[0-9a-f]{32}$
Returns · 200
- 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
GET /v1/migrations/{migration_id}/jobs/{job_id}
curl --fail-with-body "https://api.ivoracharge.com/v1/migrations/mig_0123456789abcdef0123456789abcdef/jobs/job_0123456789abcdef0123456789abcdef" \
-H "Authorization: Bearer $IVORA_API_KEY"Response · 200JSON
{
"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.



