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 /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

Rate limits are enforced per IP address and per user.

EndpointLimit
POST /auth/login5 requests per 15 minutes per IP
POST /auth/register3 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
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-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

List endpoints that return multiple resources use cursor-based pagination:

{
"data": [...],
"pagination": {
"cursor": "eyJpZCI6IjEyMyJ9",
"has_more": true,
"limit": 20
}
}

Pass the cursor in subsequent requests:

GET /calls?cursor=eyJpZCI6IjEyMyJ9&limit=20

WebRTC signaling uses a separate WebSocket endpoint:

wss://signal.vidivo.app/ws?token=<signaling_token>

Obtain a signaling_token from POST /calls/initiate. The token is valid for 5 minutes and is single-use per session. See the Calls API for details.

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.

A machine-readable OpenAPI 3.1 specification is available at:

https://api.vidivo.app/v1/openapi.json