Read a parity report, or download its summary
get/v1/migrations/{migration_id}/parity/reports/{report_id}
Requires an API key
Each charger's result with its sections: the differences found, what was skipped and why a section was not checked. format=csv downloads a summary, one row per charger. Any participant. A participant narrowed to some sites covers and reads the chargers at its sites only. Its counts and scope cover them, and a report with none of them is not found for it. Errors: 404 migration_not_found, 404 migration_parity_report_not_found. See Errors and statuses.
Path parameters
- report_idstringRequiredPattern
^mpr_[0-9a-f]{32}$ - migration_idstringRequiredPattern
^mig_[0-9a-f]{32}$
Query parameters
- formatstringDefault
"json"· Pattern^(json|csv)$
Returns · 200
- 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
Child attributes
- keystringRequired
- kindenumRequireddifferent: both have it with other values; missing: Ivora has not recorded it.One of
different,missing - previousstringRequired
- ivorastring | nullRequired
- 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.
Child attributes
- connector_idintegerRequired
- tariff_idinteger | nullRequired
- sourceenumRequiredWhere Ivora's tariff comes from: the connector's own, its location's default, the project's default, or none.One of
connector,location,project,none - currencystring | nullRequired
- rate_minor_per_kwhinteger | number | nullRequiredMinor units; a decimal number for a sub-cent price.
- rate_minor_per_minuteinteger | number | nullRequired
- session_fee_minorinteger | number | nullRequired
- differencesarray of TariffDifferenceRequired
Child attributes
- connector_idintegerRequired
- fieldenumRequiredtariff: Ivora prices the connector with no tariff (or one it cannot read).One of
tariff,currency,rate_minor_per_kwh,rate_minor_per_minute,session_fee_minor - previousstring | integer | number | nullRequired
- ivorastring | integer | number | nullRequired
- 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
Child attributes
- countintegerRequired
- energy_whintegerRequired
- ivoraobject | nullRequiredIvora's sessions on the charger that started in the window (in shadow mode, its copy).
Child attributes
- countintegerRequired
- energy_whintegerRequired
- differencesarray of SessionDifferenceRequired
Child attributes
- fieldenumRequiredOne of
count,energy_wh - previousintegerRequired
- ivoraintegerRequired
- toleranceintegerRequired
- checked_atstringRequired
GET /v1/migrations/{migration_id}/parity/reports/{report_id}
curl --fail-with-body "https://api.ivoracharge.com/v1/migrations/mig_0123456789abcdef0123456789abcdef/parity/reports/mpr_0123456789abcdef0123456789abcdef" \
-H "Authorization: Bearer $IVORA_API_KEY"Response · 200JSON
{
"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": {
"status": "passed",
"reason": "string",
"compared": 1,
"skipped": [
null
],
"ambiguous": [
null
],
"differences": [
null
]
},
"tariff": {
"status": "passed",
"reason": "string",
"previous": {},
"connectors": [
null
],
"differences": [
null
]
},
"sessions": {
"status": "passed",
"reason": "string",
"source": "baseline",
"since": "string",
"until": "string",
"previous": {
"count": null,
"energy_wh": null
},
"ivora": {
"count": null,
"energy_wh": null
},
"differences": [
null
]
}
},
"checked_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.



