API Reference

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).

Base URL: https://www.meetmatch.ai/api/zapier/v1
Authentication

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.

Endpoints

REST API

GET/authread

Verify an API key and return the connected organization (used as the connection test and label).

GET/appointmentsread

List the most recent appointments, newest first.

  • limitMax records to return (1–100, default 25).
  • statusOptional filter: scheduled, completed, no_show, cancelled.
GET/contactsread

List the most recent CRM contacts, newest first.

  • limitMax records to return (1–100, default 25).
POST/contactswrite

Create a CRM contact. If a contact with the same email already exists in the organization, the existing record is returned (no duplicate).

  • full_nameRequired. Contact's full name.
  • emailRequired. Valid email address.
  • companyOptional company name.
  • phoneOptional phone number.
  • lead_sourceOptional free-text source label.
  • custom_fieldsOptional JSON object of extra fields.
GET/dealsread

List the most recent CRM deals, newest first.

  • limitMax records to return (1–100, default 25).
  • statusOptional filter, e.g. open, won, lost.
POST/dealswrite

Create a deal for an existing contact in a pipeline. Both prospect_id and pipeline_id must belong to the authenticated organization.

  • prospect_idRequired. ID of an existing contact.
  • pipeline_idRequired. ID of a pipeline (see /pipelines).
  • deal_nameOptional deal name.
  • deal_valueOptional non-negative number.
  • expected_close_dateOptional ISO date (YYYY-MM-DD).
  • priorityOptional: low, medium (default), high.
GET/outcomesread

List the most recent call outcomes (conversion status, revenue, rating) for the organization, newest first.

  • limitMax records to return (1–100, default 25).
GET/form-submissionsread

List the most recent questionnaire / booking-form submissions. Answers are keyed by their human-readable question labels.

  • limitMax records to return (1–100, default 25).
GET/pipelinesread

List the organization's CRM pipelines (id and name). Powers the pipeline dropdown for Create Deal.

POST/hooksread

Subscribe a REST hook. Registers a webhook that MeetMatch calls the instant the chosen event happens. Returns the subscription id.

  • target_urlRequired. HTTPS URL to receive events.
  • eventRequired. One of the webhook events below.
DELETE/hooks/{id}read

Unsubscribe a REST hook by its subscription id. Idempotent and scoped to your organization.

Webhooks

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 */ }
}
EventFires when…
appointment.createdA prospect books a meeting.
appointment.completedAn appointment is marked completed.
appointment.no_showAn appointment is marked as a no-show.
appointment.cancelledAn appointment is cancelled.
appointment.rescheduledAn appointment is moved to a new time.
contact.createdA new CRM contact is created.
deal.createdA new deal is created.
deal.stage_changedA deal moves to a different pipeline stage.
deal.wonA deal is marked won.
deal.lostA deal is marked lost.
outcome.recordedA rep logs a call outcome.
form.submittedA prospect submits a questionnaire or booking form.
Schemas

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"
}
Errors

Status codes

CodeMeaning
200 / 201Success. POST endpoints return 201 (or 200 when an existing contact is returned).
400Invalid request body or parameters (e.g. missing required field).
401Missing, malformed, revoked, or expired API key.
403Valid key but missing the required scope (e.g. write).
404A referenced record was not found in your organization.
500Unexpected 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.