curl --request GET \
--url https://fleet-api.flatpeak.com/vpp-programs/{program_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://fleet-api.flatpeak.com/vpp-programs/{program_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://fleet-api.flatpeak.com/vpp-programs/{program_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://fleet-api.flatpeak.com/vpp-programs/{program_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://fleet-api.flatpeak.com/vpp-programs/{program_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://fleet-api.flatpeak.com/vpp-programs/{program_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://fleet-api.flatpeak.com/vpp-programs/{program_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "vpr_5c8d1f2a7b3e4d6c9a0f1b2c",
"object": "vpp_program",
"live_mode": true,
"display_name": "Community Powershare",
"description": "Earn from grid events while you keep your tariff.",
"url": "https://pick.com/programs/community-powershare",
"managed": false,
"listed": true,
"currency_code": "USD",
"estimate": {
"amount": 612,
"period": "YEAR",
"dispatch_events_per_month": 15
},
"terms": {
"rewards": [
{
"basis": "FIXED",
"rate": 15,
"period": "QUARTER"
},
{
"basis": "DELIVERED_KWH",
"rate": 0.35
}
],
"opt_out_policy": "ALLOWED",
"notice_days": 30
},
"eligibility": {
"oem_ids": [
"oem_6a3a8dada72cd0a249ff9528"
],
"device_types": [
"BATTERY_STORAGE"
],
"zone_id": null,
"min_storage_capacity_kwh": 5,
"min_export_power_kw": 3,
"telemetry_requirements": {
"state_interval_seconds": 300,
"device_meter_interval_seconds": 900
}
},
"enrollment": {
"join_days": 10,
"approval_required": false,
"dispatch_test_required": true,
"signup_url": null
},
"status": "LIVE",
"rejection_reason": null,
"time_created": "2026-08-12T09:30:00Z",
"account_id": "acc_6a5e504c3b98d0d6739b5f72"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}Retrieve a VPP program
Retrieves a program, including its live enrollment count.
curl --request GET \
--url https://fleet-api.flatpeak.com/vpp-programs/{program_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://fleet-api.flatpeak.com/vpp-programs/{program_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://fleet-api.flatpeak.com/vpp-programs/{program_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://fleet-api.flatpeak.com/vpp-programs/{program_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://fleet-api.flatpeak.com/vpp-programs/{program_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://fleet-api.flatpeak.com/vpp-programs/{program_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://fleet-api.flatpeak.com/vpp-programs/{program_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "vpr_5c8d1f2a7b3e4d6c9a0f1b2c",
"object": "vpp_program",
"live_mode": true,
"display_name": "Community Powershare",
"description": "Earn from grid events while you keep your tariff.",
"url": "https://pick.com/programs/community-powershare",
"managed": false,
"listed": true,
"currency_code": "USD",
"estimate": {
"amount": 612,
"period": "YEAR",
"dispatch_events_per_month": 15
},
"terms": {
"rewards": [
{
"basis": "FIXED",
"rate": 15,
"period": "QUARTER"
},
{
"basis": "DELIVERED_KWH",
"rate": 0.35
}
],
"opt_out_policy": "ALLOWED",
"notice_days": 30
},
"eligibility": {
"oem_ids": [
"oem_6a3a8dada72cd0a249ff9528"
],
"device_types": [
"BATTERY_STORAGE"
],
"zone_id": null,
"min_storage_capacity_kwh": 5,
"min_export_power_kw": 3,
"telemetry_requirements": {
"state_interval_seconds": 300,
"device_meter_interval_seconds": 900
}
},
"enrollment": {
"join_days": 10,
"approval_required": false,
"dispatch_test_required": true,
"signup_url": null
},
"status": "LIVE",
"rejection_reason": null,
"time_created": "2026-08-12T09:30:00Z",
"account_id": "acc_6a5e504c3b98d0d6739b5f72"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}{
"object": "error",
"type": "invalid_request",
"code": "access_denied",
"message": "The requested resource could not be found.",
"context": "api.price_get",
"live_mode": true,
"time_created": "2026-01-01T00:00:00Z"
}Authorizations
Authenticate with the bearer_token obtained from the authentication endpoint.
Response
Program response.
A program you define: a VPP program, or a managed tariff when managed is true. Customers enroll in your app, or in their OEM's app once the program is listed and the OEM approves it. Enrolled devices arrive through Connect and fire device.connect.
true for a managed tariff: you run the device under this program with plans, and it replaces the customer's tariff. Plans are accepted only for devices enrolled in a managed program. Any number of programs can be managed.
false
Only LIVE programs are shown to customers. Approval applies to listed programs; an unlisted program goes LIVE on request. Changes fire program.update.
| Value | Meaning |
|---|---|
DRAFT | Private |
PENDING_APPROVAL | LIVE requested, under review by the OEMs in eligibility |
LIVE | Published |
REJECTED | An OEM declined; see rejection_reason |
PAUSED | No new enrollments |
DRAFT, PENDING_APPROVAL, LIVE, PAUSED, REJECTED "LIVE"
Was this page helpful?

