Get an API key. Create a booking. List bookings. Check your calendar. Under 5 minutes.
Create your first API key at vennio.app/api-keys. Copy the secret key — it starts with vennio_sk_live_.
export VENNIO_API_KEY="vennio_sk_live_YOUR_KEY"
export BUSINESS_ID="YOUR_BUSINESS_ID"
Your business ID is shown on the dashboard home page.
Secret keys (vennio_sk_live_*) must never be exposed in client-side code or version control. Store them in environment variables.
curl -X POST https://api.vennio.app/v1/bookings \
-H "Authorization: Bearer $VENNIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"business_id": "'"$BUSINESS_ID"'",
"customer_email": "customer@example.com",
"customer_name": "Jane Doe",
"start_time": "2026-05-01T09:00:00Z",
"end_time": "2026-05-01T09:30:00Z",
"notes": "Intro call"
}'
{
"booking": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "confirmed",
"business_id": "YOUR_BUSINESS_ID",
"customer_name": "Jane Doe",
"customer_email": "customer@example.com",
"start_time": "2026-05-01T09:00:00Z",
"end_time": "2026-05-01T09:30:00Z",
"created_at": "2026-04-11T10:00:00Z"
}
}
Vennio automatically creates a calendar event, sends confirmation emails, and fires a booking.created webhook.
Add "demo_mode": true to your request body to run the full API flow without creating a calendar event or sending emails. Use this in development and CI.
curl "https://api.vennio.app/v1/bookings?business_id=$BUSINESS_ID&status=confirmed&limit=10" \
-H "Authorization: Bearer $VENNIO_API_KEY"
{
"bookings": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "confirmed",
"customer_name": "Jane Doe",
"customer_email": "customer@example.com",
"start_time": "2026-05-01T09:00:00Z",
"end_time": "2026-05-01T09:30:00Z"
}
],
"has_more": false,
"next_cursor": null
}
Filter parameters:
| Parameter | Type | Description |
|---|---|---|
business_id |
UUID | Filter by business |
status |
string | confirmed, cancelled, or completed |
from |
ISO 8601 | Bookings starting after this time |
to |
ISO 8601 | Bookings starting before this time |
limit |
integer | Page size (default: 20, max: 100) |
cursor |
string | Pagination cursor from previous response |
List connected calendars to confirm Vennio can read and write availability:
curl https://api.vennio.app/v1/calendars \
-H "Authorization: Bearer $VENNIO_API_KEY"
{
"calendars": [
{
"id": "cal_abc123",
"name": "Work",
"provider": "google",
"primary": true,
"selected": true
}
],
"providers": [
{
"name": "google",
"connected": true,
"calendar_count": 3
}
]
}
If no calendars are connected, go to the dashboard and complete the Google or Microsoft OAuth flow. See Integration Patterns for embedding the connect flow in your product.
To manually trigger a sync:
curl -X POST https://api.vennio.app/v1/calendars/sync \
-H "Authorization: Bearer $VENNIO_API_KEY"
{
"events_synced": 24,
"last_sync": "2026-04-11T10:05:00Z"
}
If you prefer typed methods over raw HTTP, install @vennio/sdk:
npm install @vennio/sdk
import { createVennioClient } from '@vennio/sdk'
const client = createVennioClient({ apiKey: process.env.VENNIO_API_KEY })
// Create a booking
const res = await client.bookings.create({
body: {
business_id: process.env.BUSINESS_ID,
customer_email: 'customer@example.com',
customer_name: 'Jane Doe',
start_time: '2026-05-01T09:00:00Z',
end_time: '2026-05-01T09:30:00Z',
},
})
console.log('Booking created:', res.data.booking.id)
// List bookings
const list = await client.bookings.list({
query: { business_id: process.env.BUSINESS_ID, status: 'confirmed' },
})
console.log(`${list.data.bookings.length} bookings found`)
In 4 steps you:
booking.created, booking.cancelled, and more@vennio/react