Skip to content

Meeting Requests

Create and manage meeting scheduling requests via the SkipUp API.

Meeting requests represent scheduling requests that SkipUp coordinates on your behalf. You create a request with an organizer and participants, and SkipUp handles the back-and-forth of finding a time and booking the meeting.

FieldTypeDescription
idstringUnique identifier for the meeting request.
organizer_emailstringEmail address of the meeting organizer.
participant_emailsstring[]Email addresses of all participants.
statusstringCurrent status: active, paused, booked, or cancelled.
titlestring | nullTitle of the meeting.
purposestring | nullDescription of the meeting’s purpose.
descriptionstring | nullFree-text instructions for the AI (e.g. CRM notes, tone guidance).
include_introductionboolean | nullWhether the AI will compose an introduction for the outreach.
duration_minutesinteger | nullRequested meeting duration in minutes.
timeframeobject | nullPreferred scheduling window. Contains start and end ISO 8601 timestamps.
created_atstringISO 8601 timestamp of when the request was created.
updated_atstringISO 8601 timestamp of the last update.
booked_atstring | nullISO 8601 timestamp of when the meeting was booked. Present only for booked requests.
cancelled_atstring | nullISO 8601 timestamp of when the request was cancelled. Present only for cancelled requests.
paused_atstring | nullISO 8601 timestamp of when the request was paused. Present only for paused requests. Cleared to null when the request is resumed.
StatusDescription
activeSkipUp is actively coordinating schedules with participants.
pausedScheduling is temporarily paused. Messages are recorded but not acted on.
bookedA meeting time has been confirmed and calendar invites sent.
cancelledThe request was cancelled before a meeting was booked.
GET /api/v1/meeting_requests

Returns a paginated list of meeting requests in your workspace, sorted by creation date (newest first).

Scope required: meeting_requests.read

ParameterTypeDescription
participant_emailstringFilter by participant email address.
organizer_emailstringFilter by organizer email address.
statusstringFilter by status: active, paused, booked, or cancelled.
created_afterstringISO 8601 timestamp. Only return requests created on or after this time.
created_beforestringISO 8601 timestamp. Only return requests created on or before this time.
limitintegerNumber of results per page. Default 25, max 100.
cursorstringCursor for fetching the next page. Use next_cursor from a previous response.
Terminal window
curl "https://api.skipup.ai/api/v1/meeting_requests?status=active&limit=10" \
-H "Authorization: Bearer $SKIPUP_API_KEY"
{
"data": [
{
"id": "mr_01HQ...",
"organizer_email": "[email protected]",
"participant_emails": ["[email protected]", "[email protected]"],
"status": "active",
"title": "Project kickoff",
"purpose": "Discuss Q2 roadmap",
"duration_minutes": 30,
"timeframe": {
"start": "2025-02-01T00:00:00Z",
"end": "2025-02-14T23:59:59Z"
},
"created_at": "2025-01-20T14:30:00Z",
"updated_at": "2025-01-20T14:30:00Z"
}
],
"meta": {
"limit": 10,
"has_more": true,
"next_cursor": "mr_01HP..."
}
}
GET /api/v1/meeting_requests/:id

Retrieves a single meeting request by ID.

Scope required: meeting_requests.read

Terminal window
curl https://api.skipup.ai/api/v1/meeting_requests/mr_01HQ... \
-H "Authorization: Bearer $SKIPUP_API_KEY"
{
"data": {
"id": "mr_01HQ...",
"organizer_email": "[email protected]",
"participant_emails": ["[email protected]"],
"status": "booked",
"title": "1:1 sync",
"duration_minutes": 30,
"created_at": "2025-01-15T10:00:00Z",
"updated_at": "2025-01-16T09:00:00Z",
"booked_at": "2025-01-16T09:00:00Z"
}
}
POST /api/v1/meeting_requests

Creates a new meeting scheduling request. SkipUp processes the request asynchronously — the response returns immediately with status 202 Accepted while scheduling begins in the background.

Scope required: meeting_requests.write

