Open a migration workspace on the project
Creates 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). Needs stations:admin (the team's owners and admins, Ivora staff). Synchronous; a retry with the same Idempotency-Key returns the same migration. Audited in the same transaction: when the entry cannot be stored, nothing is created (503). Errors: 403 self_serve_review_required, 409 migration_team_required, 503 migration_audit_unavailable. See Errors and statuses.
Path parameters
- tenant_idintegerRequired
Headers
- idempotency-keystringRequired
Request body
- namestringRequiredA label, such as "EV Connect to Ivora".1–120 characters
- source_platformenumThe platform the chargers move from.One of
evconnect,other· Default"other" - settingsSettingsInput
Child attributes
- rollback_window_daysintegerDays after a charger moved during which it can still be rolled back to the previous platform, which keeps the charger registered meanwhile.Default
7· Minimum 1 · Maximum 90 - drain_per_secondintegerSocket closes per second when a rollback covers more than 50 chargers, so the previous platform is spared a reconnect storm. 50 chargers or fewer are never paced.Default
5· Minimum 1 · Maximum 1000 - rollback_slabooleanAn Ivora rollback commitment is in force (rollback by Ivora within 4 business hours). false: no formal commitment. Either way Ivora support stays on the migration and Ivora administrators keep read access and emergency rollback.Default
true
- heartbeat_interval_sinteger | nullThe incumbent's observed Heartbeat interval in seconds (300 for a network moved from a platform whose chargers heartbeat every 300 s); the project's heartbeat interval defaults to it when staff set none. Omitted: 300 for evconnect, else the project keeps its own (60 s unless set). Ivora staff only (403 forbidden for anyone else).Minimum 30 · Maximum 900
Returns · 201
- idstringRequiredmig_...
- tenant_idintegerRequiredThe client's project.
- project_namestring | nullRequiredThe project's name; null when the charging core cannot be read.
- team_idstring | nullRequiredThe client: the team whose project the migration belongs to.
- team_namestring | nullRequiredThe client team's name.
- namestringRequired
- source_platformstringRequired
- statusenumRequiredactive; paused (imports and new work stop, rollbacks still go through); completed (a read-only record of the move); archived (closed for good, still readable).One of
active,paused,completed,archived - settingsSettingsRequired
Child attributes
- rollback_window_daysintegerRequired
- drain_per_secondintegerRequired
- rollback_slabooleanRequiredAn Ivora rollback commitment is in force (rollback by Ivora within 4 business hours). Ivora support stays on the migration either way.
- completed_atstring | nullRequiredWhen the migration was completed; null while it is active or paused.
- roleenum | nullRequiredThe caller's effective role: client (the project team's owners and admins), support (Ivora staff), partner (an invited partner team's owners, admins, developers and operators), observer (read only: the other members of those teams except billing, invited observer teams, Ivora platform support).One of
client,support,partner,observer - scopeobject | nullRequiredThe caller's narrowing to some sites, or null for every site.
Child attributes
- location_idsarray of integerRequiredThe sites the team sees and acts on: the migration's chargers at these locations only.
- permissionsarray of enumRequiredWhat the caller may do here.
- participantsarray of Participant | nullRequiredActive and invited participants; null in a list's summary view.
Child attributes
- idstringRequiredmpt_...
- kindenumRequiredclient: the project's own team. support: Ivora support (team_id null). partner: an invited migration partner or installer. observer: an invited team that only reads.One of
client,support,partner,observer - team_idstring | nullRequiredThe team; null for Ivora support and for an email invite nobody accepted yet.
- team_namestring | nullRequired
- statusenumRequiredremoved only in the answer that removed, revoked or declined it.One of
invited,active,removed - invite_emailstring | nullRequiredThe address an email invite went to; shown to the client only, null otherwise.
- scopeobject | nullRequiredNarrowing to some sites; null for every site of the migration.
Child attributes
- location_idsarray of integerRequiredThe sites the team sees and acts on: the migration's chargers at these locations only.
- removablebooleanRequiredtrue for an invited team (partner or observer); false for the client and Ivora support, which always stay.
- invited_byenum | nullRequiredWho invited a partner or observer: the client, or Ivora support on the client's behalf. null for the client and Ivora support.One of
client,support - invited_atstringRequired
- expires_atstring | nullRequiredAn invite not accepted by then lapses (14 days).
- accepted_atstring | nullRequired
- countsobjectRequiredChargers per state, and total (of the caller's sites when narrowed).
- runnersarray of Runner | nullRequiredRunner credentials, revoked ones included. Empty for observers; null in a list's summary view.
Child attributes
- idstringRequired
- labelstringRequiredThe charger proxy's name, also on its route reports.
- prefixstringRequiredThe credential's first characters, to recognise it; never the secret.
- scopesarray of stringRequired
- created_bystringRequired
- created_atstringRequired
- last_seen_atstring | nullRequiredIts last heartbeat, route poll or report.
- healthybooleanRequiredSeen within the last 60 seconds and not revoked.
- last_revisioninteger | nullRequiredThe last route revision it pulled.
- heartbeatobject | nullRequiredIts last heartbeat body: nodes, upstreams, routed and connected counts.
- revoked_atstring | nullRequired
- runner_healthybooleanRequiredA runner was seen within the last 60 seconds.
- route_revisionintegerRequiredThe last route revision handed to the runners.
- created_bystringRequired
- created_atstringRequired
- updated_atstringRequired
curl --fail-with-body -X POST "https://api.ivoracharge.com/v1/tenants/1042/migrations" \
-H "Authorization: Bearer $IVORA_API_KEY" \
-H "Idempotency-Key: order-2026-09-30-0001" \
-H "Content-Type: application/json" \
-d '{
"name": "bay-01"
}'{
"id": "id_0123456789abcdef",
"tenant_id": 1042,
"project_name": "string",
"team_id": "team_0123456789abcdef",
"team_name": "string",
"name": "bay-01",
"source_platform": "string",
"status": "active",
"settings": {
"rollback_window_days": 1,
"drain_per_second": 1,
"rollback_sla": false
},
"completed_at": "2026-09-30T17:00:00Z",
"role": "client",
"scope": {
"location_ids": [
7
]
},
"permissions": [
"migration:read"
],
"participants": [
{
"id": "id_0123456789abcdef",
"kind": "client",
"team_id": "team_0123456789abcdef",
"team_name": "string",
"status": "invited",
"invite_email": "string",
"scope": {
"location_ids": [
7
]
},
"removable": false,
"invited_by": "client",
"invited_at": "2026-09-30T17:00:00Z",
"expires_at": "2026-09-30T17:00:00Z",
"accepted_at": "2026-09-30T17:00:00Z"
}
],
"counts": {},
"runners": [
{
"id": "id_0123456789abcdef",
"label": "string",
"prefix": "string",
"scopes": [
"migration:routes"
],
"created_by": "string",
"created_at": "2026-09-30T17:00:00Z",
"last_seen_at": "2026-09-30T17:00:00Z",
"healthy": false,
"last_revision": 1,
"heartbeat": {},
"revoked_at": "2026-09-30T17:00:00Z"
}
],
"runner_healthy": false,
"route_revision": 1,
"created_by": "string",
"created_at": "2026-09-30T17:00:00Z",
"updated_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.



