Developer REST API Reference
Page Guide

The keys to the scheduling kingdom! Explore live endpoints, test requests right in your browser, copy cURL and Python snippets, and build custom automated workflows with our REST API:

Credentials (Playground) Enter your Client ID & Client Secret (from My Connected Apps) to test endpoints live in your browser with real-time response latency.
Table of Contents (TOC) Browse resources alphabetically (Attendees, Contacts, Polls, QuickPolls), inspect color-coded HTTP method badges, or use the search bar to filter endpoints instantly.
Endpoint Details & Try-It Review path/query/body parameters (* indicates required), copy ready-to-use cURL or Python snippets, test requests live with instant latency & JSON inspector, or download the Postman collection.

Interactive API Playground Credentials

Credentials Not Set
Need credentials? Generate them on My Connected Apps.
Safe Simulation Mode Active: Modifying requests (POST, PATCH, DELETE) run in a safe sandbox simulator—returning realistic responses without altering or deleting your production database records.

Authentication & Platform Standards

The CoordinateWith.Me REST API is built on predictable HTTP and JSON conventions. Every endpoint returns standard HTTP status codes and JSON payloads.

Base API URL

https://coordinatewith.me/api/v1

Authentication Methods

Authenticated endpoints support HTTP Basic Auth, Bearer Token Auth, or Custom Headers:

  • HTTP Basic Auth: Authorization: Basic base64(CLIENT_ID:CLIENT_SECRET)
  • Custom Headers: X-Client-Id: cwm_live_... and X-Client-Secret: ...
  • Bearer Token: Authorization: Bearer CLIENT_ID:CLIENT_SECRET

Rate Limits & Error Handling

API clients are limited to 120 requests per minute. If exceeded, the server returns 429 Too Many Requests with a Retry-After: 60 header.

POST /api/v1/polls/:id/attendees Client ID & Secret Required

Add Attendee to Poll

Add an attendee by email address and name to an existing active scheduling poll.

Path Parameters

ParameterTypeDescription
id * integer Meeting Poll ID.

Request Body Parameters

FieldTypeDescription
email * string Invitee email address.
name string Invitee display name.
role string Attendance expectation: Required (default) or Optional.
curl -X POST https://coordinatewith.me/api/v1/polls/101/attendees \
  -H "X-Client-Id: $CWM_CLIENT_ID" \
  -H "X-Client-Secret: $CWM_CLIENT_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "teammate@example.com",
    "name": "Jordan Smith",
    "role": "Required"
  }'
DEL /api/v1/polls/:id/attendees/:attendee_id Client ID & Secret Required

Remove Attendee from Poll

Remove an attendee from a poll by their attendee ID.

Path Parameters

ParameterTypeDescription
id * integer Meeting Poll ID.
attendee_id * integer Unique attendee ID to remove.
curl -X DELETE https://coordinatewith.me/api/v1/polls/101/attendees/245 \
  -H "X-Client-Id: $CWM_CLIENT_ID" \
  -H "X-Client-Secret: $CWM_CLIENT_SECRET"
GET /api/v1/contacts Client ID & Secret Required

List / Search Contacts

List all address book contacts or filter contacts matching a search query string.

Query Parameters

ParameterTypeDescription
search string Optional query to filter by name, email, or phone number.
curl -u "$CWM_CLIENT_ID:$CWM_CLIENT_SECRET" \
  "https://coordinatewith.me/api/v1/contacts?search="
POST /api/v1/contacts Client ID & Secret Required

Create Contact

Add a new person to your address book, including optional home and work addresses.

Request Body Parameters

FieldTypeDescription
email *stringUnique email address for the contact.
first_namestringContact first name.
last_namestringContact last name.
phone_numberstringPrimary phone number.
home_street_addressstringHome street address.
home_citystringHome city name.
home_statestringHome state abbreviation (e.g. TX, NY).
curl -X POST https://coordinatewith.me/api/v1/contacts \
  -H "X-Client-Id: $CWM_CLIENT_ID" \
  -H "X-Client-Secret: $CWM_CLIENT_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "first_name": "Taylor",
    "last_name": "Swift",
    "email": "taylor@example.com",
    "phone_number": "(615) 555-0100",
    "home_city": "Nashville",
    "home_state": "TN"
  }'
