Interactive API Playground Credentials
Credentials Not SetAuthentication & 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_...andX-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.
Add Attendee to Poll
Add an attendee by email address and name to an existing active scheduling poll.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| id * | integer | Meeting Poll ID. |
Request Body Parameters
| Field | Type | Description |
|---|---|---|
| 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"
}'
Remove Attendee from Poll
Remove an attendee from a poll by their attendee ID.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| 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"
List / Search Contacts
List all address book contacts or filter contacts matching a search query string.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| 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="
Create Contact
Add a new person to your address book, including optional home and work addresses.
Request Body Parameters
| Field | Type | Description |
|---|---|---|
| email * | string | Unique email address for the contact. |
| first_name | string | Contact first name. |
| last_name | string | Contact last name. |
| phone_number | string | Primary phone number. |
| home_street_address | string | Home street address. |
| home_city | string | Home city name. |
| home_state | string | Home 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 Contact Details
Retrieve contact information, including home and work addresses.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| id * | integer | Contact ID. |
curl -u "$CWM_CLIENT_ID:$CWM_CLIENT_SECRET" \ https://coordinatewith.me/api/v1/contacts/45
Update Contact
Update an existing contact's phone number, name, email, or address fields.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| id * | integer | Contact 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"
}'
Delete Contact
Remove a contact from your private address book.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| id * | integer | Contact 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"
Health Check
Verify platform service status, API version, and system timestamp without requiring authentication.
curl https://coordinatewith.me/api/v1/health
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
List Polls
List scheduling polls organized by or visible to the authenticated user.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| status | string | Filter by status: In Progress, Locked, Cancelled. |
| limit | integer | Max results to return (default 50, max 100). |
| offset | integer | Pagination offset (default 0). |
| include_archived | boolean | Set 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"
Create Scheduling Poll
Create a multi-option scheduling poll proposing specific time windows, venues, and inviting participants.
Request Body Parameters
| Field | Type | Description |
|---|---|---|
| title * | string | Poll title. |
| description | string | Optional agenda or instructions. |
| time_slots * | array | Array of objects containing start_time, end_time, and timezone. |
| locations | array | Array of location objects with name and city. |
| invitees | array | Array 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 Poll Details
Retrieve comprehensive poll details, time slots, proposed venues, attendee responses, and ranked votes.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| id * | integer | Meeting Poll ID. |
curl -u "$CWM_CLIENT_ID:$CWM_CLIENT_SECRET" \ https://coordinatewith.me/api/v1/polls/101
Update Poll
Update a poll's title, description, or status (e.g. Cancelled).
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| id * | integer | Meeting 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"}'
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
| Parameter | Type | Description |
|---|---|---|
| id * | integer | Meeting 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}'
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
Create QuickPoll
Create a rapid voting poll and receive public shareable voting links.
Request Body Parameters
| Field | Type | Description |
|---|---|---|
| title * | string | Quick poll title. |
| time_slots * | array<string> | List of ISO datetime strings for proposed options. |
| duration_minutes | integer | Duration 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 QuickPoll Details
Retrieve quick poll results, option votes, and participant ranked choices.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| id * | integer | QuickPoll ID. |
curl -u "$CWM_CLIENT_ID:$CWM_CLIENT_SECRET" \ https://coordinatewith.me/api/v1/quickpolls/12
List Invitations
List scheduling polls and meeting requests that the authenticated user has been invited to as a participant.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| status | string | Filter by meeting status: Voting, Locked, Cancelled, or all (default: all). |
| has_voted | string | Filter by whether you have submitted your vote: true, false, or all (default: all). |
| limit | integer | Maximum results to return (default 20, max 100). |
| offset | integer | Pagination 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
}
]
}
}
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
| Parameter | Type | Description |
|---|---|---|
| id * | integer | Unique 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"
}
}
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
| Parameter | Type | Description |
|---|---|---|
| id * | integer | Unique ID of the meeting/poll. |
JSON Body Fields
| Field | Type | Description |
|---|---|---|
| time_votes | array<int> | Ranked list of proposed time slot IDs in order of preference (e.g. [501, 502]). Required unless none_work is true. |
| location_votes | array<int> | Optional ranked list of proposed location IDs in order of preference. |
| none_work | boolean | Set to true if none of the proposed times work for you. Defaults to false. |
| note | string | Optional comment or feedback note sent to the organizer. |
| write_in_location | string | object | Optional write-in location name or address object (if write-ins are permitted). |
| suggested_times | array<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": []
}
}
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)
/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"
}
]
}
}
/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"
}
}
/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"
}
]
}
}
/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"
}
}
/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
}
}