Recal Organization Scheduling API
Routes for the Organization Scheduling
Routes for the Organization Scheduling
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/recal:recal-organization-scheduling-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Recal Organization Scheduling API
description: 'The official Recal.dev API.
**Tip:** Use `x-timezone` header to set timezone for all returned datetimes.'
version: 0.2.0
servers:
- url: https://api.recal.dev
description: Recal API
security:
- token: []
tags:
- name: Organization Scheduling
description: Routes for the Organization Scheduling
paths:
/v1/organizations/{orgSlug}/scheduling:
get:
operationId: getV1OrganizationsByOrgSlugScheduling
description: 'Get available time slots for all users in a sub-organization. Users whose calendars could not be read are listed in `failedUsers` and contribute no slots, so a non-empty `failedUsers` means the availability is a partial answer rather than a complete one. Members with no connected calendar are not listed — https://docs.recal.dev/core/troubleshooting
Tip: Use the `x-timezone` header to specify the timezone of the times provided in the request'
tags:
- Organization Scheduling
responses:
'200':
description: Available time slots, plus the users that could not be read
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
availableSlots:
type: array
items:
type: object
properties:
end:
type: string
description: End time of the time range in ISO format
format: date-time
pattern: ^([+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))(T((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([,.]\d+(?!:))?)?(\17[0-5]\d([,.]\d+)?)?([Zz]|([+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$
start:
type: string
description: Start time of the time range in ISO format
format: date-time
pattern: ^([+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))(T((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([,.]\d+(?!:))?)?(\17[0-5]\d([,.]\d+)?)?([Zz]|([+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$
userId:
type: string
examples:
- user_123
pattern: ^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$
required:
- end
- start
- userId
options:
type: object
properties:
end:
type: string
description: End time of the time range in ISO format
format: date-time
pattern: ^([+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))(T((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([,.]\d+(?!:))?)?(\17[0-5]\d([,.]\d+)?)?([Zz]|([+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$
maxOverlaps:
type: integer
padding:
type: integer
description: Padding in minutes to add before and after busy times
slotDuration:
type: integer
description: Duration of each slot in minutes
start:
type: string
description: Start time of the time range in ISO format
format: date-time
pattern: ^([+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))(T((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([,.]\d+(?!:))?)?(\17[0-5]\d([,.]\d+)?)?([Zz]|([+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$
earliestTimeEachDay:
type: string
description: Requested earliest time of each day (in the time zone of the request)
examples:
- '10:00'
pattern: ^([01]?[0-9]|2[0-3]):[0-5][0-9]$
latestTimeEachDay:
type: string
description: Requested latest time of each day (in the time zone of the request)
examples:
- '16:00'
pattern: ^([01]?[0-9]|2[0-3]):[0-5][0-9]$
required:
- end
- maxOverlaps
- padding
- slotDuration
- start
required:
- availableSlots
- options
failedUsers:
type: array
items:
$ref: '#/components/schemas/FailedFreeBusyUser'
required:
- data
- failedUsers
'400':
description: Validation Error
content:
application/json:
schema:
type: object
properties:
error:
type: string
data:
type: 'null'
required:
- error
- data
'404':
description: Organization not found, or it has no members
content:
application/json:
schema:
type: object
properties:
data:
type: 'null'
error:
type: string
examples:
- Organization not found
- No users found in this organization
required:
- data
- error
parameters:
- in: path
name: orgSlug
schema:
type: string
examples:
- recal
pattern: ^[a-z0-9][a-z0-9_-]{2,127}$
required: true
- in: query
name: end
schema:
type: string
pattern: ^([+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))(T((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([,.]\d+(?!:))?)?(\17[0-5]\d([,.]\d+)?)?([Zz]|([+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$
required: true
description: End time of the time range in ISO format
- in: query
name: start
schema:
type: string
pattern: ^([+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))(T((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([,.]\d+(?!:))?)?(\17[0-5]\d([,.]\d+)?)?([Zz]|([+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$
required: true
description: Start time of the time range in ISO format
- in: query
name: earliestTimeEachDay
schema:
type: string
examples:
- '10:00'
pattern: ^([01]?[0-9]|2[0-3]):[0-5][0-9]$
description: Requested earliest time of each day (in the time zone of the request)
- in: query
name: latestTimeEachDay
schema:
type: string
examples:
- '16:00'
pattern: ^([01]?[0-9]|2[0-3]):[0-5][0-9]$
description: Requested latest time of each day (in the time zone of the request)
- in: query
name: maxOverlaps
schema:
type: string
examples:
- '0'
default: '0'
pattern: ^(?:(?!^-0$)-?(?:(?:0|[1-9]\d*)))$
description: 'an integer >= 0 (default: 0)'
- in: query
name: padding
schema:
type: string
examples:
- '0'
default: '0'
pattern: ^(?:(?!^-0$)-?(?:(?:0|[1-9]\d*)))$
description: Padding in minutes to add before and after busy times
- in: query
name: provider
schema:
anyOf:
- type: array
items:
enum:
- google
- microsoft
- const: google
- const: microsoft
- in: query
name: slotDuration
schema:
type: string
examples:
- '0'
default: '30'
pattern: ^(?:(?!^-0$)-?(?:(?:0|[1-9]\d*)))$
description: Duration of each slot in minutes
summary: Get V1Organizations by org slug scheduling
x-summary-source: derived
components:
schemas:
FreeBusyFailureReason:
enum:
- accessDenied
- authorizationInvalid
- insufficientScopes
- invalidCalendarId
- mailboxUnavailable
- notFound
- providerError
- providerNotConfigured
- rateLimited
- tooManyCalendars
description: 'Why a calendar or a user could not be read. What each value means and how to resolve it: https://docs.recal.dev/core/troubleshooting'
FailedCalendar:
type: object
description: A calendar that could not be read
properties:
calendarId:
type: string
message:
type: string
provider:
enum:
- google
- microsoft
reason:
$ref: '#/components/schemas/FreeBusyFailureReason'
required:
- calendarId
- message
- provider
- reason
FailedFreeBusyUser:
type: object
description: A user whose busy times are missing (failedCalendars empty) or incomplete (failedCalendars names the gaps)
properties:
customId:
type: string
examples:
- user_123
failedCalendars:
type: array
items:
$ref: '#/components/schemas/FailedCalendar'
message:
type: string
reason:
$ref: '#/components/schemas/FreeBusyFailureReason'
required:
- customId
- failedCalendars
- message
- reason
securitySchemes:
token:
type: http
scheme: bearer
bearerFormat: recal-token
description: Recal API token