curl --request PATCH \
--url https://fleet-api.flatpeak.com/vpp-programs/{program_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"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,
"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": "<string>",
"min_storage_capacity_kwh": 5,
"min_export_power_kw": 3
},
"enrollment": {
"join_days": 10,
"approval_required": false,
"dispatch_test_required": true,
"signup_url": "https://phase.com/tariffs/flex/signup"
},
"status": "LIVE"
}
'import requests
url = "https://fleet-api.flatpeak.com/vpp-programs/{program_id}"
payload = {
"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,
"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": "<string>",
"min_storage_capacity_kwh": 5,
"min_export_power_kw": 3
},
"enrollment": {
"join_days": 10,
"approval_required": False,
"dispatch_test_required": True,
"signup_url": "https://phase.com/tariffs/flex/signup"
},
"status": "LIVE"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
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,
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: '<string>',
min_storage_capacity_kwh: 5,
min_export_power_kw: 3
},
enrollment: {
join_days: 10,
approval_required: false,
dispatch_test_required: true,
signup_url: 'https://phase.com/tariffs/flex/signup'
},
status: 'LIVE'
})
};
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 => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'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,
'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' => '<string>',
'min_storage_capacity_kwh' => 5,
'min_export_power_kw' => 3
],
'enrollment' => [
'join_days' => 10,
'approval_required' => false,
'dispatch_test_required' => true,
'signup_url' => 'https://phase.com/tariffs/flex/signup'
],
'status' => 'LIVE'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://fleet-api.flatpeak.com/vpp-programs/{program_id}"
payload := strings.NewReader("{\n \"display_name\": \"Community Powershare\",\n \"description\": \"Earn from grid events while you keep your tariff.\",\n \"url\": \"https://pick.com/programs/community-powershare\",\n \"managed\": false,\n \"listed\": true,\n \"terms\": {\n \"rewards\": [\n {\n \"basis\": \"FIXED\",\n \"rate\": 15,\n \"period\": \"QUARTER\"\n },\n {\n \"basis\": \"DELIVERED_KWH\",\n \"rate\": 0.35\n }\n ],\n \"opt_out_policy\": \"ALLOWED\",\n \"notice_days\": 30\n },\n \"eligibility\": {\n \"oem_ids\": [\n \"oem_6a3a8dada72cd0a249ff9528\"\n ],\n \"device_types\": [\n \"BATTERY_STORAGE\"\n ],\n \"zone_id\": \"<string>\",\n \"min_storage_capacity_kwh\": 5,\n \"min_export_power_kw\": 3\n },\n \"enrollment\": {\n \"join_days\": 10,\n \"approval_required\": false,\n \"dispatch_test_required\": true,\n \"signup_url\": \"https://phase.com/tariffs/flex/signup\"\n },\n \"status\": \"LIVE\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://fleet-api.flatpeak.com/vpp-programs/{program_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"display_name\": \"Community Powershare\",\n \"description\": \"Earn from grid events while you keep your tariff.\",\n \"url\": \"https://pick.com/programs/community-powershare\",\n \"managed\": false,\n \"listed\": true,\n \"terms\": {\n \"rewards\": [\n {\n \"basis\": \"FIXED\",\n \"rate\": 15,\n \"period\": \"QUARTER\"\n },\n {\n \"basis\": \"DELIVERED_KWH\",\n \"rate\": 0.35\n }\n ],\n \"opt_out_policy\": \"ALLOWED\",\n \"notice_days\": 30\n },\n \"eligibility\": {\n \"oem_ids\": [\n \"oem_6a3a8dada72cd0a249ff9528\"\n ],\n \"device_types\": [\n \"BATTERY_STORAGE\"\n ],\n \"zone_id\": \"<string>\",\n \"min_storage_capacity_kwh\": 5,\n \"min_export_power_kw\": 3\n },\n \"enrollment\": {\n \"join_days\": 10,\n \"approval_required\": false,\n \"dispatch_test_required\": true,\n \"signup_url\": \"https://phase.com/tariffs/flex/signup\"\n },\n \"status\": \"LIVE\"\n}")
.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::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"display_name\": \"Community Powershare\",\n \"description\": \"Earn from grid events while you keep your tariff.\",\n \"url\": \"https://pick.com/programs/community-powershare\",\n \"managed\": false,\n \"listed\": true,\n \"terms\": {\n \"rewards\": [\n {\n \"basis\": \"FIXED\",\n \"rate\": 15,\n \"period\": \"QUARTER\"\n },\n {\n \"basis\": \"DELIVERED_KWH\",\n \"rate\": 0.35\n }\n ],\n \"opt_out_policy\": \"ALLOWED\",\n \"notice_days\": 30\n },\n \"eligibility\": {\n \"oem_ids\": [\n \"oem_6a3a8dada72cd0a249ff9528\"\n ],\n \"device_types\": [\n \"BATTERY_STORAGE\"\n ],\n \"zone_id\": \"<string>\",\n \"min_storage_capacity_kwh\": 5,\n \"min_export_power_kw\": 3\n },\n \"enrollment\": {\n \"join_days\": 10,\n \"approval_required\": false,\n \"dispatch_test_required\": true,\n \"signup_url\": \"https://phase.com/tariffs/flex/signup\"\n },\n \"status\": \"LIVE\"\n}"
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"
}{
"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"
}Update a VPP program
Updates a program’s copy, estimates, terms or status. Requesting LIVE moves a listed program to PENDING_APPROVAL and an unlisted one straight to LIVE. PAUSED stops new enrollments, and editing a live program’s customer-facing copy re-enters OEM approval. Fires program.update.
A listed program with managed false needs at least one entry in terms.rewards before its status can be LIVE; otherwise the call returns 422 terms_required. A managed tariff may have none.
A listed program with managed true needs enrollment.signup_url; otherwise the call returns 422 signup_url_required.
A change to terms applies only to enrollments made after it, because each enrollment keeps a copy of the terms it joined with.
curl --request PATCH \
--url https://fleet-api.flatpeak.com/vpp-programs/{program_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"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,
"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": "<string>",
"min_storage_capacity_kwh": 5,
"min_export_power_kw": 3
},
"enrollment": {
"join_days": 10,
"approval_required": false,
"dispatch_test_required": true,
"signup_url": "https://phase.com/tariffs/flex/signup"
},
"status": "LIVE"
}
'import requests
url = "https://fleet-api.flatpeak.com/vpp-programs/{program_id}"
payload = {
"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,
"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": "<string>",
"min_storage_capacity_kwh": 5,
"min_export_power_kw": 3
},
"enrollment": {
"join_days": 10,
"approval_required": False,
"dispatch_test_required": True,
"signup_url": "https://phase.com/tariffs/flex/signup"
},
"status": "LIVE"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
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,
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: '<string>',
min_storage_capacity_kwh: 5,
min_export_power_kw: 3
},
enrollment: {
join_days: 10,
approval_required: false,
dispatch_test_required: true,
signup_url: 'https://phase.com/tariffs/flex/signup'
},
status: 'LIVE'
})
};
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 => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'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,
'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' => '<string>',
'min_storage_capacity_kwh' => 5,
'min_export_power_kw' => 3
],
'enrollment' => [
'join_days' => 10,
'approval_required' => false,
'dispatch_test_required' => true,
'signup_url' => 'https://phase.com/tariffs/flex/signup'
],
'status' => 'LIVE'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://fleet-api.flatpeak.com/vpp-programs/{program_id}"
payload := strings.NewReader("{\n \"display_name\": \"Community Powershare\",\n \"description\": \"Earn from grid events while you keep your tariff.\",\n \"url\": \"https://pick.com/programs/community-powershare\",\n \"managed\": false,\n \"listed\": true,\n \"terms\": {\n \"rewards\": [\n {\n \"basis\": \"FIXED\",\n \"rate\": 15,\n \"period\": \"QUARTER\"\n },\n {\n \"basis\": \"DELIVERED_KWH\",\n \"rate\": 0.35\n }\n ],\n \"opt_out_policy\": \"ALLOWED\",\n \"notice_days\": 30\n },\n \"eligibility\": {\n \"oem_ids\": [\n \"oem_6a3a8dada72cd0a249ff9528\"\n ],\n \"device_types\": [\n \"BATTERY_STORAGE\"\n ],\n \"zone_id\": \"<string>\",\n \"min_storage_capacity_kwh\": 5,\n \"min_export_power_kw\": 3\n },\n \"enrollment\": {\n \"join_days\": 10,\n \"approval_required\": false,\n \"dispatch_test_required\": true,\n \"signup_url\": \"https://phase.com/tariffs/flex/signup\"\n },\n \"status\": \"LIVE\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://fleet-api.flatpeak.com/vpp-programs/{program_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"display_name\": \"Community Powershare\",\n \"description\": \"Earn from grid events while you keep your tariff.\",\n \"url\": \"https://pick.com/programs/community-powershare\",\n \"managed\": false,\n \"listed\": true,\n \"terms\": {\n \"rewards\": [\n {\n \"basis\": \"FIXED\",\n \"rate\": 15,\n \"period\": \"QUARTER\"\n },\n {\n \"basis\": \"DELIVERED_KWH\",\n \"rate\": 0.35\n }\n ],\n \"opt_out_policy\": \"ALLOWED\",\n \"notice_days\": 30\n },\n \"eligibility\": {\n \"oem_ids\": [\n \"oem_6a3a8dada72cd0a249ff9528\"\n ],\n \"device_types\": [\n \"BATTERY_STORAGE\"\n ],\n \"zone_id\": \"<string>\",\n \"min_storage_capacity_kwh\": 5,\n \"min_export_power_kw\": 3\n },\n \"enrollment\": {\n \"join_days\": 10,\n \"approval_required\": false,\n \"dispatch_test_required\": true,\n \"signup_url\": \"https://phase.com/tariffs/flex/signup\"\n },\n \"status\": \"LIVE\"\n}")
.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::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"display_name\": \"Community Powershare\",\n \"description\": \"Earn from grid events while you keep your tariff.\",\n \"url\": \"https://pick.com/programs/community-powershare\",\n \"managed\": false,\n \"listed\": true,\n \"terms\": {\n \"rewards\": [\n {\n \"basis\": \"FIXED\",\n \"rate\": 15,\n \"period\": \"QUARTER\"\n },\n {\n \"basis\": \"DELIVERED_KWH\",\n \"rate\": 0.35\n }\n ],\n \"opt_out_policy\": \"ALLOWED\",\n \"notice_days\": 30\n },\n \"eligibility\": {\n \"oem_ids\": [\n \"oem_6a3a8dada72cd0a249ff9528\"\n ],\n \"device_types\": [\n \"BATTERY_STORAGE\"\n ],\n \"zone_id\": \"<string>\",\n \"min_storage_capacity_kwh\": 5,\n \"min_export_power_kw\": 3\n },\n \"enrollment\": {\n \"join_days\": 10,\n \"approval_required\": false,\n \"dispatch_test_required\": true,\n \"signup_url\": \"https://phase.com/tariffs/flex/signup\"\n },\n \"status\": \"LIVE\"\n}"
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"
}{
"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.
Body
Program fields to update.
Fields to change on a program. All optional; omitted fields keep their value. currency_code cannot be changed.
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
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?

