Skip to content

Call Links

Call links are shareable URLs that guests use to initiate a video call session with a host. Each link encodes the host’s rate, window size, and access configuration.

A call link URL looks like:

https://vidivo.app/c/{short_code}

Create a new call link.

Authentication: Bearer token with host role.

POST /v1/links
Authorization: Bearer eyJhbGciOiJSUzI1NiJ9...
Content-Type: application/json
{
"rate_per_minute": "2.50",
"window_size_minutes": 10,
"expires_at": "2026-03-22T00:00:00Z",
"max_uses": 1,
"label": "Session with Alex",
"scheduled_start": null,
"scheduled_end": null
}
FieldTypeRequiredDescription
rate_per_minutestring (decimal)YesPer-minute charge in USD. Min $0.50, max $999.99.
window_size_minutesintegerYesBilling window size in minutes. Min 1, max 60.
expires_atstring (ISO 8601)NoWhen the link expires. Null = never expires.
max_usesintegerNoMaximum number of times the link can be used. Null = unlimited.
labelstringNoInternal label for your reference. Max 120 characters.
scheduled_startstring (ISO 8601)NoLink only works after this time.
scheduled_endstring (ISO 8601)NoLink stops working after this time.
HTTP/1.1 201 Created
Content-Type: application/json
{
"link": {
"id": "01JN2X7N1Q6I0TSCUYZ9AELGHI",
"short_code": "abc123",
"url": "https://vidivo.app/c/abc123",
"host_id": "01JN2X4K8M3F7QPZRVWT6YBHCE",
"rate_per_minute": "2.50",
"window_size_minutes": 10,
"expires_at": "2026-03-22T00:00:00Z",
"max_uses": 1,
"use_count": 0,
"label": "Session with Alex",
"scheduled_start": null,
"scheduled_end": null,
"is_active": true,
"created_at": "2026-03-15T10:00:00Z"
}
}
CodeStatusDescription
forbidden403User is not a verified host
validation_error400Invalid rate, window size, or date
stripe_not_connected402Host has not completed Stripe onboarding

List all call links for the authenticated host.

Authentication: Bearer token with host role.

GET /v1/links?limit=20&cursor=eyJpZCI6IjEyMyJ9&active=true
Authorization: Bearer eyJhbGciOiJSUzI1NiJ9...
Query ParameterTypeDescription
limitintegerResults per page. Default 20, max 100.
cursorstringPagination cursor from previous response.
activebooleanFilter by active status. Omit for all.
HTTP/1.1 200 OK
Content-Type: application/json
{
"links": [
{
"id": "01JN2X7N1Q6I0TSCUYZ9AELGHI",
"short_code": "abc123",
"url": "https://vidivo.app/c/abc123",
"rate_per_minute": "2.50",
"window_size_minutes": 10,
"expires_at": "2026-03-22T00:00:00Z",
"max_uses": 1,
"use_count": 0,
"label": "Session with Alex",
"is_active": true,
"created_at": "2026-03-15T10:00:00Z"
}
],
"pagination": {
"cursor": null,
"has_more": false,
"limit": 20
}
}

Retrieve a single call link by its short code. This endpoint is publicly accessible — it is used by guests when they open a link.

Authentication: None required for public metadata. Bearer token required for full details (use count, label, etc.).

GET /v1/links/abc123
HTTP/1.1 200 OK
Content-Type: application/json
{
"link": {
"short_code": "abc123",
"url": "https://vidivo.app/c/abc123",
"host": {
"display_name": "Jane Smith"
},
"rate_per_minute": "2.50",
"window_size_minutes": 10,
"is_active": true,
"scheduled_start": null,
"scheduled_end": null
}
}
CodeStatusDescription
not_found404Link does not exist or has been deleted
link_expired410Link existed but has expired
link_exhausted410Link has reached its maximum use count

Deactivate a call link. The link is soft-deleted — it cannot be used for new calls but existing sessions continue unaffected.

Authentication: Bearer token with host role. Must be the link owner.

DELETE /v1/links/01JN2X7N1Q6I0TSCUYZ9AELGHI
Authorization: Bearer eyJhbGciOiJSUzI1NiJ9...
HTTP/1.1 204 No Content
CodeStatusDescription
not_found404Link not found
forbidden403Caller does not own this link

SettingDescriptionConstraints
rate_per_minuteCost per minute in USD$0.50 – $999.99
window_size_minutesPre-authorization window1 – 60 minutes

Choosing a window size: Smaller windows (e.g. 5 min) mean more frequent holds and captures but allow guests to stop at finer granularity. Larger windows (e.g. 30 min) reduce Stripe API calls but hold more funds upfront.

SettingDescriptionExample
expires_atHard expiry date for the link24 hours, 7 days, never
max_usesMaximum number of call sessions1 (single-use), null (unlimited)
scheduled_startLink not usable before this timeSession start time
scheduled_endLink not usable after this timeSession end time

Single-use session (most secure):

{
"max_uses": 1,
"expires_at": "2026-03-16T10:00:00Z"
}

Permanent open link (recurring clients):

{
"max_uses": null,
"expires_at": null
}

Scheduled appointment:

{
"max_uses": 1,
"scheduled_start": "2026-03-15T14:00:00Z",
"scheduled_end": "2026-03-15T15:00:00Z"
}

Terminal window
# Create a single-use link
curl -X POST https://api.vidivo.app/v1/links \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiJ9..." \
-H "Content-Type: application/json" \
-d '{
"rate_per_minute": "2.50",
"window_size_minutes": 10,
"max_uses": 1,
"expires_at": "2026-03-22T00:00:00Z",
"label": "Session with Alex"
}'
# List active links
curl "https://api.vidivo.app/v1/links?active=true" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiJ9..."
# Get a link (public)
curl https://api.vidivo.app/v1/links/abc123
# Delete a link
curl -X DELETE https://api.vidivo.app/v1/links/01JN2X7N1Q6I0TSCUYZ9AELGHI \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiJ9..."