ParameterTypeRequiredDescription
organizer_emailstringYesEmail address of the meeting organizer.
participant_emailsstring[]ConditionalEmail addresses of participants to schedule with. At least one required. Cannot be combined with participants.
participantsobject[]ConditionalRich participant objects. At least one required. Cannot be combined with participant_emails.
participants[].emailstringYesParticipant email address.
participants[].namestringNoParticipant full name. Backfills the name on the person record if not already set.
participants[].timezonestringNoIANA timezone (e.g. America/Los_Angeles). Stored as a preference for automatic pickup by the AI.
organizer_namestringNoOrganizer’s full name. Backfills the name if not already set.
organizer_timezonestringNoIANA timezone for the organizer (e.g. America/New_York). Stored as a preference for automatic pickup by the AI.
include_introductionbooleanNoWhen true, the AI composes a warm introduction explaining who is requesting the meeting and why. Defaults to false.
contextobjectNoAdditional context for the meeting.
context.titlestringNoTitle for the meeting.
context.purposestringNoDescription of why the meeting is needed.
context.descriptionstringNoFree-text instructions for the AI. Use this for CRM notes, tone guidance, or personalization hints.
context.duration_minutesintegerNoDesired meeting duration in minutes.
context.timeframeobjectNoPreferred scheduling window.
context.timeframe.startstringNoISO 8601 start of the scheduling window.
context.timeframe.endstringNoISO 8601 end of the scheduling window.
Terminal window
curl -X POST https://api.skipup.ai/api/v1/meeting_requests \
-H "Authorization: Bearer $SKIPUP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"organizer_email": "[email protected]",
"organizer_name": "Alice Chen",
"organizer_timezone": "America/New_York",
"participants": [
{"email": "[email protected]", "name": "Bob Lee", "timezone": "America/Chicago"},
{"email": "[email protected]"}
],
"include_introduction": true,
"context": {
"title": "Project kickoff",
"purpose": "Discuss Q2 roadmap and assign workstreams",
"description": "Meeting with the RevOps team. Keep tone friendly and concise.",
"duration_minutes": 45,
"timeframe": {
"start": "2025-02-01T00:00:00Z",
"end": "2025-02-14T23:59:59Z"
}
}
}'

You can also use flat participant_emails instead of participants:

Terminal window
curl -X POST https://api.skipup.ai/api/v1/meeting_requests \
-H "Authorization: Bearer $SKIPUP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"organizer_email": "[email protected]",
"participant_emails": ["[email protected]", "[email protected]"],
"context": {
"title": "Project kickoff",
"purpose": "Discuss Q2 roadmap and assign workstreams",
"duration_minutes": 45
}
}'
{
"data": {
"id": "mr_01HQ...",
"organizer_email": "[email protected]",
"participant_emails": ["[email protected]", "[email protected]"],
"status": "active",
"title": "Project kickoff",
"purpose": "Discuss Q2 roadmap and assign workstreams",
"description": "Meeting with the RevOps team. Keep tone friendly and concise.",
"include_introduction": true,
"duration_minutes": 45,
"timeframe": {
"start": "2025-02-01T00:00:00Z",
"end": "2025-02-14T23:59:59Z"
},
"created_at": "2025-01-20T14:30:00Z",
"updated_at": "2025-01-20T14:30:00Z"
}
}

The create endpoint supports idempotency keys. Pass an Idempotency-Key header with a unique value (such as a UUID) to safely retry requests without creating duplicate meeting requests. Cached responses are stored for 24 hours.

Terminal window
curl -X POST https://api.skipup.ai/api/v1/meeting_requests \
-H "Authorization: Bearer $SKIPUP_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000" \
-d '{
"organizer_email": "[email protected]",
"participant_emails": ["[email protected]"]
}'
POST /api/v1/meeting_requests/:id/cancel

Cancels a meeting request. Only requests with status active or paused can be cancelled.

Scope required: meeting_requests.write

ParameterTypeRequiredDefaultDescription
notifybooleanNofalseWhether to send cancellation notifications to participants.
Terminal window
curl -X POST https://api.skipup.ai/api/v1/meeting_requests/mr_01HQ.../cancel \
-H "Authorization: Bearer $SKIPUP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"notify": true}'
{
"data": {
"id": "mr_01HQ...",
"organizer_email": "[email protected]",
"participant_emails": ["[email protected]"],
"status": "cancelled",
"created_at": "2025-01-20T14:30:00Z",
"updated_at": "2025-01-21T10:00:00Z",
"cancelled_at": "2025-01-21T10:00:00Z"
}
}
StatusTypeDescription
422invalid_requestThe request is not in active or paused status and cannot be cancelled.
POST /api/v1/meeting_requests/:id/pause

Pauses an active meeting request. While paused, SkipUp stops processing messages and sending follow-ups on this conversation. Incoming messages are still recorded but not acted on. Only requests with status active can be paused.

Scope required: meeting_requests.write

No request body is required.

