Skip to content

Endpoint reference

Every endpoint lives under the /api/v1/public/ prefix on https://api.vibevo.io and requires an API key with the right scope.

Key identity

  • GET /me β€” the current key's identity (owner, scopes). Any valid key works.

Campaigns

  • GET /campaigns β€” list campaigns. Scope read. Cursor pagination.
  • GET /campaigns/{id} β€” one campaign. Scope read.
  • GET /campaigns/{id}/posts β€” campaign posts. Scope read. Cursor + optional status filter.
  • GET /campaigns/{id}/creators β€” creators aggregated by account, ranked by views. Scope read.
  • GET /campaigns/{id}/tracking-links β€” tracking links with uniqueClicks. Scope read.

Offers (for creators)

  • GET /offers β€” the creator's offer wall (RUNNING campaigns they can work on) with creator-facing terms (reward/CPM, requirements, takenAt), without the advertiser's budget/spend. Scope read. Cursor paginated.
  • GET /posts β€” your own submitted posts across all campaigns: status, views, earnings, campaign, account and submission date, plus a summary (total, on-moderation, total earned). Scope read. Cursor + optional status / platform filters.

Analytics

  • GET /analytics/campaigns/{id} β€” campaign analytics. Scope read.

Wallet

  • GET /wallet β€” current balance. Scope read.
  • GET /wallet/transactions β€” billing history. Scope read. Cursor pagination.

Cursor pagination

List endpoints use cursor pagination. Pass limit (1 to 100) and cursor (the id of the last item from the previous page):

GET /api/v1/public/campaigns?limit=50&cursor=1234

The response contains a data array and the next-page cursor:

{
  "data": [ /* ... */ ],
  "nextCursor": "5678"
}

When nextCursor is null, there are no more pages.

Money format

Monetary values are returned as a struct:

{
  "raw": "1500",
  "currency": "USD",
  "decimals": 2
}

raw is an integer in minor units, sent as a string; the real value = raw / 10^decimals. Note the two different scales:

  • Campaign budgets and post earnings β€” cents: decimals: 2, currency USD (e.g. raw: "1500" = 15.00 USD).
  • Wallet balance and billing transactions β€” USDT minor units: decimals: 6.

Error format

Errors come back in a single envelope:

{
  "statusCode": 403,
  "code": "insufficient_scope",
  "message": "Missing required scope: read",
  "timestamp": "2026-07-11T12:00:00.000Z",
  "path": "/api/v1/public/campaigns"
}

Branch on the string code field for programmatic handling β€” it is more stable than the human-readable message.

curl examples

List campaigns (Bearer header):

curl https://api.vibevo.io/api/v1/public/campaigns?limit=20 \
  -H "Authorization: Bearer vibevo_live_ab12cd.xxxxxxxxxxxxxxxx"

Wallet balance (X-API-Key header):

curl https://api.vibevo.io/api/v1/public/wallet \
  -H "X-API-Key: vibevo_live_ab12cd.xxxxxxxxxxxxxxxx"

Was this article helpful?

Updated: July 11, 2026

VibeVO API endpoint reference | VibeVO Docs