GET /api/v1/contacts/:id Client ID & Secret Required

Get Contact Details

Retrieve contact information, including home and work addresses.

Path Parameters

ParameterTypeDescription
id *integerContact ID.
curl -u "$CWM_CLIENT_ID:$CWM_CLIENT_SECRET" \
  https://coordinatewith.me/api/v1/contacts/45
PATCH /api/v1/contacts/:id Client ID & Secret Required

Update Contact

Update an existing contact's phone number, name, email, or address fields.

Path Parameters

ParameterTypeDescription
id *integerContact ID.
curl -X PATCH https://coordinatewith.me/api/v1/contacts/45 \
  -H "X-Client-Id: $CWM_CLIENT_ID" \
  -H "X-Client-Secret: $CWM_CLIENT_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "phone_number": "(615) 555-9999",
    "work_city": "New York",
    "work_state": "NY"
  }'
DEL /api/v1/contacts/:id Client ID & Secret Required

Delete Contact

Remove a contact from your private address book.

Path Parameters

ParameterTypeDescription
id *integerContact ID.
curl -X DELETE https://coordinatewith.me/api/v1/contacts/45 \
  -H "X-Client-Id: $CWM_CLIENT_ID" \
  -H "X-Client-Secret: $CWM_CLIENT_SECRET"
GET /api/v1/health Public Endpoint

Health Check

Verify platform service status, API version, and system timestamp without requiring authentication.

curl https://coordinatewith.me/api/v1/health
GET /api/v1/me Client ID & Secret Required

Get Profile (Me)

Retrieve the profile of the authenticated user, client ID, and authorized permission scopes.

curl -u "$CWM_CLIENT_ID:$CWM_CLIENT_SECRET" \
  https://coordinatewith.me/api/v1/me
GET /api/v1/polls Client ID & Secret Required

List Polls

List scheduling polls organized by or visible to the authenticated user.

Query Parameters

ParameterTypeDescription
statusstringFilter by status: In Progress, Locked, Cancelled.
limitintegerMax results to return (default 50, max 100).
offsetintegerPagination offset (default 0).
include_archivedbooleanSet to true to include archived polls.
curl -u "$CWM_CLIENT_ID:$CWM_CLIENT_SECRET" \
  "https://coordinatewith.me/api/v1/polls?status=In%20Progress&limit=20"
POST /api/v1/polls Client ID & Secret Required

Create Scheduling Poll

Create a multi-option scheduling poll proposing specific time windows, venues, and inviting participants.

Request Body Parameters

FieldTypeDescription
title *stringPoll title.
descriptionstringOptional agenda or instructions.
time_slots *arrayArray of objects containing start_time, end_time, and timezone.
locationsarrayArray of location objects with name and city.
inviteesarrayArray of invitee objects with email, name, and role.
curl -X POST https://coordinatewith.me/api/v1/polls \
  -H "X-Client-Id: $CWM_CLIENT_ID" \
  -H "X-Client-Secret: $CWM_CLIENT_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Executive Strategy Sync",
    "description": "Quarterly leadership planning.",
    "time_slots": [
      {
        "start_time": "2026-10-15T09:00:00",
        "end_time": "2026-10-15T10:00:00",
        "timezone": "America/New_York"
      }
    ]
  }'
GET /api/v1/polls/:id Client ID & Secret Required

Get Poll Details

Retrieve comprehensive poll details, time slots, proposed venues, attendee responses, and ranked votes.

Path Parameters

ParameterTypeDescription
id *integerMeeting Poll ID.
curl -u "$CWM_CLIENT_ID:$CWM_CLIENT_SECRET" \
  https://coordinatewith.me/api/v1/polls/101
