WhenToMeet
Base URL: https://whentomeet.io/api/v1/
OpenAPI Spec: https://whentomeet.io/api/openapi.json
Authentication: INLINECODE2
Request/Response Format
Request Format:
- - GET requests: Query parameters (e.g.,
?limit=10&offset=0) - POST requests: Plain JSON body (e.g.,
{"title": "My Event"}) - No wrapper objects - send plain JSON directly
Response Format:
- - All responses return plain JSON with ISO 8601 date strings
- No envelope or wrapping
Date Format: ISO 8601 strings (e.g., "2026-03-14T14:00:00Z")
Data Model
Event Object
- -
id: UUID - INLINECODE7 : string (1-255 chars)
- INLINECODE8 : string (optional, max 4096 chars)
- INLINECODE9 : "PLANNING" | "FINALIZED"
- INLINECODE10 : Full URL to event page
- INLINECODE11 : UUID
- INLINECODE12 : ISO 8601 timestamp
- INLINECODE13 : "EVERYONE" | "ORGANIZER"
- INLINECODE14 : UUID (optional, for finalizing events to calendar)
- INLINECODE15 : number of time slots
Time Slot Object
- -
id: UUID - INLINECODE17 : UUID
- INLINECODE18 : ISO 8601 timestamp
- INLINECODE19 : ISO 8601 timestamp
- INLINECODE20 : IANA timezone identifier (optional, e.g., "Europe/Berlin")
- INLINECODE21 : array of participant responses
Create Event
POST INLINECODE22
CODEBLOCK0
Request Fields:
| Field | Type | Required | Notes |
|---|
| title | string | yes | 1-255 chars |
| description |
string | no | max 4096 chars |
| slots | array | yes | min 1 slot; each has startTime, endTime (ISO 8601), optional timezone |
| modificationPolicy | string | no | "EVERYONE" or "ORGANIZER" (default) |
| outputCalendarId | string | no | UUID of calendar to create final event in |
Response:
CODEBLOCK1
List Events
GET INLINECODE23
CODEBLOCK2
Query Parameters:
| Field | Type | Required | Notes |
|---|
| limit | number | no | 1-100, default 10 |
| offset |
number | no | default 0 |
| status | string | no | "PLANNING" or "FINALIZED" |
Response:
CODEBLOCK3
Get Event Details
GET INLINECODE24
CODEBLOCK4
Response:
CODEBLOCK5
Delete Event
DELETE INLINECODE25
CODEBLOCK6
Response:
CODEBLOCK7
Other Endpoints
List Bookings
GET INLINECODE26
CODEBLOCK8
Query Parameters:
- -
limit: 1-100, default 10 - INLINECODE28 : default 0
- INLINECODE29 : "confirmed" or "cancelled"
List Calendar Connections
GET INLINECODE30
CODEBLOCK9
Lists all connected calendar accounts (Google, Microsoft, CalDAV, iCal).
Get Event Statistics
GET INLINECODE31
CODEBLOCK10
Query Parameters:
- -
dateFrom: ISO 8601 start date (optional, defaults to 30 days ago) - INLINECODE33 : ISO 8601 end date (optional, defaults to now)
Response:
CODEBLOCK11
Error Codes
| HTTP Status | Code | Meaning |
|---|
| 400 | BAD_REQUEST | Invalid input (check zodError in response for field details) |
| 401 |
UNAUTHORIZED | Missing or invalid API key |
| 403 | FORBIDDEN | Insufficient permissions or subscription tier |
| 404 | NOT_FOUND | Resource not found or not owned by you |
| 429 | TOO
MANYREQUESTS | Rate limit exceeded |
| 500 | INTERNAL
SERVERERROR | Server error |
Error Response Format:
CODEBLOCK12
Rate Limits
| Tier | Limit |
|---|
| Free | 32 requests (lifetime total) |
| Plus |
1,000 requests per hour |
| Plus Lifetime | 1,000 requests per hour |
Check response headers: X-RateLimit-Limit, X-RateLimit-Remaining, INLINECODE36
Getting an API Key
- 1. Sign up for a Plus or Plus Lifetime subscription
- Navigate to API Keys settings
- Click "Create API Key" and copy your key (shown only once)
Example: Complete Event Workflow
CODEBLOCK13
WhenToMeet
基础URL: https://whentomeet.io/api/v1/
OpenAPI规范: https://whentomeet.io/api/openapi.json
认证方式: Authorization: Bearer skYOURAPIKEYHERE
请求/响应格式
请求格式:
- - GET请求: 查询参数 (例如 ?limit=10&offset=0)
- POST请求: 纯JSON主体 (例如 {title: 我的活动})
- 无包装对象 - 直接发送纯JSON
响应格式:
- - 所有响应返回包含ISO 8601日期字符串的纯JSON
- 无信封或包装
日期格式: ISO 8601字符串 (例如 2026-03-14T14:00:00Z)
数据模型
活动对象
- - id: UUID
- title: 字符串 (1-255字符)
- description: 字符串 (可选,最大4096字符)
- status: PLANNING | FINALIZED
- publicUrl: 活动页面的完整URL
- organizerId: UUID
- createdAt: ISO 8601时间戳
- modificationPolicy: EVERYONE | ORGANIZER
- outputCalendarId: UUID (可选,用于将活动最终确定到日历)
- slotCount: 时间段数量
时间段对象
- - id: UUID
- eventId: UUID
- startTime: ISO 8601时间戳
- endTime: ISO 8601时间戳
- timezone: IANA时区标识符 (可选,例如 Europe/Berlin)
- availabilities: 参与者响应数组
创建活动
POST /api/v1/events
bash
curl -X POST https://whentomeet.io/api/v1/events \
-H Authorization: Bearer skYOURAPIKEYHERE \
-H Content-Type: application/json \
-d {
title: 我的活动,
description: 可选描述,
slots: [
{startTime: 2026-03-14T14:00:00Z, endTime: 2026-03-14T16:00:00Z},
{startTime: 2026-03-15T14:00:00Z, endTime: 2026-03-15T16:00:00Z}
],
modificationPolicy: EVERYONE
}
请求字段:
| 字段 | 类型 | 必填 | 说明 |
|---|
| title | 字符串 | 是 | 1-255字符 |
| description |
字符串 | 否 | 最大4096字符 |
| slots | 数组 | 是 | 至少1个时间段;每个包含startTime、endTime (ISO 8601),可选时区 |
| modificationPolicy | 字符串 | 否 | EVERYONE 或 ORGANIZER (默认) |
| outputCalendarId | 字符串 | 否 | 用于创建最终活动的日历UUID |
响应:
json
{
id: uuid,
title: 我的活动,
description: 可选描述,
status: PLANNING,
publicUrl: https://whentomeet.io/events/uuid,
slotCount: 2,
createdAt: 2026-03-14T14:00:00Z
}
列出活动
GET /api/v1/events
bash
curl -X GET https://whentomeet.io/api/v1/events?limit=10&offset=0&status=PLANNING \
-H Authorization: Bearer skYOURAPIKEYHERE
查询参数:
| 字段 | 类型 | 必填 | 说明 |
|---|
| limit | 数字 | 否 | 1-100,默认10 |
| offset |
数字 | 否 | 默认0 |
| status | 字符串 | 否 | PLANNING 或 FINALIZED |
响应:
json
[
{
id: uuid,
title: 我的活动,
description: ...,
status: PLANNING,
slotCount: 2,
publicUrl: https://whentomeet.io/events/uuid,
createdAt: 2026-03-14T14:00:00Z
}
]
获取活动详情
GET /api/v1/events/{eventId}
bash
curl -X GET https://whentomeet.io/api/v1/events/{eventId} \
-H Authorization: Bearer skYOURAPIKEYHERE
响应:
json
{
id: uuid,
title: 我的活动,
description: ...,
status: PLANNING,
organizerId: uuid,
createdAt: 2026-03-14T14:00:00Z,
modificationPolicy: EVERYONE,
outputCalendarId: null,
slots: [
{
id: uuid,
eventId: uuid,
startTime: 2026-03-14T14:00:00Z,
endTime: 2026-03-14T16:00:00Z,
availabilities: [
{
id: uuid,
slotId: uuid,
userId: null,
displayName: 张三,
status: available,
user: null
}
]
}
]
}
删除活动
DELETE /api/v1/events/{eventId}
bash
curl -X DELETE https://whentomeet.io/api/v1/events/{eventId} \
-H Authorization: Bearer skYOURAPIKEYHERE
响应:
json
{
success: true
}
其他接口
列出预订
GET /api/v1/bookings
bash
curl -X GET https://whentomeet.io/api/v1/bookings?limit=10&status=confirmed \
-H Authorization: Bearer skYOURAPIKEYHERE
查询参数:
- - limit: 1-100,默认10
- offset: 默认0
- status: confirmed 或 cancelled
列出日历连接
GET /api/v1/calendar/connections
bash
curl -X GET https://whentomeet.io/api/v1/calendar/connections \
-H Authorization: Bearer skYOURAPIKEYHERE
列出所有已连接的日历账户(Google、Microsoft、CalDAV、iCal)。
获取活动统计
GET /api/v1/analytics/events
bash
curl -X GET https://whentomeet.io/api/v1/analytics/events?dateFrom=2026-01-01T00:00:00Z&dateTo=2026-03-13T23:59:59Z \
-H Authorization: Bearer skYOURAPIKEYHERE
查询参数:
- - dateFrom: ISO 8601开始日期(可选,默认为30天前)
- dateTo: ISO 8601结束日期(可选,默认为当前时间)
响应:
json
{
totalEvents: 42,
finalizedEvents: 28,
dateRange: {
from: 2026-01-01T00:00:00Z,
to: 2026-03-13T23:59:59Z
}
}
错误码
| HTTP状态 | 代码 | 说明 |
|---|
| 400 | BAD_REQUEST | 无效输入(查看响应中的zodError获取字段详情) |
| 401 |
UNAUTHORIZED | 缺少或无效的API密钥 |
| 403 | FORBIDDEN | 权限不足或订阅等级不够 |
| 404 | NOT_FOUND | 资源未找到或不属于您 |
| 429 | TOO
MANYREQUESTS | 超出速率限制 |
| 500 | INTERNAL
SERVERERROR | 服务器错误 |
错误响应格式:
json
{
error: {
code: NOT_FOUND,
message: 活动未找到或访问被拒绝
}