All Vennio API requests require authentication using a Bearer token in the Authorization header.
Vennio API keys are the recommended authentication method for server-side integrations and AI agents. Keys start with vennio_sk_live_ (secret) or vennio_pk_live_ (publishable).
Secret keys (vennio_sk_live_*) should never be exposed in client-side code, browser JavaScript, or mobile apps. For client-side booking widgets, use a publishable key — it reaches only the public booking surface, so exposing it in a browser is safe.
| Key type | Prefix | Use case | Access |
|---|---|---|---|
| Secret key | vennio_sk_live_ |
Server-side, AI agents | Full access |
| Publishable key | vennio_pk_live_ |
Client-side booking widgets | Public booking surface only; domain-lockable |
Create your first API key at vennio.app/api-keys. No API call required. Once you have a secret key, you can create additional keys programmatically using POST /v1/api-keys — pass your existing secret key as the Bearer token.
curl -X POST https://api.vennio.app/v1/api-keys \
-H "Authorization: Bearer vennio_sk_live_YOUR_EXISTING_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Production key",
"description": "For my scheduling integration",
"rate_limit_per_hour": 1000
}'
{
"api_key": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Production key",
"key": "vennio_sk_live_xxxxxxxxxxxxxxxxxxxx",
"scopes": ["read", "write"],
"rate_limit_per_hour": 1000,
"created_at": "2026-01-20T10:00:00Z"
}
}
The full key value is only shown once at creation. Store it securely — you won't be able to retrieve it again.
Pass your API key as a Bearer token in every request:
curl https://api.vennio.app/v1/availability/slots \
-H "Authorization: Bearer vennio_sk_live_YOUR_KEY_HERE" \
-G \
-d business_id=YOUR_BUSINESS_ID \
-d duration_minutes=30 \
-d from=2026-05-01T09:00:00Z \
-d to=2026-05-01T17:00:00Z
Secret keys and user sessions (JWT) have full access. A publishable key has no access beyond the public booking surface — the same endpoints an anonymous visitor to a booking page can reach: resolve a booking link, read its availability, create a booking, join a waitlist. It cannot create or manage links, hosts, consents, proposals, webhooks, or any account resource.
What it's for: embed it in client-side code and lock it to your domains. It identifies your account on the public booking surface — so bookings land against the right business — without carrying any power worth stealing. That's the point: safe in a browser, useful, and origin-restricted. Its value is operational:
allowed_domains; requests from other origins are rejected.Using a publishable key on any endpoint outside the public surface returns the standard problem+json 403:
{
"type": "https://api.vennio.app/errors/forbidden",
"title": "Forbidden",
"status": 403,
"detail": "This endpoint requires a secret API key. Publishable keys cannot access this resource. Use a secret key (vennio_sk_live_...) or a user session for server-side operations.",
"request_id": "req_abc123"
}
DELETE /v1/api-keys/{id}GET /v1/api-keys/{id}/stats