List a migration's parity reports
get/v1/migrations/{migration_id}/parity/reports
Requires an API key
Newest first, with each report's scope, window, tolerances and counts (chargers null: read one report for them). Any participant. A participant narrowed to some sites covers and reads the chargers at its sites only. Its list leaves out the reports with none of its chargers, and its counts and scope cover them. An unknown cursor is refused (422 invalid_request). Errors: 404 migration_not_found. See Errors and statuses.
Path parameters
- migration_idstringRequiredPattern
^mig_[0-9a-f]{32}$
Query parameters
- cursorstring | nullnext_cursor of the previous page.Pattern
^mpr_[0-9a-f]{32}$ - limitintegerDefault
50· Minimum 1 · Maximum 100
Returns · 200
- dataarray of MigrationParityReportRequired
Child attributes
- idstringRequiredmpr_...
- migration_idstringRequired
- scopeParityScopeRequired
Child attributes
- station_idsarray of integer | null
- location_idsarray of integer | null
- allboolean | null
- sincestringRequiredThe session window for chargers compared with the shadow-mode ledger.
- untilstringRequired
- tolerancesobjectRequired
- ignore_keysarray of stringRequired
- requirearray of enumRequired
- countsobjectRequiredChargers passed, failed, incomplete, and total (of the caller's sites when narrowed).
- created_bystringRequired
- created_atstringRequired
- chargersarray of ParityResult | nullRequiredEach charger's result, ordered by charger_key; null in the list.
Child attributes
- station_idintegerRequired
- charger_keystringRequired
- location_idinteger | nullRequired
- statusenumRequiredpassed: every required section passed and none failed; failed: a section differs beyond its tolerance; incomplete: a required section could not be checked.One of
passed,failed,incomplete - sectionsParitySectionsRequired
Child attributes
- configurationConfigurationParityRequired
Child attributes
- statusenumRequiredOne of
passed,failed,not_checked - reasonstring | nullRequiredWhy it was not checked: no_baseline, not_recorded (Ivora has not read the charger's configuration yet), nothing_compared, too_many_items (Ivora recorded more than 2,000 items for the charger), protocol_unsupported.
- comparedintegerRequiredKeys compared.
- skippedarray of stringRequiredKeys not compared: ignored, secret, deciding where the charger connects (its URL and identity differ on purpose), or ambiguous.
- ambiguousarray of stringOCPP 2.x labels skipped because Ivora recorded them with different values on more than one EVSE or attribute. Only the Actual attribute is compared.
- differencesarray of ConfigurationDifferenceRequired
- tariffTariffParityRequired
Child attributes
- statusenumRequiredOne of
passed,failed,not_checked - reasonstring | nullRequiredWhy it was not checked: no_baseline, no_connectors, complex_tariff (Ivora bills a connector by a tariff with elements, rules or a time zone, so its base prices are not what it charges; a missing tariff or another currency still fails).
- previousobject | nullRequiredThe baseline's tariff.
- connectorsarray of TariffConnectorRequiredIvora's price on each connector.
- differencesarray of TariffDifferenceRequired
- sessionsSessionsParityRequired
Child attributes
- statusenumRequiredOne of
passed,failed,not_checked - reasonstring | nullRequiredWhy it was not checked: no_baseline (no sessions in the baseline and no shadow-mode ledger entries in the window), too_many_sessions.
- sourceenum | nullRequiredbaseline: the totals recorded from the previous platform; shadow_ledger: the sessions the charger proxy recorded from the control link in shadow mode (OCPP 1.6).One of
baseline,shadow_ledger - sincestring | nullRequired
- untilstring | nullRequired
- previousobject | nullRequired
- ivoraobject | nullRequiredIvora's sessions on the charger that started in the window (in shadow mode, its copy).
- differencesarray of SessionDifferenceRequired
- checked_atstringRequired
- next_cursorstring | nullRequiredPass as cursor for the next page; null on the last one.
GET /v1/migrations/{migration_id}/parity/reports
curl --fail-with-body "https://api.ivoracharge.com/v1/migrations/mig_0123456789abcdef0123456789abcdef/parity/reports" \
-H "Authorization: Bearer $IVORA_API_KEY"Response · 200JSON
{
"data": [
{
"id": "id_0123456789abcdef",
"migration_id": "migration_0123456789abcdef",
"scope": {
"station_ids": [
1
],
"location_ids": [
7
],
"all": false
},
"since": "string",
"until": "string",
"tolerances": {},
"ignore_keys": [
"string"
],
"require": [
"configuration"
],
"counts": {},
"created_by": "string",
"created_at": "2026-09-30T17:00:00Z",
"chargers": [
{
"station_id": 1,
"charger_key": "string",
"location_id": 7,
"status": "passed",
"sections": {
"configuration": null,
"tariff": null,
"sessions": null
},
"checked_at": "2026-09-30T17:00:00Z"
}
]
}
],
"next_cursor": "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.



