Developers

One API for everything Meetzy does.

230+ REST endpoints, signed webhooks, a push endpoint for any ERP and 138 MCP tools — documented in OpenAPI, scoped by API key, the same objects the app uses.

Surface

Four doors into the same data.

REST API

Contacts, companies, deals, tasks, quotes, products, sequences, workflows, reports, analytics — create, search, update, bulk.

Push ingest

POST your ERP's customers, invoices and orders in its own field names; Meetzy normalises, matches and reports rejects.

Webhooks

Subscribe to any event. HMAC-signed, retried with backoff, with a delivery log you can replay.

MCP tools

138 typed tools for Claude, Codex, Cursor and VS Code — OAuth sign-in, per-organisation scope.

Quick start

Three calls and you're integrated.

Replace the key, run, done. Every example below is the real endpoint, not a sketch.

1 · Create

Contacts, companies and deals — like the app does.

Deduplicated by email (or domain for companies), linked to their company automatically. The response is the full record, ready to link. Contacts reference →

Create a contactcurl
curl -X POST https://meetzy.me/api/v1/contacts \
  -H "Authorization: Bearer mz_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "camille@payfit.com",
    "first_name": "Camille", "last_name": "Laurent",
    "title": "Head of Sales", "company": "Payfit",
    "assigned_to": "you@company.com", "tags": ["inbound"]
  }'
2 · Push from your ERP

Send invoices the way your system names them.

One source per key (custom:my-erp). “N° facture”, “Code client”, “Total TTC”, “Kunde” — recognised, normalised, matched. Unknown customers are created, lines are kept, rejects come back with a reason.

How matching works
Push invoicesJavaScript
await fetch("https://meetzy.me/api/v1/sync/ingest", {
  method: "POST",
  headers: { Authorization: "Bearer mz_live_…", "Content-Type": "application/json" },
  body: JSON.stringify({
    provider: "custom:my-erp",
    object: "documents",
    records: invoices.map((inv) => ({
      "N° facture": inv.number, "Date": inv.date,            // 07/10/2026
      "Code client": inv.customerCode, "Client": inv.customerName,
      "Total TTC": inv.total, "Reste dû": inv.unpaid,
      lines: inv.lines,                                       // sku, qty, total HT
    })),
  }),
});
// → { created: 412, updated: 38, rejected: [{ index: 7, reason: "no date" }] }
3 · Listen

Get called when something happens.

Deal won, quote accepted, contact replied, task overdue, website visit — pick the events, verify the signature, act. n8n, Make and Zapier plug in the same way.

Subscribe a webhookPython
import requests, hmac, hashlib

requests.post("https://meetzy.me/api/v1/webhooks",
  headers={"Authorization": "Bearer mz_live_…"},
  json={"url": "https://erp.example.com/meetzy",
        "events": ["deal.won", "quote.accepted", "task.overdue"]})

# On delivery: X-Meetzy-Timestamp + X-Meetzy-Signature (sha256=…)
def verify(secret, body, timestamp, signature):
    digest = hmac.new(secret.encode(), f"{timestamp}.{body}".encode(), hashlib.sha256).hexdigest()
    return hmac.compare_digest(f"sha256={digest}", signature)
Built for production

Boring in the right places.

Scoped keys

Read, write or widget-only keys per organisation. Rotate and revoke in one click; the key that made each call is in the log.

Isolation

Every call is scoped to one organisation. MCP sessions are tied to the signed-in user and what they may see in the app.

Idempotent writes

Upserts by external id, email, code or number — run the same batch twice and nothing duplicates.

Observability

Sync runs with counts and samples of rejects, webhook deliveries with status and replay, API logs per key.

OpenAPI 3

Full spec at /api/v1/openapi.json, grouped by tag — Contacts, Deals, Data sources, Reports, Webhooks…

MCP in one line

codex mcp add meetzy --url https://meetzy.me/api/mcp/mcp

FAQs

Questions? Answers.

Create an API key in Sales › Integrations & API › API keys, choose its scopes (read, write, delete, webhooks) and send it as a Bearer token. A key acts as the teammate who created it — their workspace, their name on what they create — can be revoked at any time, and every call is logged with the key that made it.

Yes — https://meetzy.me/api/v1/openapi.json describes every endpoint with parameters, bodies and responses, grouped by tag. Import it into Postman, Insomnia or a client generator.

POST /api/v1/sync/ingest accepts records as your system names them. Fields are recognised in English, French, German and Spanish and in SAP, Odoo and Sage vocabulary; dates and numbers are normalised; the response lists what was created, updated, and rejected with the reason. Send batches of up to 5,000 records.

Every delivery carries an HMAC-SHA256 signature of the timestamp and body with your endpoint secret (X-Meetzy-Signature), the event name, a delivery id and the attempt number, and failed deliveries are retried with backoff. You subscribe per event — contact.created, contact.replied, deal.won, quote.accepted, task.overdue, contact.website_visit and some fifty others.

The same capabilities exposed as more than 140 typed tools over the Model Context Protocol. Claude, Codex, Claude Code, Cursor and VS Code connect to https://meetzy.me/api/mcp/mcp, sign in with OAuth and can search, create and update anything the signed-in user may.

120 requests per minute per key, with standard 429 responses and Retry-After, and a quota per workspace from its plan: 1,000 requests a month on Free, 1,000 a day on Starter, 10,000 on Growth and 50,000 on Scale (+50,000 with the Automation add-on). Bulk writes should use the batch endpoints (companies/bulk, sync/ingest, sync/import) rather than one call per record.

Build on a CRM that answers.

Create a free workspace, generate a key and make your first call in the next five minutes.

Free plan · Growth free for 14 days, no card · Cancel anytime