PATCH /api/v1/polls/:id Client ID & Secret Required

Update Poll

Update a poll's title, description, or status (e.g. Cancelled).

Path Parameters

ParameterTypeDescription
id *integerMeeting Poll ID.
curl -X PATCH https://coordinatewith.me/api/v1/polls/101 \
  -H "X-Client-Id: $CWM_CLIENT_ID" \
  -H "X-Client-Secret: $CWM_CLIENT_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"title": "Updated Strategy Sync", "status": "Cancelled"}'
POST /api/v1/polls/:id/finalize Client ID & Secret Required

Finalize Poll

Lock the poll to the winning time slot and location, send calendar invites, and automatically clean up unused tentative calendar holds.

Path Parameters

ParameterTypeDescription
id *integerMeeting Poll ID.
curl -X POST https://coordinatewith.me/api/v1/polls/101/finalize \
  -H "X-Client-Id: $CWM_CLIENT_ID" \
  -H "X-Client-Secret: $CWM_CLIENT_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"winning_time_id": 1, "winning_location_id": 1}'
GET /api/v1/quickpolls Client ID & Secret Required

List QuickPolls

List all lightweight quick polls created by the authenticated user.

curl -u "$CWM_CLIENT_ID:$CWM_CLIENT_SECRET" \
  https://coordinatewith.me/api/v1/quickpolls
POST /api/v1/quickpolls Client ID & Secret Required

Create QuickPoll

Create a rapid voting poll and receive public shareable voting links.

Request Body Parameters

FieldTypeDescription
title *stringQuick poll title.
time_slots *array<string>List of ISO datetime strings for proposed options.
duration_minutesintegerDuration in minutes (e.g. 30).
curl -X POST https://coordinatewith.me/api/v1/quickpolls \
  -H "X-Client-Id: $CWM_CLIENT_ID" \
  -H "X-Client-Secret: $CWM_CLIENT_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Quick Team Coffee Sync",
    "duration_minutes": 30,
    "time_slots": [
      "2026-10-16T10:00:00",
      "2026-10-16T11:00:00"
    ]
  }'
GET /api/v1/quickpolls/:id Client ID & Secret Required

Get QuickPoll Details

Retrieve quick poll results, option votes, and participant ranked choices.

Path Parameters

ParameterTypeDescription
id *integerQuickPoll ID.
curl -u "$CWM_CLIENT_ID:$CWM_CLIENT_SECRET" \
  https://coordinatewith.me/api/v1/quickpolls/12
Status: -- -- ms

                                
GET /api/v1/invitations Client ID & Secret Required

List Invitations

List scheduling polls and meeting requests that the authenticated user has been invited to as a participant.

Query Parameters

ParameterTypeDescription
statusstringFilter by meeting status: Voting, Locked, Cancelled, or all (default: all).
has_votedstringFilter by whether you have submitted your vote: true, false, or all (default: all).
limitintegerMaximum results to return (default 20, max 100).
offsetintegerPagination offset (default 0).
curl -u "$CWM_CLIENT_ID:$CWM_CLIENT_SECRET" \
  "https://coordinatewith.me/api/v1/invitations?status=Voting&limit=20"
import requests
resp = requests.get("https://coordinatewith.me/api/v1/invitations", auth=(CLIENT_ID, CLIENT_SECRET), params={"status": "Voting", "limit": 20})
print(resp.json())
{
  "status": "success",
  "data": {
    "total": 1,
    "limit": 20,
    "offset": 0,
    "invitations": [
      {
        "meeting_id": 101,
        "title": "Product Architecture Alignment",
        "description": "Align on Q4 backend architecture and API specifications.",
        "duration_minutes": 45,
        "status": "Voting",
        "rsvp_by_date": "2026-10-15T23:59:59Z",
        "is_past": false,
        "organizer": {
          "id": 14,
          "name": "Sarah Connor",
          "email": "sarah@example.com"
        },
        "my_response": {
          "attendee_id": 205,
          "role": "Required",
          "has_voted": false,
          "none_work": false,
          "note": ""
        },
        "proposed_times_count": 3,
        "proposed_locations_count": 2,
        "created_at": "2026-10-01T14:30:00Z",
        "final_time": null,
        "final_location": null
      }
    ]
  }
}
Status: -- -- ms

                                
GET /api/v1/invitations/:id Client ID & Secret Required

