MeetMatch API
The public REST API that powers the MeetMatch Zapier integration. Every endpoint is organization-scoped, authenticated with an API key, and returns flat JSON with a stable id on each record. Timestamps are ISO 8601 (UTC).
API keys
Authenticate every request with a bearer token in the Authorization header. Keys are created in MeetMatch under Settings → Zapier & API Keys and look like mm_live_…. Each key has read and/or write scopes; write actions (creating contacts and deals) require the write scope.
curl https://www.meetmatch.ai/api/zapier/v1/auth \
-H "Authorization: Bearer mm_live_xxxxxxxxxxxxxxxx"Keys are stored only as a SHA-256 hash and can be revoked at any time from the same screen. A request with a missing, malformed, revoked, or expired key returns 401; a valid key without the required scope returns 403. All data is scoped to the key's organization — you can never read or write another organization's records.
REST API
/authreadVerify an API key and return the connected organization (used as the connection test and label).
/appointmentsreadList the most recent appointments, newest first.
limit— Max records to return (1–100, default 25).status— Optional filter: scheduled, completed, no_show, cancelled.
/contactsreadList the most recent CRM contacts, newest first.
limit— Max records to return (1–100, default 25).
/contactswriteCreate a CRM contact. If a contact with the same email already exists in the organization, the existing record is returned (no duplicate).
full_name— Required. Contact's full name.email— Required. Valid email address.company— Optional company name.phone— Optional phone number.lead_source— Optional free-text source label.custom_fields— Optional JSON object of extra fields.
/dealsreadList the most recent CRM deals, newest first.
limit— Max records to return (1–100, default 25).status— Optional filter, e.g. open, won, lost.
/dealswriteCreate a deal for an existing contact in a pipeline. Both prospect_id and pipeline_id must belong to the authenticated organization.
prospect_id— Required. ID of an existing contact.pipeline_id— Required. ID of a pipeline (see /pipelines).deal_name— Optional deal name.deal_value— Optional non-negative number.expected_close_date— Optional ISO date (YYYY-MM-DD).priority— Optional: low, medium (default), high.
/outcomesreadList the most recent call outcomes (conversion status, revenue, rating) for the organization, newest first.
limit— Max records to return (1–100, default 25).
/form-submissionsreadList the most recent questionnaire / booking-form submissions. Answers are keyed by their human-readable question labels.
limit— Max records to return (1–100, default 25).
/pipelinesreadList the organization's CRM pipelines (id and name). Powers the pipeline dropdown for Create Deal.
/hooksreadSubscribe a REST hook. Registers a webhook that MeetMatch calls the instant the chosen event happens. Returns the subscription id.
target_url— Required. HTTPS URL to receive events.event— Required. One of the webhook events below.
/hooks/{id}readUnsubscribe a REST hook by its subscription id. Idempotent and scoped to your organization.
REST hooks & events
Triggers use REST hooks for instant delivery. Subscribe with POST /hooks (an HTTPS target_url and an event); MeetMatch then POSTs the event to your URL the instant it happens and stops when you call DELETE /hooks/{id}. Each delivery is signed with an HMAC-SHA256 of the raw body in the X-MeetMatch-Signature header and includes the event name in X-MeetMatch-Event.
POST https://hooks.zapier.com/... (your target_url)
Content-Type: application/json
X-MeetMatch-Event: appointment.created
X-MeetMatch-Signature: sha256=<hex hmac of the raw body>
{
"event": "appointment.created",
"data": { /* the object, same shape as the matching GET endpoint */ }
}| Event | Fires when… |
|---|---|
appointment.created | A prospect books a meeting. |
appointment.completed | An appointment is marked completed. |
appointment.no_show | An appointment is marked as a no-show. |
appointment.cancelled | An appointment is cancelled. |
appointment.rescheduled | An appointment is moved to a new time. |
contact.created | A new CRM contact is created. |
deal.created | A new deal is created. |
deal.stage_changed | A deal moves to a different pipeline stage. |
deal.won | A deal is marked won. |
deal.lost | A deal is marked lost. |
outcome.recorded | A rep logs a call outcome. |
form.submitted | A prospect submits a questionnaire or booking form. |
Example payloads
Each object has the same shape whether returned by a GET endpoint or delivered to a REST hook.
Appointment
{
"id": "a1b2c3d4-0000-0000-0000-000000000001",
"status": "scheduled",
"scheduled_at": "2026-06-01T15:00:00Z",
"duration_minutes": 30,
"meeting_url": "https://meetmatch.live/r/abc123",
"matching_method": "ml_ranked",
"no_show_probability": 0.12,
"prospect_id": "p1...",
"prospect_name": "Jordan Avery",
"prospect_email": "jordan@acme.com",
"prospect_company": "Acme Corp",
"member_id": "m1...",
"rep_name": "Taylor Rep",
"rep_email": "taylor@yourco.com",
"event_type_id": "e1...",
"event_type_name": "Discovery Call",
"created_at": "2026-06-01T14:55:00Z"
}Contact
{
"id": "p1a2b3c4-0000-0000-0000-000000000001",
"full_name": "Jordan Avery",
"email": "jordan@acme.com",
"company": "Acme Corp",
"phone": "+15551234567",
"lead_source": "Website",
"custom_fields": {},
"created_at": "2026-06-01T14:55:00Z"
}Deal
{
"id": "d1a2b3c4-0000-0000-0000-000000000001",
"deal_name": "Acme Corp - Enterprise",
"deal_value": 4999,
"status": "open",
"current_stage": 1,
"priority": "medium",
"expected_close_date": "2026-07-15",
"pipeline_id": "pl1...",
"pipeline_name": "Inbound Sales",
"prospect_id": "p1...",
"prospect_name": "Jordan Avery",
"prospect_email": "jordan@acme.com",
"owner_id": "m1...",
"created_at": "2026-06-01T14:55:00Z"
}Form submission
{
"id": "qr8a3f1b-0000-0000-0000-000000000001",
"questionnaire_id": "q1...",
"questionnaire_title": "Discovery Intake",
"prospect_id": "p1...",
"prospect_name": "Jordan Avery",
"prospect_email": "jordan@acme.com",
"prospect_company": "Acme Corp",
"prospect_phone": "+15551234567",
"answers": {
"What is your budget?": "$5k-$10k",
"What is your timeline?": "This quarter"
},
"created_at": "2026-06-01T14:55:00Z"
}Status codes
| Code | Meaning |
|---|---|
200 / 201 | Success. POST endpoints return 201 (or 200 when an existing contact is returned). |
400 | Invalid request body or parameters (e.g. missing required field). |
401 | Missing, malformed, revoked, or expired API key. |
403 | Valid key but missing the required scope (e.g. write). |
404 | A referenced record was not found in your organization. |
500 | Unexpected server error. Safe to retry. |
Most teams never call these endpoints directly — the Zapier integration wraps all of this with no code. See the setup guide to connect in minutes.