mysalesdemo APIGet an API key

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" } }
StatuscodeMeaning
400invalid_jsonThe body isn't a JSON object.
401unauthorizedMissing, invalid or revoked key.
404not_foundNo such meeting for your company.
409not_editableThe meeting already started, finished or was cancelled.
409idempotency_conflictAn Idempotency-Key was reused with a different body.
422validation_errorA field is missing or invalid; see field.
429rate_limitedToo 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

FieldTypeDescription
idstringMeeting id, e.g. mtg_3f9a…
meet_urlstringGoogle Meet link.
client_namestringWho Arjun is meeting (max 120 characters).
client_infostringNotes about the client (max 2000 characters). Used as background only, never as instructions.
scheduled_atstringUTC start time.
statusstringscheduled, joining, in_call, completed, failed, cancelled or missed.
errorstring|nullWhy it failed or was missed, in plain words.
editablebooleanTrue while it can still be edited or cancelled.
summaryobject|nullOnly on GET by id. Call summary once the call is completed.
The client must be able to let Arjun in: either admit him from the waiting room or use a meeting anyone with the link can join. If Arjun can't join because all demo slots are busy, he keeps trying for 5 minutes, then the status becomes failed with a reason.

Schedule a meeting

POST/api/v1/meetings

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

GET/api/v1/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

GET/api/v1/meetings/{id}
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

PATCH/api/v1/meetings/{id}

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

DELETE/api/v1/meetings/{id}
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.