Log inTalk to us

Open a migration workspace on the project

post/v1/tenants/{tenant_id}/migrations
Requires an API key

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

  • namestringRequired
    A label, such as "EV Connect to Ivora".
    1–120 characters
  • source_platformenum
    The platform the chargers move from.
    One of evconnect, other · Default "other"
  • settingsSettingsInput
    Child attributes
    • rollback_window_daysinteger
      Days 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_secondinteger
      Socket 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_slaboolean
      An 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 | null
    The 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

  • idstringRequired
    mig_...
  • tenant_idintegerRequired
    The client's project.
  • project_namestring | nullRequired
    The project's name; null when the charging core cannot be read.
  • team_idstring | nullRequired
    The client: the team whose project the migration belongs to.
  • team_namestring | nullRequired
    The client team's name.
  • namestringRequired
  • source_platformstringRequired
  • statusenumRequired
    active; 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_slabooleanRequired
      An Ivora rollback commitment is in force (rollback by Ivora within 4 business hours). Ivora support stays on the migration either way.
  • completed_atstring | nullRequired
    When the migration was completed; null while it is active or paused.
  • roleenum | nullRequired
    The 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 | nullRequired
    The caller's narrowing to some sites, or null for every site.
    Child attributes
    • location_idsarray of integerRequired
      The sites the team sees and acts on: the migration's chargers at these locations only.
  • permissionsarray of enumRequired
    What the caller may do here.
  • participantsarray of Participant | nullRequired
    Active and invited participants; null in a list's summary view.
    Child attributes
    • idstringRequired
      mpt_...
    • kindenumRequired
      client: 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 | nullRequired
      The team; null for Ivora support and for an email invite nobody accepted yet.
    • team_namestring | nullRequired
    • statusenumRequired
      removed only in the answer that removed, revoked or declined it.
      One of invited, active, removed
    • invite_emailstring | nullRequired
      The address an email invite went to; shown to the client only, null otherwise.
    • scopeobject | nullRequired
      Narrowing to some sites; null for every site of the migration.
      Child attributes
      • location_idsarray of integerRequired
        The sites the team sees and acts on: the migration's chargers at these locations only.
    • removablebooleanRequired
      true for an invited team (partner or observer); false for the client and Ivora support, which always stay.
    • invited_byenum | nullRequired
      Who 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 | nullRequired
      An invite not accepted by then lapses (14 days).
    • accepted_atstring | nullRequired
  • countsobjectRequired
    Chargers per state, and total (of the caller's sites when narrowed).
  • runnersarray of Runner | nullRequired
    Runner credentials, revoked ones included. Empty for observers; null in a list's summary view.
    Child attributes
    • idstringRequired
    • labelstringRequired
      The charger proxy's name, also on its route reports.
    • prefixstringRequired
      The credential's first characters, to recognise it; never the secret.
    • scopesarray of stringRequired
    • created_bystringRequired
    • created_atstringRequired
    • last_seen_atstring | nullRequired
      Its last heartbeat, route poll or report.
    • healthybooleanRequired
      Seen within the last 60 seconds and not revoked.
    • last_revisioninteger | nullRequired
      The last route revision it pulled.
    • heartbeatobject | nullRequired
      Its last heartbeat body: nodes, upstreams, routed and connected counts.
    • revoked_atstring | nullRequired
  • runner_healthybooleanRequired
    A runner was seen within the last 60 seconds.
  • route_revisionintegerRequired
    The last route revision handed to the runners.
  • created_bystringRequired
  • created_atstringRequired
  • updated_atstringRequired
POST /v1/tenants/{tenant_id}/migrations
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"
}'
Response · 201JSON
{
  "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"
}
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.