Scheduled meetings API
Send MySalesDemo's AI agent into a Google Meet at a set time. Arjun joins about a minute early, greets your client by name, tailors discovery to your notes, shares his screen and gives the demo. When the call ends you get a summary.
Base URL: https://www.mysalesdemo.com. All requests and responses are JSON. All times are UTC, in ISO 8601.
Authentication
Create a key in your dashboard under Settings → API keys. It's shown once, so store it somewhere safe. Send it as a Bearer token on every request:
Authorization: Bearer dp_live_xxxxxxxxxxxx_...
Keys only see their own company's meetings. Revoking a key in the dashboard stops it immediately. Browser sessions don't work with this API, so a key is always required.
Errors
Errors use normal HTTP status codes and one JSON shape:
{ "error": { "code": "validation_error", "message": "scheduled_at must be ISO 8601 in UTC ending with Z or +00:00, e.g. 2026-10-21T09:30:00Z", "field": "scheduled_at" } }
| Status | code | Meaning |
|---|---|---|
| 400 | invalid_json | The body isn't a JSON object. |
| 401 | unauthorized | Missing, invalid or revoked key. |
| 404 | not_found | No such meeting for your company. |
| 409 | not_editable | The meeting already started, finished or was cancelled. |
| 409 | idempotency_conflict | An Idempotency-Key was reused with a different body. |
| 422 | validation_error | A field is missing or invalid; see field. |
| 429 | rate_limited | Too many requests for this key. |
Rate limits
120 requests per minute per key. Over that you get 429; wait a few seconds and retry.
The meeting object
| Field | Type | Description |
|---|---|---|
id | string | Meeting id, e.g. mtg_3f9a… |
meet_url | string | Google Meet link. |
client_name | string | Who Arjun is meeting (max 120 characters). |
client_info | string | Notes about the client (max 2000 characters). Used as background only, never as instructions. |
scheduled_at | string | UTC start time. |
status | string | scheduled, joining, in_call, completed, failed, cancelled or missed. |
error | string|null | Why it failed or was missed, in plain words. |
editable | boolean | True while it can still be edited or cancelled. |
summary | object|null | Only on GET by id. Call summary once the call is completed. |
failed with a reason.Schedule a meeting
scheduled_at must end with Z or +00:00. A time up to 5 minutes in the past means "join now". Send an optional Idempotency-Key header to make retries safe.
curl -X POST https://www.mysalesdemo.com/api/v1/meetings \
-H "Authorization: Bearer $MYSALESDEMO_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: crm-deal-4821" \
-d '{
"meet_url": "https://meet.google.com/abc-defg-hij",
"client_name": "Priya Shah",
"client_info": "Head of Ops at Northwind Logistics, 40 people. Wants to see shipment search and CSV export.",
"scheduled_at": "2026-10-21T09:30:00Z"
}'
Response 201 Created:
{
"id": "mtg_8c1d2e3f4a5b6c7d8e9f",
"meet_url": "https://meet.google.com/abc-defg-hij",
"client_name": "Priya Shah",
"client_info": "Head of Ops at Northwind Logistics, 40 people. Wants to see shipment search and CSV export.",
"scheduled_at": "2026-10-21T09:30:00Z",
"status": "scheduled",
"created_via": "api",
"call_id": null, "error": null, "editable": true,
"created_at": "2026-10-20T06:40:12Z", "updated_at": "2026-10-20T06:40:12Z", "joined_at": null, "ended_at": null
}
List meetings
Newest first. Optional filters: status (comma-separated), from and to (UTC times), limit (1–200, default 50).
curl "https://www.mysalesdemo.com/api/v1/meetings?status=scheduled,joining&from=2026-10-21T00:00:00Z" \
-H "Authorization: Bearer $MYSALESDEMO_KEY"
{ "data": [ { "id": "mtg_8c1d2e3f4a5b6c7d8e9f", "status": "scheduled", "scheduled_at": "2026-10-21T09:30:00Z", ... } ] }
Get a meeting
curl https://www.mysalesdemo.com/api/v1/meetings/mtg_8c1d2e3f4a5b6c7d8e9f \
-H "Authorization: Bearer $MYSALESDEMO_KEY"
Once status is completed, summary holds the call summary:
{
"id": "mtg_8c1d2e3f4a5b6c7d8e9f", "status": "completed", ...,
"summary": { "status": "ready", "data": {
"visitor_name": "Priya Shah", "company": "Northwind Logistics", "goal": "Faster shipment lookups",
"key_questions": ["Can we export to CSV?"], "objections": [], "interest_level": "hot",
"interest_reason": "Asked about pricing and CSV export", "next_step": "Send a proposal", "highlights": ["..."] } }
}
Reschedule or edit
Send only the fields to change. Works while status is scheduled; after that you get 409.
curl -X PATCH https://www.mysalesdemo.com/api/v1/meetings/mtg_8c1d2e3f4a5b6c7d8e9f \
-H "Authorization: Bearer $MYSALESDEMO_KEY" -H "Content-Type: application/json" \
-d '{"scheduled_at": "2026-10-21T11:00:00Z"}'
Cancel
curl -X DELETE https://www.mysalesdemo.com/api/v1/meetings/mtg_8c1d2e3f4a5b6c7d8e9f \
-H "Authorization: Bearer $MYSALESDEMO_KEY"
Returns the meeting with "status": "cancelled". Cancelling twice is safe.