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

Header parameters
NameTypeDescription
Idempotency-Keystring

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

Request body fields
NameTypeDescription
titlerequiredstring
startDaterequiredstring

ISO date-time

endDaterequiredstring

ISO date-time

durationnumber

Minutes (optional)

typerequiredstring

Allowed values: Online In person

meetingTypestring

Allowed values: Individual Group

onlineLinkstring

Zoom/Meet URL

addressstring

Physical address

notesstring
traineesstring[]

Array of trainee ids

Maximum items: 500

capacitynumber

For group meetings

Request examples

cURL
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"
}'
JavaScript (fetch)
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

Example body (application/json)
{
  "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)
Response fields
NameTypeDescription
dataobject
data.idstring
data.coachstring
data.titlestring
data.startDatestring<date-time>
data.endDatestring<date-time>
data.durationnumber
data.typestring

Allowed values: Online In person

data.meetingTypestring

Allowed values: Individual Group

data.onlineLinkstring
data.addressstring
data.notesstring
data.statusstring
data.capacitynumber
data.traineesobject[]

Meeting attendees. email and phoneNumber are returned only when the key also has the trainees:read scope.

data.trainees[].idstring
data.trainees[].namestring
data.trainees[].emailstring
data.trainees[].phoneNumberstring
data.createdAtstring<date-time>
warningsobject[]

Non-fatal problems with follow-up writes. The resource was created, but each listed field was not applied.

warnings[].fieldstring
warnings[].messagestring

Error responses

  • 400 Bad Request
  • 401 Unauthorized
  • 403 Forbidden
  • 404 Not Found
  • 409 Conflict
  • 429 Too Many Requests
  • 500 Internal Server Error

These statuses share the same response body.

Example body (application/json)
{
  "error": {
    "code": "<string>",
    "message": "<string>",
    "fix": "<string>",
    "details": {},
    "retryAfterMs": 123
  }
}
Error fields (6)
Error fields
NameTypeDescription
errorobject
error.codestring
error.messagestring
error.fixstring | null
error.detailsobject | null
error.retryAfterMsnumber | null

This page is also available as Markdown. Browse it in the interactive explorer or download the OpenAPI spec.