Skip to content

API Overview

The Vidivo REST API is the backend interface for all platform operations. It follows standard REST conventions with JSON request and response bodies.

https://api.vidivo.app/v1

All endpoints are relative to this base URL. The API is versioned --- breaking changes will result in a new major version prefix (e.g. /v2).

Most endpoints require authentication via a JWT Bearer token.

Authorization: Bearer <access_token>

Access tokens are short-lived (15 minutes). Use the refresh endpoint to obtain a new access token using your refresh token.

Tokens use RS256 signing (asymmetric RSA). Public keys are available at:

https://api.vidivo.app/.well-known/jwks.json
TokenTTLUsage
Access token15 minutesBearer header on all authenticated requests
Refresh token30 daysPOST /v1/auth/refresh only, rotated on use
Signaling token5 minutesWebSocket connection at wss://signal.vidivo.app/ws
Guest tokenSession lifetimeIssued to unauthenticated guests before a call

Access to endpoints is governed by the user’s role. Roles follow a progression:

RoleDescription
guestUnauthenticated caller with a guest session token
userRegistered user with unverified email
verified_userEmail verified, not yet a host
hostAge-verified user who can create call links and receive payouts
adminPlatform administrator with full access

Rate limits are enforced per IP address and per user.

EndpointLimit
POST /v1/auth/login5 requests per 15 minutes per IP
POST /v1/auth/register3 requests per hour per IP
POST /v1/auth/password/reset10 requests per hour per IP
All other endpoints100 requests per minute per user
Unauthenticated endpoints30 requests per minute per IP

When a rate limit is exceeded, the API returns:

HTTP/1.1 429 Too Many Requests
Retry-After: 60
X-RateLimit-Limit: 5
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1710000000

All errors follow a consistent JSON structure:

{
"error": {
"code": "invalid_credentials",
"message": "The email or password is incorrect.",
"details": null
}
}

For validation errors, details contains field-level messages:

{
"error": {
"code": "validation_error",
"message": "Request validation failed.",
"details": {
"email": "must be a valid email address",
"password": "must be at least 8 characters"
}
}
}
CodeHTTP StatusDescription
validation_error400Request body failed validation
unauthorized401Missing or invalid auth token
forbidden403Valid token but insufficient permissions
not_found404Resource does not exist
conflict409Resource already exists (e.g. duplicate email)
rate_limited429Too many requests
internal_error500Unexpected server error
stripe_error402Stripe payment operation failed

Successful responses wrap data in a standard envelope:

{
"success": true,
"data": { ... }
}

Paginated responses include pagination metadata:

{
"success": true,
"data": [ ... ],
"pagination": {
"page": 1,
"per_page": 20,
"total": 45,
"total_pages": 3
}
}

List endpoints use page-based pagination:

Query ParameterTypeDefaultDescription
pageinteger1Page number (1-indexed)
per_pageinteger20Results per page (max 100)
HeaderRequiredDescription
Content-TypeYes (for POST/PUT)Must be application/json
AuthorizationConditionallyBearer <access_token> for authenticated endpoints
X-Idempotency-KeyRecommendedUUID v4 for payment mutations --- prevents duplicate charges
Accept-LanguageNoPreferred locale for error messages (default: en)
HeaderDescription
X-Request-IDUnique request identifier for tracing. Include in bug reports.
X-API-VersionAPI version string
X-RateLimit-LimitRate limit ceiling for the current window
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix timestamp when the rate limit window resets
MethodPathAuthDescription
POST/auth/registerNoCreate account
POST/auth/loginNoLogin
POST/auth/refreshNoRefresh tokens
POST/auth/logoutNoLogout
POST/auth/verify-emailNoVerify email
POST/auth/password/resetNoRequest password reset
POST/auth/password/confirmNoConfirm password reset
POST/auth/googleNoGoogle OAuth login
POST/auth/appleNoApple Sign-In
POST/auth/guest-sessionNoCreate guest session
MethodPathAuthDescription
GET/users/meYesGet own profile
PUT/users/meYesUpdate profile
PUT/users/me/avatarYesUpload avatar
POST/users/me/become-hostYesBecome a host
PUT/users/me/rateYesSet billing rate
PUT/users/me/toggle-availableYesToggle availability
GET/users/me/availabilityYesGet schedule
PUT/users/me/availabilityYesSet schedule
GET/users/:usernameNoPublic host profile
MethodPathAuthDescription
POST/calls/join/:short_codeGuest/UserJoin via link
POST/calls/:id/host-joinHostHost joins call
POST/calls/:id/endYesEnd call
GET/calls/:idYesGet call details
GET/calls/historyYesCall history
POST/calls/linksHostCreate call link
GET/calls/linksHostList call links
DELETE/calls/links/:idHostDelete call link
GET/calls/links/:shortCode/infoNoLink public info
MethodPathAuthDescription
GET/payments/historyYesPayment history
GET/payments/history/exportYesExport payments
GET/payments/earningsHostEarnings summary
GET/payments/earnings/chartHostEarnings chart
POST/payments/payoutHostRequest payout
GET/payments/payoutsHostPayout history
MethodPathAuthDescription
GET/chat/conversationsYesList conversations
POST/chat/conversationsYesCreate conversation
GET/chat/conversations/:id/messagesYesGet messages
POST/chat/conversations/:id/messagesYesSend message
POST/chat/broadcastHostBroadcast to followers

See individual API reference pages for full request/response details.

URLDescription
wss://signal.vidivo.app/signal/wsWebRTC signaling
wss://api.vidivo.app/v1/chat/ws?token=JWTReal-time chat

The current stable version is v1. When breaking changes are introduced, a new version will be published at /v2 with an appropriate migration guide. The old version will remain available for 6 months after a new version is released.