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.
Three calls and you're integrated.
Replace the key, run, done. Every example below is the real endpoint, not a sketch.
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 →
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"] }'
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.
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" }] }
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.
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)
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
Questions? Answers.
One platform, built around your pipeline.
CRM, automation, analytics, your ERP and your AI share the same records. Start with sales, add the rest whenever you need it.