> ## Documentation Index
> Fetch the complete documentation index at: /docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Exports

> Create an export, download the file, and read the columns of each export type.

An export packages records into a CSV or JSON file for a market operator, settlement counterparty or compliance reviewer. Use one when the numbers leave the platform.

| `type` | One row per |
| :- | :- |
| `SETTLEMENT_EVIDENCE` | Commitment |
| `CONSENT_RECORDS` | Consent record |

## Create and download

1. [Create an export](/docs/fleet-api/reference/exports/create.md) with a `type`, a `format`, a window of up to 90 days, and exactly one scope: `program_id` or `group_id`. Both or neither returns `422` `export_scope_invalid`.
2. Wait for `export.complete`, which carries the `export_id`, so you do not need to poll.
3. [Retrieve an export](/docs/fleet-api/reference/exports/retrieve.md). When `status` is `COMPLETE`, download the file from `download_url` and store it.

```json Request body theme={"system"}
{
  "type": "SETTLEMENT_EVIDENCE",
  "program_id": "vpr_5c8d1f2a7b3e4d6c9a0f1b2c",
  "start_time": "2026-08-01T00:00:00Z",
  "end_time": "2026-09-01T00:00:00Z",
  "format": "JSON"
}
```

| `status` | Meaning |
| :- | :- |
| `PROCESSING` | The file is being built |
| `COMPLETE` | The file is ready at `download_url`, until `time_expiry` |
| `EXPIRED` | The file was deleted. Create the export again |
| `FAILED` | The file could not be built. Read `failure_reason` and create the export again |

The link and the file last 24 hours from the moment the export completes.

## Scope and window

| Scope | Settlement evidence | Consent records |
| :- | :- | :- |
| `program_id` | Commitments of the devices enrolled in the program, including devices that have since left | Consent records of the same devices |
| `group_id` | Commitments from VPP events created for the group | Consent records of the devices in the group when the export is created |

A commitment is included when its interval starts inside the window, and a consent record when its `time_occurred` falls inside it.

## File format

CSV and JSON carry the same columns in the same order. In CSV:

* Lists are joined with `;`, and consent scopes with `|`.
* `null` is an empty cell.
* Meter records are left out; they are in JSON only.

## Settlement evidence

| Columns | Meaning |
| :- | :- |
| `device_id`, `oem_id`, `program_id` | The device, the OEM that connects it, and the program its enrollment is in |
| `vpp_event_id`, `plan_id`, `reference_id` | What carried the commitment: a VPP event or a plan, so one of the two IDs is set. `reference_id` is your reference on that event or plan |
| `start_time`, `end_time`, `committed_power_kw`, `committed_energy_kwh` | The commitment and its window |
| `confirmation_id`, `confirmed_power_kw`, `time_confirmed` | What the OEM confirmed. It shows intent and is not evidence of delivery |
| `status`, `fulfillment`, `delivered_energy_kwh`, `coverage` | What the meter records show. `status` is `FULL`, `PARTIAL`, `ZERO`, `UNREPORTED` or `OPTED_OUT`. `delivered_energy_kwh` is the energy you settle on: see [delivered energy](/docs/fleet-api/guides/settle/settlement.md#delivered-energy) |
| `meter_records` | JSON only. The device meter records covering the window, so you can recompute the figure |

```json JSON row theme={"system"}
[
  {
    "device_id": "dev_1b2c3d4e5f6a7b8c9d0e1f2a",
    "oem_id": "oem_6a3a8dada72cd0a249ff9528",
    "program_id": "vpr_5c8d1f2a7b3e4d6c9a0f1b2c",
    "vpp_event_id": "vpe_7d2a4c6e9b1f3a5c8e0d2f4b",
    "plan_id": null,
    "reference_id": "NG-DFS-2026-08-09-EV04",
    "start_time": "2026-08-09T17:00:00Z",
    "end_time": "2026-08-09T19:00:00Z",
    "committed_power_kw": -3.0,
    "committed_energy_kwh": -6.0,
    "confirmation_id": "icf_9c1d2e3f4a5b6c7d8e9f0a1b",
    "confirmed_power_kw": -1.2,
    "time_confirmed": "2026-08-09T16:48:20Z",
    "status": "PARTIAL",
    "fulfillment": 0.62,
    "delivered_energy_kwh": -3.7,
    "coverage": 1,
    "meter_records": [
      { "start_time": "2026-08-09T17:00:00Z", "end_time": "2026-08-09T18:00:00Z", "energy_kwh": -1.9 },
      { "start_time": "2026-08-09T18:00:00Z", "end_time": "2026-08-09T19:00:00Z", "energy_kwh": -1.8 }
    ]
  }
]
```

```csv CSV row theme={"system"}
device_id,oem_id,program_id,vpp_event_id,plan_id,reference_id,start_time,end_time,committed_power_kw,committed_energy_kwh,confirmation_id,confirmed_power_kw,time_confirmed,status,fulfillment,delivered_energy_kwh,coverage
dev_1b2c3d4e5f6a7b8c9d0e1f2a,oem_6a3a8dada72cd0a249ff9528,vpr_5c8d1f2a7b3e4d6c9a0f1b2c,vpe_7d2a4c6e9b1f3a5c8e0d2f4b,,NG-DFS-2026-08-09-EV04,2026-08-09T17:00:00Z,2026-08-09T19:00:00Z,-3.0,-6.0,icf_9c1d2e3f4a5b6c7d8e9f0a1b,-1.2,2026-08-09T16:48:20Z,PARTIAL,0.62,-3.7,1
```

This row is an under-delivery: 3 kW committed, 1.2 kW confirmed, and `fulfillment` `0.62` from the device's meter records, which show 3.7 kWh delivered of the 6 kWh committed.

## Consent records

Columns: `consent_id`, `device_id`, `oem_id`, `scopes`, `action` (`GRANTED` or `REVOKED`), `time_occurred`. One Connect session can grant several scopes, so `scopes` is a list. `consent_id` is the `id` of the record in [consent history](/docs/fleet-api/reference/devices/consent-history.md), and the OEM sees the same ID.

```csv CSV rows theme={"system"}
consent_id,device_id,oem_id,scopes,action,time_occurred
cns_3f8a1c5e7d2b9a4c6e0f1b28,dev_63a6087272941ef077a8fd3e,oem_6a3a8dada72cd0a249ff9528,TELEMETRY|CONTROL|LOCATION,GRANTED,2026-06-01T10:04:11Z
cns_7b2e9d4a1c6f8e3b5a0d2c91,dev_63a6087272941ef077a8fd3e,oem_6a3a8dada72cd0a249ff9528,CONTROL,REVOKED,2026-08-02T19:22:40Z
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.