Partner APIs

The same REST API the dashboard uses — channels, ad breaks, campaigns, orders, line items, creatives, deals, identity and reporting.

Authentication

Create a key at Dashboard → Settings → API Keys (name and optional expiry). The key is shown once. It acts exactly as your own login: same role, same account, same data scope. Keys are stored hashed and can be revoked from the same page.

Authorization: Bearer ltv_live_xxxxxxxxxxxx

Base URL: https://api.ltvadx.com/api/v1/

Channels and ad breaks (publishers)

GET    /api/v1/channels
POST   /api/v1/channels
{
  "name":         "FAST News 24",
  "platforms":    ["ROKU", "FIRE_TV"],
  "contentModel": "FAST",
  "floorCpm":     5.00,
  "country":      "IN",
  "language":     "en"
}
GET    /api/v1/channels/{id}
PUT    /api/v1/channels/{id}
DELETE /api/v1/channels/{id}
PATCH  /api/v1/channels/{id}/status          # admin: approve / suspend

GET    /api/v1/ad-breaks  ·  POST  ·  GET/PUT/DELETE /api/v1/ad-breaks/{id}

Ad breaks are informational today

Ad-break records (pod size, break floor, skip settings) are stored but not used by the ad server. The decision uses the channel's floor CPM and the breakType and duration on each VAST request.

Campaigns, orders, line items, creatives (advertisers)

POST /api/v1/campaigns
{
  "name":         "Brand Awareness Q4",
  "advertiserId": "…",
  "totalBudget":  50000,
  "dailyBudget":  2000,
  "startDate":    "2026-10-01",
  "endDate":      "2026-12-31",
  "currency":     "USD"
}

POST /api/v1/orders                          # a line item serves only under an APPROVED order

POST /api/v1/line-items
{
  "campaignId":               "…",
  "orderId":                  "…",
  "name":                     "Roku Q4 30s",
  "dealType":                 "OPEN_AUCTION",
  "bidCpm":                   12.50,
  "budget":                   20000,
  "dailyBudget":              800,
  "platforms":                ["ROKU", "FIRE_TV"],
  "targetContentModels":      ["FAST", "AVOD"],
  "targetBreakTypes":         ["MID_ROLL"],
  "channelIds":               ["…"],
  "maxAdDurationSeconds":     30,
  "frequencyCapImpressions":  3,
  "frequencyCapWindowHours":  24,
  "minVcrThreshold":          0.65
}

POST /api/v1/creatives
{
  "name":            "30s Brand Spot",
  "creativeType":    "VAST_WRAPPER",
  "vastUrl":         "https://cdn.example.com/vast/30s.xml",
  "durationSeconds": 30,
  "skippable":       false
}

# Each resource also has GET (list / by id), PUT, PATCH /{id}/status and DELETE.

Targeting fields that are saved but not applied

Regions, cities, DMA regions and TV-exposed (ACR) segments are stored on line items but not evaluated at serve time. Country targeting applies only to requests that carry a country.

Deals

POST /api/v1/deals
{
  "name":              "Q4 Sports PMP",
  "dealType":          "PMP",
  "sellerPublisherId": "…",
  "channelIds":        ["…"],
  "floorCpm":          18.00,
  "startDate":         "2026-10-01",
  "endDate":           "2026-12-31"
}
GET /api/v1/deals  ·  GET/PUT /api/v1/deals/{id}  ·  PATCH /api/v1/deals/{id}/status

GET /api/v1/ssp/inventory?platform=ROKU&country=IN      # browse inventory
GET /api/v1/ssp/inventory/{channelId}/forecast

Identity and reporting

See the Identity API guide (/api/v1/identity/resolve, /acr-signal) and the Reporting Overview (/api/v1/reports/delivery, /vcr, /summary, /reach-frequency).

Not available yet

  • Webhooks — poll the API instead.
  • Publisher sub-account creation and invitations through the API.
  • Role-limited or IP-restricted API keys — a key always carries its owner's full access.

List endpoints return all matching records for your scope; there is no cursor pagination.