Get Invitation Details

Retrieve in-depth details of a meeting you have been invited to, including proposed times (UTC & localized), proposed locations, organizer notes, and your voting response.

Path Parameters

ParameterTypeDescription
id *integerUnique ID of the meeting/poll.
curl -u "$CWM_CLIENT_ID:$CWM_CLIENT_SECRET" \
  "https://coordinatewith.me/api/v1/invitations/101"
import requests
resp = requests.get("https://coordinatewith.me/api/v1/invitations/101", auth=(CLIENT_ID, CLIENT_SECRET))
print(resp.json())
{
  "status": "success",
  "data": {
    "meeting_id": 101,
    "title": "Product Architecture Alignment",
    "description": "Align on Q4 backend architecture and API specifications.",
    "duration_minutes": 45,
    "status": "Voting",
    "rsvp_by_date": "2026-10-15T23:59:59Z",
    "is_past": false,
    "allow_write_in_location": true,
    "allow_suggested_times": true,
    "allow_others_see_responses": true,
    "organizer": {
      "id": 14,
      "name": "Sarah Connor",
      "email": "sarah@example.com"
    },
    "my_response": {
      "attendee_id": 205,
      "role": "Required",
      "has_voted": false,
      "none_work": false,
      "note": "",
      "time_votes": [],
      "location_votes": [],
      "suggested_times": []
    },
    "proposed_times": [
      {
        "id": 501,
        "start_time": "2026-10-16T15:00:00Z",
        "end_time": "2026-10-16T15:45:00Z",
        "start_time_local": "2026-10-16T09:00:00-06:00",
        "end_time_local": "2026-10-16T09:45:00-06:00",
        "formatted_local": "Friday, Oct 16, 2026 at 09:00 AM MDT",
        "timezone": "America/Denver",
        "my_preference": null,
        "votes_count": 2
      }
    ],
    "proposed_locations": [
      {
        "id": 301,
        "name": "Google Meet",
        "location_type": "virtual",
        "online_url": "https://meet.google.com/abc-defg-hij",
        "is_write_in": false,
        "is_sponsored": false,
        "my_preference": null
      }
    ],
    "final_time": null,
    "final_location": null,
    "created_at": "2026-10-01T14:30:00Z"
  }
}
Status: -- -- ms

                                
POST /api/v1/invitations/:id/vote Client ID & Secret Required

Respond to Invitation (Vote)

Submit or update your ranked time/location preferences, indicate that none of the proposed times work, and provide feedback notes or alternative suggested times. Can also be called via convenience alias POST /api/v1/polls/:id/vote.

Path Parameters

ParameterTypeDescription
id *integerUnique ID of the meeting/poll.

JSON Body Fields

FieldTypeDescription
time_votesarray<int>Ranked list of proposed time slot IDs in order of preference (e.g. [501, 502]). Required unless none_work is true.
location_votesarray<int>Optional ranked list of proposed location IDs in order of preference.
none_workbooleanSet to true if none of the proposed times work for you. Defaults to false.
notestringOptional comment or feedback note sent to the organizer.
write_in_locationstring | objectOptional write-in location name or address object (if write-ins are permitted).
suggested_timesarray<string>Optional alternative ISO date/time strings if none_work is true and suggested times are enabled.
curl -X POST -u "$CWM_CLIENT_ID:$CWM_CLIENT_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "time_votes": [501, 502],
    "location_votes": [301],
    "none_work": false,
    "note": "Available all morning!"
  }' \
  "https://coordinatewith.me/api/v1/invitations/101/vote"
