Schedule a meeting
POST/api/public/meetings
Schedule a meeting. "type" is the location (Online or In person). "meetingType" is the format (Individual or Group).
Authentication
Requires an API key, sent as Authorization: Bearer cp_live_....
API keys carry scopes. Get the catalog of scopes and webhook events lists every scope.
Header parameters
| Name | Type | Description |
|---|---|---|
Idempotency-Key | string | Optional. Send a unique key (e.g. a UUID) to make this POST safe to retry. The same key within 24h returns the original result instead of creating a duplicate. |
Request body
application/json, required
| Name | Type | Description |
|---|---|---|
titlerequired | string | |
startDaterequired | string | ISO date-time |
endDaterequired | string | ISO date-time |
duration | number | Minutes (optional) |
typerequired | string | |
meetingType | string | |
onlineLink | string | Zoom/Meet URL |
address | string | Physical address |
notes | string | |
trainees | string[] | Array of trainee ids |
capacity | number | For group meetings |
Request examples
curl --request POST \
--url 'https://api.coach-platform.com/api/public/meetings' \
--header 'Authorization: Bearer cp_live_...' \
--header 'Content-Type: application/json' \
--data '{
"title": "<string>",
"startDate": "<string>",
"endDate": "<string>",
"type": "Online"
}'const response = await fetch('https://api.coach-platform.com/api/public/meetings', {
method: 'POST',
headers: {
Authorization: 'Bearer cp_live_...',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"title": "<string>",
"startDate": "<string>",
"endDate": "<string>",
"type": "Online"
}),
});
const data = await response.json();Responses
201 Created
{
"data": {
"id": "<string>",
"coach": "<string>",
"title": "<string>",
"startDate": "<date-time>",
"endDate": "<date-time>",
"duration": 123,
"type": "Online",
"meetingType": "Individual",
"onlineLink": "<string>",
"address": "<string>",
"notes": "<string>",
"status": "<string>",
"capacity": 123,
"trainees": [
{
"id": "<string>",
"name": "<string>",
"email": "<string>",
"phoneNumber": "<string>"
}
],
"createdAt": "<date-time>"
},
"warnings": [
{
"field": "<string>",
"message": "<string>"
}
]
}Response fields (23)
| Name | Type | Description |
|---|---|---|
data | object | |
data.id | string | |
data.coach | string | |
data.title | string | |
data.startDate | string<date-time> | |
data.endDate | string<date-time> | |
data.duration | number | |
data.type | string | |
data.meetingType | string | |
data.onlineLink | string | |
data.address | string | |
data.notes | string | |
data.status | string | |
data.capacity | number | |
data.trainees | object[] | Meeting attendees. email and phoneNumber are returned only when the key also has the trainees:read scope. |
data.trainees[].id | string | |
data.trainees[].name | string | |
data.trainees[].email | string | |
data.trainees[].phoneNumber | string | |
data.createdAt | string<date-time> | |
warnings | object[] | Non-fatal problems with follow-up writes. The resource was created, but each listed field was not applied. |
warnings[].field | string | |
warnings[].message | string |
Error responses
400Bad Request401Unauthorized403Forbidden404Not Found409Conflict429Too Many Requests500Internal Server Error
These statuses share the same response body.
{
"error": {
"code": "<string>",
"message": "<string>",
"fix": "<string>",
"details": {},
"retryAfterMs": 123
}
}Error fields (6)
| Name | Type | Description |
|---|---|---|
error | object | |
error.code | string | |
error.message | string | |
error.fix | string | null | |
error.details | object | null | |
error.retryAfterMs | number | null |
More Meetings endpoints
This page is also available as Markdown. Browse it in the interactive explorer or download the OpenAPI spec.