Terminal window
curl -X POST https://api.skipup.ai/api/v1/meeting_requests/mr_01HQ.../pause \
-H "Authorization: Bearer $SKIPUP_API_KEY"
{
"data": {
"id": "mr_01HQ...",
"organizer_email": "[email protected]",
"participant_emails": ["[email protected]"],
"status": "paused",
"title": "Project kickoff",
"purpose": "Discuss Q2 roadmap",
"duration_minutes": 30,
"timeframe": {
"start": "2025-02-01T00:00:00Z",
"end": "2025-02-14T23:59:59Z"
},
"created_at": "2025-01-20T14:30:00Z",
"updated_at": "2025-01-22T09:00:00Z",
"paused_at": "2025-01-22T09:00:00Z",
"booked_at": null,
"cancelled_at": null
}
}
StatusTypeDescription
422invalid_requestThe request is not in active status. Returns a message indicating the current status (e.g. “Cannot pause a request that is already paused”).
POST /api/v1/meeting_requests/:id/resume

Resumes a paused meeting request. SkipUp returns the request to active status and picks up scheduling where it left off, including reviewing any messages that arrived while the request was paused. Only requests with status paused can be resumed.

Scope required: meeting_requests.write

No request body is required.

Terminal window
curl -X POST https://api.skipup.ai/api/v1/meeting_requests/mr_01HQ.../resume \
-H "Authorization: Bearer $SKIPUP_API_KEY"
{
"data": {
"id": "mr_01HQ...",
"organizer_email": "[email protected]",
"participant_emails": ["[email protected]"],
"status": "active",
"title": "Project kickoff",
"paused_at": null,
"created_at": "2025-01-20T14:30:00Z",
"updated_at": "2025-01-23T11:00:00Z"
}
}
StatusTypeDescription
422invalid_requestThe request is not in paused status (e.g. “Cannot resume a request that is not paused”).
POST /api/v1/meeting_requests/:id/change_organizer

Changes the organizer of an active meeting request.

Scope required: meeting_requests.write

ParameterTypeRequiredDescription
new_organizer_emailstringYesEmail address of the new organizer.
Terminal window
curl -X POST https://api.skipup.ai/api/v1/meeting_requests/mr_01HQ.../change_organizer \
-H "Authorization: Bearer $SKIPUP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"new_organizer_email": "[email protected]"}'
{
"data": {
"id": "mr_01HQ...",
"organizer_email": "[email protected]",
"participant_emails": ["[email protected]"],
"status": "active",
"created_at": "2025-01-20T14:30:00Z",
"updated_at": "2025-01-21T11:00:00Z"
}
}
StatusTypeDescription
422invalid_requestThe request is not in active status.
422validation_errorThe new organizer email is invalid or cannot be assigned.
POST /api/v1/meeting_requests/:id/context

Updates the scheduling context of an active meeting request. You can update any combination of context fields. Only the fields you provide are updated.

Scope required: meeting_requests.write

ParameterTypeRequiredDescription
titlestringNoUpdated meeting title.
purposestringNoUpdated meeting purpose.
descriptionstringNoUpdated free-text instructions for the AI.
duration_minutesintegerNoUpdated meeting duration in minutes.
timeframeobjectNoUpdated scheduling window.
timeframe.startstringNoISO 8601 start of the scheduling window.
timeframe.endstringNoISO 8601 end of the scheduling window.
Terminal window
curl -X POST https://api.skipup.ai/api/v1/meeting_requests/mr_01HQ.../context \
-H "Authorization: Bearer $SKIPUP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Updated kickoff meeting",
"description": "Carol is joining from the London office — suggest afternoon slots.",
"duration_minutes": 60,
"timeframe": {
"start": "2025-02-10T00:00:00Z",
"end": "2025-02-21T23:59:59Z"
}
}'
{
"data": {
"id": "mr_01HQ...",
"organizer_email": "[email protected]",
"participant_emails": ["[email protected]", "[email protected]"],
"status": "active",
"title": "Updated kickoff meeting",
"purpose": "Discuss Q2 roadmap and assign workstreams",
"description": "Carol is joining from the London office — suggest afternoon slots.",
"duration_minutes": 60,
"timeframe": {
"start": "2025-02-10T00:00:00Z",
"end": "2025-02-21T23:59:59Z"
},
"created_at": "2025-01-20T14:30:00Z",
"updated_at": "2025-01-22T08:00:00Z"
}
}
StatusTypeDescription
422invalid_requestThe request is not in active status.