import requests
payload = {
    "time_votes": [501, 502],
    "location_votes": [301],
    "none_work": False,
    "note": "Available all morning!"
}
resp = requests.post("https://coordinatewith.me/api/v1/invitations/101/vote", auth=(CLIENT_ID, CLIENT_SECRET), json=payload)
print(resp.json())
{
  "status": "success",
  "message": "Preferences submitted successfully.",
  "data": {
    "meeting_id": 101,
    "has_voted": true,
    "none_work": false,
    "note": "Available all morning!",
    "time_votes": [
      {"time_id": 501, "preference_order": 1},
      {"time_id": 502, "preference_order": 2}
    ],
    "location_votes": [
      {"location_id": 301, "preference_order": 1}
    ],
    "suggested_times": []
  }
}
Status: -- -- ms

                                

Webhooks & Real-Time Event Dispatch

Webhooks allow your applications, AI assistants, and backend systems to receive real-time HTTP POST notifications whenever an event occurs on CoordinateWith.Me—such as when you are invited to a new meeting (invitation.created).

Supported Event Types

  • invitation.created: Dispatched immediately when an organizer creates a poll or adds you as an attendee. Includes proposed times, locations, and direct voting URLs.
  • webhook.test: Dispatched when sending a test ping to verify endpoint connectivity.

HMAC-SHA256 Signature Verification

Every outgoing webhook POST request contains the X-CWM-Signature header in the format: t={timestamp},v1={hex_signature}, alongside X-CWM-Event and X-CWM-Delivery. The signature is computed using HMAC-SHA256 over {timestamp}.{raw_body} using your webhook secret.

# Python Webhook Verification Example
import hmac
import hashlib
import time

def verify_webhook(raw_body: bytes, sig_header: str, secret: str, tolerance: int = 300) -> bool:
    parts = dict(item.split('=', 1) for item in sig_header.split(',') if '=' in item)
    timestamp = int(parts.get('t', 0))
    expected_sig = parts.get('v1', '')
    
    if abs(time.time() - timestamp) > tolerance:
        return False  # Replay attack prevention
        
    signed_payload = f"{timestamp}.".encode('utf-8') + raw_body
    computed_sig = hmac.new(secret.encode('utf-8'), signed_payload, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected_sig, computed_sig)
GET /api/v1/webhooks

List Webhooks

Retrieve all registered webhook subscriptions for the authenticated user or API client.

curl -X GET "https://coordinatewith.me/api/v1/webhooks" \
  -H "X-Client-Id: YOUR_CLIENT_ID" \
  -H "X-Client-Secret: YOUR_CLIENT_SECRET"
import requests

res = requests.get(
    "https://coordinatewith.me/api/v1/webhooks",
    headers={
        "X-Client-Id": "YOUR_CLIENT_ID",
        "X-Client-Secret": "YOUR_CLIENT_SECRET"
    }
)
print(res.json())
{
  "status": "success",
  "data": {
    "total": 1,
    "webhooks": [
      {
        "id": 1,
        "target_url": "https://api.yourdomain.com/webhooks/cwm",
        "description": "AI Assistant Webhook",
        "events": ["invitation.created"],
        "is_active": true,
        "failure_count": 0,
        "last_triggered_at": "2026-09-19T13:00:00Z",
        "last_status_code": 200,
        "created_at": "2026-09-19T12:00:00Z"
      }
    ]
  }
}
Status: -- -- ms

                            
POST /api/v1/webhooks

Register Webhook

Register a new HTTP callback URL and generate a unique HMAC-SHA256 signing secret.

curl -X POST "https://coordinatewith.me/api/v1/webhooks" \
  -H "Content-Type: application/json" \
  -H "X-Client-Id: YOUR_CLIENT_ID" \
  -H "X-Client-Secret: YOUR_CLIENT_SECRET" \
  -d '{
    "target_url": "https://api.yourdomain.com/webhooks/cwm",
    "events": ["invitation.created"],
    "description": "AI Assistant Webhook"
  }'
import requests

