Log inTalk to us

Record a site flip of the project's migration

post/v1/tenants/{tenant_id}/migration/site-flips
Requires an API key

The project's charger proxy key (migration:proxy, made by Ivora administrators, bound to this project) or Ivora platform administrators; team roles and other keys are refused (tenants learn of flips through site.flipped, they do not declare them). The same flip as the staff route: the migration's charger proxy calls it after it moved a site's chargers. Emits site.flipped (direction to_ivora) or site.flip_rolled_back (to_previous_platform) to the project's webhooks with the location, its stations and their EVSEs, and records each moved station's route for QR sticker scans. It routes no charger. station_ids, when given, must all be at the location; otherwise every station there moved. Another project's location answers 404. Synchronous; replays with the same Idempotency-Key return the original result and emit nothing. Audit-logged (migration.site_flipped). Errors: 403 restricted_key_refused, 404 location_not_found, 409 station_in_shadow. See Errors and statuses.

Path parameters

  • tenant_idintegerRequired
    Greater than 0

Headers

  • idempotency-keystringRequired

Request body

  • location_idintegerRequired
    The location (site) whose chargers moved.
    Greater than 0
  • directionenumRequired
    to_ivora: the site's chargers now connect to Ivora (site.flipped). to_previous_platform: they went back to the previous platform (site.flip_rolled_back).
    One of to_ivora, to_previous_platform
  • station_idsarray of integer | null
    The stations that moved, all at this location. Omit for every station at the location.
  • flipped_atstring | null
    When the routing changed (ISO 8601 with offset); defaults to now.
    Up to 40 characters
  • flip_referencestring | null
    The migration tool's own identifier for this flip, repeated in the event.
    1–120 characters · Pattern ^[\x21-\x7e]+$
  • reasonstring | null
    Why, for the event and the audit trail.
    Up to 300 characters

Returns · 201

  • flip_idstringRequired
    Ivora's identifier of this flip; replays of the request return the same one.
  • event_idstringRequired
    The site.flipped or site.flip_rolled_back event recorded for it.
  • event_typeenumRequired
    One of site.flipped, site.flip_rolled_back
  • tenant_idintegerRequired
  • directionenumRequired
    One of to_ivora, to_previous_platform
  • previousenumRequired
    Where the chargers connected before.
    One of ivora, previous_platform
  • currentenumRequired
    Where they connect now.
    One of ivora, previous_platform
  • flipped_atstringRequired
  • locationSiteFlipLocationRequired
    Child attributes
    • idintegerRequired
    • namestringRequired
    • external_referencestring | nullRequired
  • stationsarray of SiteFlipStationRequired
    Child attributes
    • idintegerRequired
    • namestringRequired
    • charger_idstring | nullRequired
    • external_referencestring | nullRequired
    • evsesarray of SiteFlipEvseRequired
      Child attributes
      • evse_numberintegerRequired
      • evse_idstring | nullRequired
        The EVSE ID imported from the previous platform (eMI3, such as USABCE123*1), else null.
      • physical_referencestring | null
      • connector_idsarray of integerRequired
        Connector resource IDs on this EVSE; charging sessions take them.
  • all_stationsbooleanRequired
    true when every station at the location moved.
  • flip_referencestring | nullRequired
  • reasonstring | nullRequired
  • actorstringRequired
POST /v1/tenants/{tenant_id}/migration/site-flips
curl --fail-with-body -X POST "https://api.ivoracharge.com/v1/tenants/1042/migration/site-flips" \
  -H "Authorization: Bearer $IVORA_API_KEY" \
  -H "Idempotency-Key: order-2026-09-30-0001" \
  -H "Content-Type: application/json" \
  -d '{
  "location_id": 7,
  "direction": "to_ivora"
}'
Response · 201JSON
{
  "flip_id": "flip_0123456789abcdef",
  "event_id": "event_0123456789abcdef",
  "event_type": "site.flipped",
  "tenant_id": 1042,
  "direction": "to_ivora",
  "previous": "ivora",
  "current": "ivora",
  "flipped_at": "2026-09-30T17:00:00Z",
  "location": {
    "id": 1,
    "name": "bay-01",
    "external_reference": "property:1001"
  },
  "stations": [
    {
      "id": 1,
      "name": "bay-01",
      "charger_id": "charger_0123456789abcdef",
      "external_reference": "property:1001",
      "evses": [
        {
          "evse_number": 1,
          "evse_id": "evse_0123456789abcdef",
          "physical_reference": "string",
          "connector_ids": [
            null
          ]
        }
      ]
    }
  ],
  "all_stations": false,
  "flip_reference": "string",
  "reason": "string",
  "actor": "string"
}
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.