Migration portal
Migration workspaces: one migration of a project's chargers from a previous platform, for the teams working on it. Open one on the project (stations:admin), list yours (/v1/me/migrations) and read it, import the network into it (/v1/migrations/{migration_id}/imports: the project's network import, whose applied stations join the migration as imported), its chargers (the state board: imported, proxied, shadow, moved, rolling_back, rolled_back, filtered by state, site or job, and each charger's state history), its jobs and its audit log under /v1/migrations/{migration_id}. Roll chargers back by charger, site or all as one job: the charger proxy applies each rollback within seconds, and above 50 chargers socket closes are paced. Roles: client (the project team's owners and admins), Ivora support (on every migration), partner and observer. The client invites partner (or installer) and observer teams by team ID or email, optionally narrowed to some sites; invitees accept at /v1/me/migration-invites for a team they own or administer or a new one, and see that migration and nothing else of the project. A partner rolls back the chargers its own team moved and reads the redacted OCPP log of the migration's chargers. A participant team's owners and admins make team migration keys (migration:* scopes within their own role, shown once) for the Ivora CLI and partner integrations: a key works on its migration's routes only, capped on every request by its creator's current role, and every project route refuses it. The charger proxy's sync agent holds a runner credential (scope migration:routes, shown once) and long-polls the desired routes, reports outcomes and sends heartbeats. The pilot rollback routes under /v1/tenants/{tenant_id}/migration act on the same rollbacks.
52 endpoints
- getDownload the network import CSV template (migration)/v1/migrations/{migration_id}/imports/templateThe same template as the project's (GET /v1/tenants/{tenant id}/imports/template).
- getList a migration's network imports/v1/migrations/{migration_id}/importsThis migration's imports, newest first, without their rows.
- postDry-run a network import into a migration, or apply it/v1/migrations/{migration_id}/importsThe project's network import (POST /v1/tenants/{tenant id}/imports: the same bodies, limits, plan, apply and resume) into the migration's project, for the migration's teams.
- getRead a migration's network import and its rows/v1/migrations/{migration_id}/imports/{import_id}As the project's read, and each station row's migration state and charger key.
- getDownload a migration import's per-charger move plan/v1/migrations/{migration_id}/imports/{import_id}/move-planAs the project's move plan (GET /v1/tenants/{tenant id}/imports/{import id}/move-plan).
- postRemove what a migration's network import created/v1/migrations/{migration_id}/imports/{import_id}/revertAs the project's revert: deletes the stations the import created that never connected and have no history, then its locations no station is at; the deleted stations leave the migration (audited as migration.charger.released).
- getList the project's migrations/v1/tenants/{tenant_id}/migrationsOldest first, with the caller's role in each (null for a key without one).
- postOpen a migration workspace on the project/v1/tenants/{tenant_id}/migrationsCreates a migration of the project's chargers from a previous platform, with two participants: the client (the project's team) and Ivora support, which always stays (with or without an Ivora rollback commitment).
- postAsk Ivora for a migration of the project's chargers/v1/tenants/{tenant_id}/migration-requestsSends Ivora the source platform, about how many chargers and sites, a target window, an optional migration partner or installer and notes; Ivora staff are alerted, open the workspace and mark the request workspace created, or decline it with a reason.
- getList your migration requests/v1/me/migration-requestsThe migration requests you sent, newest first, with their status (open, workspace created with the migration id, declined with Ivora's reason).
- getList migration requests (Ivora staff)/v1/migration-requestsEvery project's migration requests, oldest first, filtered by status and project: the open ones are Ivora's queue.
- getRead a migration request/v1/migration-requests/{request_id}Ivora platform administrators, and the requester; Ivora platform support gets 403 (on another's request), anyone else 404.
- patchSettle a migration request (Ivora staff)/v1/migration-requests/{request_id}status workspace created with the migration id opened for the request's project, or declined with a reason the requester sees.
- getList the migrations you work on/v1/me/migrationsEvery migration where one of your teams participates, with your role and permissions in it; Ivora staff see every migration.
- getRead a migration workspace/v1/migrations/{migration_id}The workspace: settings, participants, chargers per state, runner health, and your role and permissions.
- patchRename, configure, pause, complete or archive a migration/v1/migrations/{migration_id}Any of name, settings (only the fields sent change) and status, in one change.
- getList a migration's teams/v1/migrations/{migration_id}/participantsThe client, Ivora support, and the invited partner and observer teams with their kind, narrowing and status (invited or active), and who invited each team (the client, or Ivora support on its behalf).
- postInvite a team to a migration/v1/migrations/{migration_id}/participantsInvite a partner (or installer), which imports, plans and executes batches, rolls back the chargers its own team moved inside the rollback window and reads their OCPP log, or an observer, which reads.
- patchChange an invited team's kind or sites/v1/migrations/{migration_id}/participants/{participant_id}kind (partner or observer), scope (the sites it sees) or all sites: true (every site).
- deleteRemove a team, or revoke its invite/v1/migrations/{migration_id}/participants/{participant_id}Takes effect on the team's next request, and revokes the team's migration keys.
- getList a migration's chargers (the state board)/v1/migrations/{migration_id}/chargersEach charger with its state (imported, proxied, shadow, moved, rolling back, rolled back) and since when, the route the proxy reports and the one asked for, the side it is connected on, its open route request and its latest rollback with the reconnect status, and its latest batch with its step there.
- postAdd chargers to a migration (Ivora staff)/v1/migrations/{migration_id}/chargersIvora support adds the project's stations from the pilot proxy's allowlist: each one's routing key and its station (station id, station name or charger id).
- getRead a migration charger and its state history/v1/migrations/{migration_id}/chargers/{station_id}The board's row for one charger, with its state changes newest first: from, to, the cause (added, proxy, shadow, site flip, rollback, reconciled), the actor and when.
- getRead a migration charger's OCPP message log/v1/migrations/{migration_id}/chargers/{station_id}/ocpp-messagesThe OCPP messages the charging core exchanged with one charger of this migration, newest first, redacted as on the project's own log: passwords, keys and secret configuration values read [redacted], credentials in URLs and HTTP headers are masked, ID tokens show their last 4 characters and certificates are cut.
- postRoll chargers back to the previous platform: some, a site or all/v1/migrations/{migration_id}/rollbackA 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).
- getRead a migration job and its per-charger progress/v1/migrations/{migration_id}/jobs/{job_id}A rollback job, or a batch's moves.
- getList a migration's batches/v1/migrations/{migration_id}/batchesOldest first, with each batch's status, pacing, counts per step, approval and timings (chargers null: read one batch for them).
- postPlan a batch of chargers to move/v1/migrations/{migration_id}/batchesA draft batch of the migration's chargers (station ids, or every charger at location ids; 500 at most), each in one open batch at a time.
- getRead a batch and each charger's step/v1/migrations/{migration_id}/batches/{batch_id}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.
- patchEdit a batch that has not started/v1/migrations/{migration_id}/batches/{batch_id}name, station ids (replaces the chargers) or pacing values.
- postSubmit a batch for the client's approval/v1/migrations/{migration_id}/batches/{batch_id}/submitA draft becomes submitted.
- postApprove a batch (the client)/v1/migrations/{migration_id}/batches/{batch_id}/approveA submitted batch becomes approved, bound to its charger set and pacing: any later edit withdraws the approval.
- postStart an approved batch/v1/migrations/{migration_id}/batches/{batch_id}/startThe first wave's move requests (kind move, require idle) go to the charger proxy's runner at once; the proxy moves a charger only when it is idle and its own checks pass.
- postPause a running batch/v1/migrations/{migration_id}/batches/{batch_id}/pauseNo new wave starts.
- postResume a paused batch/v1/migrations/{migration_id}/batches/{batch_id}/resumeAfter a manual pause, the canary wave, too many failures, a rollback or a missing runner.
- postCancel a batch/v1/migrations/{migration_id}/batches/{batch_id}/cancelStops it for good: the chargers waiting and the moves no runner has received yet are skipped, a move a runner received finishes, and chargers already moved stay on Ivora (cancelling never rolls back; roll the batch back for that).
- getRead a migration's audit log/v1/migrations/{migration_id}/auditEvery entry of this migration and nothing else: who created it, added chargers, asked for rollbacks, the proxy's results, invited teams and runner credentials, with the actor's own team (actor team id).
- postCreate a runner credential for the migration's charger proxy/v1/migrations/{migration_id}/runnersThe credential the proxy's sync agent uses on this migration's runner routes (GET .../routes, POST .../routes/reports, POST .../runners/heartbeat), with the single scope migration:routes.
- deleteRevoke a runner credential/v1/migrations/{migration_id}/runners/{runner_id}Takes effect at once.
- getList a migration's team keys/v1/migrations/{migration_id}/keysNewest first, never the secrets.
- postCreate a team migration key/v1/migrations/{migration_id}/keysAn API key of your participant team on this migration, for the Ivora CLI or a partner's integration, with the environment's usual key prefix.
- deleteRevoke a team migration key/v1/migrations/{migration_id}/keys/{key_id}Takes effect at once.
- getPull the desired routes (runner, long poll)/v1/migrations/{migration_id}/routesThe open route requests newer than after revision, oldest first, as soon as there is one, waiting at most wait seconds (25 at most).
- postReport route outcomes and current routes (runner)/v1/migrations/{migration_id}/routes/reportsBatched: each charger's current route and connections, with the outcome of a request (request id) or none (its state, or a change made on the proxy itself).
- postRunner heartbeat/v1/migrations/{migration_id}/runners/heartbeatEvery 15 seconds: proxy nodes, upstreams, routed and connected counts.
- getList migration invites to you/v1/me/migration-invitesOpen invites to your confirmed email, and to the teams you own or administer, oldest first.
- postJoin a migration with your team/v1/me/migration-invites/{participant_id}/acceptAn invite to a team is accepted for that team by one of its owners or admins.
- postDecline a migration invite/v1/me/migration-invites/{participant_id}/declineAn invite to a team is declined by one of its owners or admins, an invite to your email by you, and recorded in the migration's audit log.
- putRecord the previous platform's baseline of chargers/v1/migrations/{migration_id}/parity/baselineWhat the previous platform has for each charger, from its export: configuration keys and values, the tariff (currency and prices in minor units) and the sessions it recorded in a window (count and energy in Wh).
- getList a migration's parity reports/v1/migrations/{migration_id}/parity/reportsNewest first, with each report's scope, window, tolerances and counts (chargers null: read one report for them).
- postRun a parity report: compare chargers with the previous platform/v1/migrations/{migration_id}/parity/reportsFor each charger in scope (station ids, location ids or all: true; 500 at most), compares its baseline with Ivora's records: configuration (the keys of the baseline against the configuration Ivora recorded; keys that decide where the charger connects and secrets are skipped; on OCPP 2.x the Actual attribute only, and a label with different values on several EVSEs is skipped as ambiguous), tariff (the price of each connector, as Ivora would bill it; a complex tariff, with elements, rules or a time zone, is not checked: complex tariff) and sessions (count and energy of the sessions that started in the baseline's window, within tolerances; without baseline sessions, an OCPP 1.6 charger in shadow mode is compared with the sessions the charger proxy recorded from the control link, in since..until).
- getRead a parity report, or download its summary/v1/migrations/{migration_id}/parity/reports/{report_id}Each charger's result with its sections: the differences found, what was skipped and why a section was not checked.