payload = {
    "target_url": "https://api.yourdomain.com/webhooks/cwm",
    "events": ["invitation.created"],
    "description": "AI Assistant Webhook"
}
res = requests.post(
    "https://coordinatewith.me/api/v1/webhooks",
    json=payload,
    headers={
        "X-Client-Id": "YOUR_CLIENT_ID",
        "X-Client-Secret": "YOUR_CLIENT_SECRET"
    }
)
print(res.json())
{
  "status": "success",
  "message": "Webhook subscription registered successfully. Please store your secret safely.",
  "data": {
    "id": 1,
    "target_url": "https://api.yourdomain.com/webhooks/cwm",
    "description": "AI Assistant Webhook",
    "events": ["invitation.created"],
    "secret": "whsec_abcd1234efgh5678ijkl...",
    "is_active": true,
    "failure_count": 0,
    "created_at": "2026-09-19T13:00:00Z"
  }
}
Status: -- -- ms

                            
GET /api/v1/webhooks/{id}

Get Webhook Details & Logs

Retrieve metadata and the 20 most recent delivery logs for a registered webhook.

curl -X GET "https://coordinatewith.me/api/v1/webhooks/1" \
  -H "X-Client-Id: YOUR_CLIENT_ID" \
  -H "X-Client-Secret: YOUR_CLIENT_SECRET"
import requests

res = requests.get(
    "https://coordinatewith.me/api/v1/webhooks/1",
    headers={
        "X-Client-Id": "YOUR_CLIENT_ID",
        "X-Client-Secret": "YOUR_CLIENT_SECRET"
    }
)
print(res.json())
{
  "status": "success",
  "data": {
    "id": 1,
    "target_url": "https://api.yourdomain.com/webhooks/cwm",
    "description": "AI Assistant Webhook",
    "events": ["invitation.created"],
    "is_active": true,
    "failure_count": 0,
    "last_triggered_at": "2026-09-19T13:00:00Z",
    "last_status_code": 200,
    "recent_deliveries": [
      {
        "id": 42,
        "event": "invitation.created",
        "status_code": 200,
        "execution_time_ms": 145,
        "success": true,
        "created_at": "2026-09-19T13:00:00Z"
      }
    ]
  }
}
Status: -- -- ms

                            
POST /api/v1/webhooks/{id}/test

Test Webhook Ping

Send an immediate test event (webhook.test) with signature to verify endpoint connectivity.

curl -X POST "https://coordinatewith.me/api/v1/webhooks/1/test" \
  -H "X-Client-Id: YOUR_CLIENT_ID" \
  -H "X-Client-Secret: YOUR_CLIENT_SECRET"
import requests

res = requests.post(
    "https://coordinatewith.me/api/v1/webhooks/1/test",
    headers={
        "X-Client-Id": "YOUR_CLIENT_ID",
        "X-Client-Secret": "YOUR_CLIENT_SECRET"
    }
)
print(res.json())
{
  "status": "success",
  "message": "Test ping executed.",
  "data": {
    "subscription_id": 1,
    "success": true,
    "status_code": 200,
    "message": "Success"
  }
}
Status: -- -- ms

                            
DELETE /api/v1/webhooks/{id}

Delete Webhook

Revoke and permanently delete a registered webhook subscription.

curl -X DELETE "https://coordinatewith.me/api/v1/webhooks/1" \
  -H "X-Client-Id: YOUR_CLIENT_ID" \
  -H "X-Client-Secret: YOUR_CLIENT_SECRET"
import requests

res = requests.delete(
    "https://coordinatewith.me/api/v1/webhooks/1",
    headers={
        "X-Client-Id": "YOUR_CLIENT_ID",
        "X-Client-Secret": "YOUR_CLIENT_SECRET"
    }
)
print(res.json())
{
  "status": "success",
  "message": "Webhook #1 deleted successfully.",
  "data": {
    "id": 1
  }
}
Status: -- -- ms

                            
Sending invites...
CoordinateWith.Me App Icon
Install CoordinateWith.Me

Add to your desktop or home screen for instant access.