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

# How VPP works

> What VPP adds to a tariff integration, what a VPP operator sees, and what reaches your backend.

VPP builds on your tariff integration: the same users, locations, devices and connected tariffs. A VPP operator runs programs and dispatches enrolled devices through the Fleet API, but you integrate the Energy API only: every instruction reaches you the same way, whichever VPP operator sent it.

```mermaid actions={false} theme={"system"}
flowchart LR
    OEM["Your backend"]
    subgraph FP["Flatpeak"]
        direction LR
        E["Energy API"] --- F["Fleet API"]
    end
    OA["VPP operator A"]
    OB["VPP operator B"]
    OEM --- E
    F --- OA
    F --- OB
```

## What VPP adds

| Part | What it is |
| :- | :- |
| [Capabilities](/docs/energy-api/guides/vpp/quickstart.md) | The device's `hardware.hardware_id` and a `capabilities` block per subsystem |
| [Enrollment](/docs/energy-api/guides/vpp/enrollment.md) | The user joins a program in Connect. The enrollment attaches to one device and records consent |
| [Telemetry](/docs/energy-api/guides/vpp/telemetry.md) | Device state and meter records, at the interval the program sets |
| [Settings](/docs/energy-api/guides/vpp/device-settings.md) | One settings record per device, shared with the VPP operator |
| [Dispatch](/docs/energy-api/guides/vpp/dispatch.md) | Instructions to fetch, apply and confirm |
| [Rewards](/docs/energy-api/guides/vpp/dispatch.md#delivery-record) | Paid per kWh delivered or per event. The VPP operator pays and Flatpeak keeps the ledger |

A device needs a connected tariff at its location to enroll, and the enrollment waits at step `AWAITING_TARIFF` until one exists.

## Capabilities

Capabilities set eligibility, dispatch limits, supported settings and the state blocks a device reports.

* When hardware changes, [update the device](/docs/energy-api/reference/devices/update.md) with the full `capabilities` object. Flatpeak recomputes all four and `device.update` fires.
* `device_type` cannot change while the device is enrolled; the update returns `422`.
* Capability blocks name parts (`battery`, `evse`), while `device_type` names products (`BATTERY_STORAGE`). An electric vehicle has a `battery` block and is not a `BATTERY_STORAGE`.

## What the VPP operator sees

A VPP operator sees nothing until a user consents, and then only that device, under that program.

| Sees | Never sees |
| :- | :- |
| The device's power limits, capacity and availability | Your fleet size or composition |
| Its state, meter records and confirmations, from the consent date | Devices outside its programs |
| Its location, only with the `LOCATION` scope | Other VPP operators' programs or allocations |
| Delivery against its own commitments | Your tariffs or pricing |

Consent is per scope: `TELEMETRY`, `CONTROL`, `LOCATION`, `SETTINGS`. The user can withdraw it in your app or the VPP operator's app, which suspends the enrollment.

## What reaches your backend

| When | You receive | You do |
| :- | :- | :- |
| A VPP operator publishes a program, and you approve the listing | Nothing. Connect offers it to eligible devices | Show Connect, or [list VPP programs](/docs/energy-api/reference/vpp-programs/list.md) in your own UI |
| A user enrolls | `vpp_enrollment.update`, and telemetry duties on the device | Start the feeds |
| The VPP operator creates a VPP event | `vpp_event.update`, once per event | At `LOCKED`, apply each device's share and confirm |
| The VPP operator sends a plan, under a managed tariff | `device.instructions.update` | Fetch, apply and confirm |
| The VPP operator pays a reward | A reward entry on the device | Show it in Connect or your app |

Flatpeak bounds every instruction to the device's capabilities, the user's settings and consent before it reaches you. See [Guardrails](/docs/energy-api/guides/vpp/dispatch.md#guardrails).

## Grid standards

Each standard belongs to one hop between the grid and the device. You own the last two.

| Hop | Standard | Owner |
| :- | :- | :- |
| Utility or market to aggregator | IEEE 2030.5 / CSIP, market interfaces | The VPP operator, or Flatpeak as aggregator of record |
| VPP operator to Flatpeak | Fleet API | Flatpeak |
| Flatpeak to your cloud | Energy API | Flatpeak |
| Your cloud to device | Your connection: SunSpec Modbus or proprietary | You |
| Device electrical behavior | IEEE 1547-2018, UL 1741 | You |

You do not implement IEEE 2030.5. Ride-through, anti-islanding and other protection stay in your firmware, and Flatpeak never overrides them. When protection cuts a committed window, deliver what is safe; meter records show the deviation.


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