REST API
Authentication and core endpoints. Full reference at api.recal.dev/v1/swagger.
For complete documentation with request/response schemas and interactive testing, visit the Swagger UI.
Availability endpoints can answer partially; the Swagger schema links to Troubleshooting where it does.
Base URL
https://api.recal.dev/v1Authentication
Use your API key in the Authorization header:
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://api.recal.dev/v1/usersGenerate keys at dash.recal.dev → API Keys
Endpoints
Scheduling
Find availability across users or organizations.
GET /v1/users/{userId}/schedulingGET /v1/organizations/{orgSlug}/scheduling
Organization routes report connected members that could not be read; see Troubleshooting.
Users
GET /v1/users— List usersPOST /v1/users— Create userGET /v1/users/{userId}— Get detailsPUT /v1/users/{userId}— UpdateDELETE /v1/users/{userId}— Delete
Organizations
Create workspaces to group users. Optional for B2C, essential for B2B multi-tenancy.
GET /v1/organizations— List organizationsPOST /v1/organizations— Create organizationGET /v1/organizations/{orgSlug}— Get organization detailsPUT /v1/organizations/{orgSlug}— Update organizationDELETE /v1/organizations/{orgSlug}— Delete organization
Calendar
GET /v1/users/{userId}/calendar/busy— User busy periodsGET /v1/organizations/{orgSlug}/calendar/busy— Organization busy periods
Organization routes report connected members that could not be read, and the user route reports calendars it could not read; see Troubleshooting.
OAuth
Supported: Google Calendar, Microsoft Outlook
GET /v1/users/{userId}/oauth— List connectionsPOST /v1/users/{userId}/oauth/{provider}/authorize— Start OAuthDELETE /v1/users/{userId}/oauth/{provider}— Remove connection
OAuth Scopes
Recal offers three levels of access:
write- Full calendar read/write access (create, update, delete events)read- Read-only access to calendars and eventsfree-busy- Read-only access to availability information
edit is deprecated — still accepted as a synonym for write, but it will be removed in a future version. New integrations should request write.
When making API calls, Recal automatically validates scopes. If a user lacks required permissions, you'll receive a 403 Forbidden response:
{
"error": "Insufficient scopes for operation 'calendar.events.insert'. Required scope level: write. You need to request one of these scopes: ...",
"operation": "calendar.events.insert",
"validScopes": [
"https://www.googleapis.com/auth/calendar",
"https://www.googleapis.com/auth/calendar.events"
],
"data": null
}See the OAuth Setup Guide for detailed scope configuration.
Example Request
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://api.recal.dev/v1/usersResponses
We're responding in the standardized API format:
{
data: {
// The actual data payload
}
}
// or
{
data: null
error: string
}
// or, on availability endpoints that read several calendars or members
{
data: { /* everything that could be read */ },
failedCalendars: [ /* or failedUsers — what could not, each with a reason and message */ ]
}The third form is a 200. Three things always hold:
- Only endpoints that fan out over calendars or members carry a list.
datakeeps its ordinary shape — the list never moves inside it.- The list is always present,
[]when nothing failed, sofailedCalendars.lengthneeds no guard.
Availability routes can answer partially — see Troubleshooting.