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. Scoperead. Cursor pagination.GET /campaigns/{id}β one campaign. Scoperead.GET /campaigns/{id}/postsβ campaign posts. Scoperead. Cursor + optional status filter.GET /campaigns/{id}/creatorsβ creators aggregated by account, ranked by views. Scoperead.GET /campaigns/{id}/tracking-linksβ tracking links withuniqueClicks. Scoperead.
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. Scoperead. Cursor paginated.GET /postsβ your own submitted posts across all campaigns: status, views, earnings, campaign, account and submission date, plus asummary(total, on-moderation, total earned). Scoperead. Cursor + optionalstatus/platformfilters.
Analytics
GET /analytics/campaigns/{id}β campaign analytics. Scoperead.
Wallet
GET /walletβ current balance. Scoperead.GET /wallet/transactionsβ billing history. Scoperead. 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=1234The 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, currencyUSD(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