Platform

Workspace & team

Who the key belongs to, the team and invitations, hand-overs, email signatures, company profile, widget boards, saved views, custom properties, search and engine health.

An API key acts as the teammate who created it, inside their workspace: it sees what they see, and what it creates is signed with their name. Team management (invites, removals, hand-overs) needs the workspace owner.

In a chat
Copy a ready promptPaste it in any AI: it reads the docs and follows the rules of the API.
Open in Claude or ChatGPTA new conversation with the prompt already written.
This page as MarkdownFor an AI that cannot open links: paste the text itself.
In your editor
Claude Code or CodexAdd this line to CLAUDE.md or AGENTS.md.Meetzy API reference (read before calling the API): https://www.meetzy.ai/llms-full.txt
CursorSettings › Indexing & Docs › Add Doc, then type @Meetzy in the chat.https://www.meetzy.ai/llms-full.txt
Connect Meetzy as tools (MCP)The AI can then read and change your CRM itself — Claude Code:claude mcp add --transport http meetzy https://meetzy.me/api/mcp/mcp
Same for Codexcodex mcp add meetzy --url https://meetzy.me/api/mcp/mcp
GET/me

Who am I

The key’s user (id, email, name, organization, plan, scopes, auth: "api_key"), the team and the pipelines — a good first call to check a key.

Scope: read
Request
curl "https://meetzy.me/api/v1/me" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/me", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/me",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "user": {
    "id": "5361d582-7a57-41ce-a448-38c41851565b",
    "email": "olivia@acme.com",
    "name": "Olivia Martin",
    "organization": "acme",
    "plan": null,
    "auth": "api_key",
    "scopes": [
      "read",
      "write",
      "delete",
      "webhooks",
      "mcp"
    ]
  },
  "team": [
    {
      "email": "olivia@acme.com",
      "name": "Olivia Martin",
      "memoji": null,
      "role": "owner"
    }
  ],
  "pipelines": [
    {
      "id": "cacafee6-6c63-407f-a948-5d6570c20143",
      "user_from": "acme",
      "name": "Sales pipeline",
      "is_default": true,
      "position": 0,
      "stages": [
        {
          "id": "qualification",
          "name": "Qualification",
          "type": "open",
          "color": "#6366F1",
          "rot_days": 14,
          "probability": 10
        },
        {
          "id": "discovery",
          "name": "Discovery call",
          "type": "open",
          "color": "#3B82F6",
          "rot_days": 14,
          "probability": 20
        },
        {
          "id": "demo",
          "name": "Demo / Meeting",
          "type": "open",
          "color": "#06B6D4",
          "rot_days": 10,
          "probability": 40
        }
      ],
      "currency": "EUR",
      "created_at": "2026-10-07T13:09:25.305055+00:00",
      "updated_at": "2026-10-07T13:09:25.305055+00:00"
    }
  ]
}
GET/health

Health check

ok: true when the CRM tables are reachable. Use it for uptime monitoring.

Scope: read
Request
curl "https://meetzy.me/api/v1/health" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/health", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/health",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "ok": true,
  "migration_required": false,
  "error": null
}
GET/engine/health

Automation engine health

Whether the background engine runs (last tick, errors), the event backlog, workflow runs and emails this week, active workflows and enrollments, mailbox status, recent failures, and issues to fix (level, text).

Scope: read
Request
curl "https://meetzy.me/api/v1/engine/health" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/engine/health", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/engine/health",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "status": "warning",
  "engine": {
    "background": true,
    "last_tick": "2026-10-07T13:23:26.164Z",
    "last_error": null
  },
  "backlog": {
    "pending_events": 0,
    "oldest_minutes": 0
  },
  "week": {
    "workflow_runs": 0,
    "emails_sent": 0
  },
  "active": {
    "workflows": 0,
    "sequence_enrollments": 0
  },
  "mailbox": null,
  "failures": {
    "emails": [],
    "workflow_runs": []
  },
  "issues": [
    {
      "level": "warning",
      "text": "No mailbox: email steps of sequences, campaigns and workflows cannot send."
    }
  ]
}
POST/engine/run

Run the automation engine now

Processes pending events, workflow steps, sequence steps, scheduled campaigns and webhook retries immediately instead of waiting for the next tick.

Scope: write

Returns counters of what was processed.

Request
curl -X POST "https://meetzy.me/api/v1/engine/run" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/engine/run", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/engine/run",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response201

See the notes on the left.

GET/onboarding/status

Setup checklist

The setup steps (profile, company, mailbox, LinkedIn, first contacts, pipeline…) with what is done.

Scope: read
Request
curl "https://meetzy.me/api/v1/onboarding/status" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/onboarding/status", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/onboarding/status",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "steps": [
    {
      "id": "profile",
      "done": false,
      "count": 0,
      "title": "Pick your memoji",
      "text": "Your teammates see it on leads, deals and the leaderboard.",
      "event": "meetzy:onboarding",
      "cta": "Pick one"
    },
    {
      "id": "company",
      "done": false,
      "count": 0,
      "title": "Teach Meetzy your company",
      "text": "The AI writes emails and next steps with your offer and tone.",
      "event": "meetzy:onboarding",
      "cta": "Set up"
    }
  ],
  "done": 6,
  "total": 11
}
GET/workspace/setup

Workspace profile

Your profile, the company profile the AI writes with, the sales cycles, mailbox and LinkedIn status.

Scope: read
Request
curl "https://meetzy.me/api/v1/workspace/setup" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/workspace/setup", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/workspace/setup",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "profile": {
    "first_name": "Olivia",
    "last_name": "Martin",
    "memoji": null,
    "email": "olivia@acme.com"
  },
  "company": null,
  "cycles": {
    "configured": false,
    "multi_supported": true,
    "cycles": [
      {
        "id": "default",
        "name": "Main pipeline",
        "color": "#007AFF",
        "is_default": true,
        "stages": [
          {
            "id": "new_leads",
            "name": "New leads",
            "color": "#8E8E93",
            "fixed": true
          },
          {
            "id": "in_discussion",
            "name": "In discussion",
            "description": null,
            "color": "#5856D6",
            "won": false
          },
          {
            "id": "negotiation",
            "name": "Negotiation",
            "description": null,
            "color": "#007AFF",
            "won": false
          }
        ],
        "count": 1
      }
    ]
  },
  "mailbox": {
    "connected": false,
    "sending_as": null,
    "mode": "personal",
    "mailboxes": [],
    "all": []
  },
  "linkedin": {
    "connected": false
  }
}
PATCH/workspace/profile

Update your profile

Scope: write

Body

first_namestring
First name.
last_namestring
Last name.
memojistring
Avatar id.
Request
curl -X PATCH "https://meetzy.me/api/v1/workspace/profile" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "first_name": "Olivia",
    "last_name": "Martin"
  }'
const res = await fetch("https://meetzy.me/api/v1/workspace/profile", {
  method: "PATCH",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "first_name": "Olivia",
    "last_name": "Martin"
  }),
});
const data = await res.json();
import os, requests

res = requests.patch(
    "https://meetzy.me/api/v1/workspace/profile",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "first_name": "Olivia",
        "last_name": "Martin"
    },
)
data = res.json()
Response200
{
  "ok": true,
  "first_name": "Olivia",
  "last_name": "Martin"
}
PATCH/workspace/company

Update the company profile

What the AI knows about your company — used to write emails, AI lines and next steps in your offer and tone.

Scope: write

Body

company_namestring
Your company.
company_descriptionstring
What you do.
industrystring
Your sector.
target_audiencestring
Who you sell to.
key_productsstring
Products and services.
tonestring
How you write (friendly, formal…).
website_urlstring
Website.

Returns the saved company profile.

Request
curl -X PATCH "https://meetzy.me/api/v1/workspace/company" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "company_name": "Acme",
    "company_description": "Distribution of premium fashion brands to retailers in Europe and Africa.",
    "target_audience": "Independent retailers and department stores",
    "tone": "warm and concise"
  }'
const res = await fetch("https://meetzy.me/api/v1/workspace/company", {
  method: "PATCH",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "company_name": "Acme",
    "company_description": "Distribution of premium fashion brands to retailers in Europe and Africa.",
    "target_audience": "Independent retailers and department stores",
    "tone": "warm and concise"
  }),
});
const data = await res.json();
import os, requests

res = requests.patch(
    "https://meetzy.me/api/v1/workspace/company",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "company_name": "Acme",
        "company_description": "Distribution of premium fashion brands to retailers in Europe and Africa.",
        "target_audience": "Independent retailers and department stores",
        "tone": "warm and concise"
    },
)
data = res.json()
Response200

See the notes on the left.

GET/team

Team

Plan, seats used and available, members (role, last login, how many leads, deals and tasks each owns) and pending invitations.

Scope: read
Request
curl "https://meetzy.me/api/v1/team" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/team", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/team",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "plan": "starter",
  "seats": 1,
  "used": 1,
  "can_manage": true,
  "me": "olivia@acme.com",
  "company": "Acme",
  "members": [
    {
      "id": "5361d582-7a57-41ce-a448-38c41851565b",
      "email": "olivia@acme.com",
      "name": "Olivia Martin",
      "first_name": "Olivia",
      "last_name": "Martin",
      "memoji": null,
      "role": "owner",
      "last_login": null,
      "joined_at": "2026-10-07T13:07:47.072553+00:00",
      "is_me": true,
      "work": {
        "leads": 0,
        "deals": 1,
        "tasks": 10
      }
    }
  ],
  "invites": []
}
POST/team/invites

Invite a teammate

Emails an invitation valid 7 days. Owner only. 402 when every seat of the plan is used, 409 when the email already has an account or a pending invitation.

Scope: write

Body

emailstringrequired
Their email.
Request
curl -X POST "https://meetzy.me/api/v1/team/invites" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "paul@acme.com"
  }'
const res = await fetch("https://meetzy.me/api/v1/team/invites", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "email": "paul@acme.com"
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/team/invites",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "email": "paul@acme.com"
    },
)
data = res.json()
Response201
{
  "id": "6a5b4c3d-2e1f-4a0b-9c8d-7e6f5a4b3c2d",
  "email": "paul@acme.com",
  "link": "https://meetzy.me/app/join/9f8e…",
  "inviter_name": "Olivia Martin",
  "company": "Acme"
}
POST/team/invites/{id}/resend

Resend an invitation

New email, new 7-day validity.

Scope: write

Path parameters

idstringrequired
Id of the record (UUID).
Request
curl -X POST "https://meetzy.me/api/v1/team/invites/e43414d6-f56f-42be-a64c-a836d6015efc/resend" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/team/invites/e43414d6-f56f-42be-a64c-a836d6015efc/resend", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/team/invites/e43414d6-f56f-42be-a64c-a836d6015efc/resend",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response201
{
  "id": "6a5b4c3d-2e1f-4a0b-9c8d-7e6f5a4b3c2d",
  "email": "paul@acme.com",
  "link": "https://meetzy.me/app/join/9f8e…",
  "inviter_name": "Olivia Martin",
  "company": "Acme"
}
DELETE/team/invites/{id}

Cancel an invitation

Scope: delete

Path parameters

idstringrequired
Id of the record (UUID).
Request
curl -X DELETE "https://meetzy.me/api/v1/team/invites/e43414d6-f56f-42be-a64c-a836d6015efc" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/team/invites/e43414d6-f56f-42be-a64c-a836d6015efc", {
  method: "DELETE",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.delete(
    "https://meetzy.me/api/v1/team/invites/e43414d6-f56f-42be-a64c-a836d6015efc",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "ok": true
}
POST/team/hand-over

Hand over someone’s work

Moves every lead, open deal and open task of one teammate to another (holidays, departure, new territory). Owner only.

Scope: write

Body

from_emailstringrequired
Whose work moves.
to_emailstringrequired
Who takes it.
Request
curl -X POST "https://meetzy.me/api/v1/team/hand-over" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from_email": "paul@acme.com",
    "to_email": "olivia@acme.com"
  }'
const res = await fetch("https://meetzy.me/api/v1/team/hand-over", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "from_email": "paul@acme.com",
    "to_email": "olivia@acme.com"
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/team/hand-over",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "from_email": "paul@acme.com",
        "to_email": "olivia@acme.com"
    },
)
data = res.json()
Response201
{
  "moved": {
    "leads": 214,
    "deals": 9,
    "tasks": 31
  }
}
DELETE/team/members/{email}

Remove a teammate

Removes their account after handing their work over (to hand_over_to, or the owner). The owner cannot be removed.

Scope: delete

Path parameters

emailstringrequired
Email of the teammate.

Body

hand_over_tostring
Who takes their leads, deals and tasks. Default: the owner.
Request
curl -X DELETE "https://meetzy.me/api/v1/team/members/paul@acme.com" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/team/members/paul@acme.com", {
  method: "DELETE",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.delete(
    "https://meetzy.me/api/v1/team/members/paul@acme.com",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "ok": true,
  "moved": {
    "leads": 214,
    "deals": 9,
    "tasks": 31
  }
}
GET/signature

Your email signature

The available designs (classic, compact, minimal), your saved configuration and the rendered HTML appended to emails sent from your mailbox.

Scope: read
Request
curl "https://meetzy.me/api/v1/signature" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/signature", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/signature",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "templates": [
    {
      "id": "classic",
      "name": "Classic",
      "description": "Two columns with logo and address block"
    },
    {
      "id": "compact",
      "name": "Compact",
      "description": "Logo on the left, single-line details on the right"
    }
  ],
  "config": null,
  "html": null,
  "updated_at": null
}
PUT/signature

Save your email signature

From a design (config), from your own HTML (mode: "html"), or remove it (mode: "clear").

Scope: write

Body

configobject
template (classic, compact, minimal), name, jobTitle, address (lines), logoUrl, logoLinkUrl, socials ([{ kind: "linkedin", url }]), colors ({ text, accent, socials }), fontFamily.
modestring
html or clear.
htmlstring
Your signature HTML (with mode: "html").

Returns { config, html }.

Request
curl -X PUT "https://meetzy.me/api/v1/signature" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "config": {
      "template": "compact",
      "name": "Olivia Martin",
      "jobTitle": "Head of Sales",
      "address": [
        "Acme",
        "12 rue de la Paix, Paris"
      ],
      "logoUrl": "https://acme.com/logo.png",
      "socials": [
        {
          "kind": "linkedin",
          "url": "https://www.linkedin.com/in/olivia"
        }
      ],
      "colors": {
        "accent": "#0071E3"
      }
    }
  }'
const res = await fetch("https://meetzy.me/api/v1/signature", {
  method: "PUT",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "config": {
      "template": "compact",
      "name": "Olivia Martin",
      "jobTitle": "Head of Sales",
      "address": [
        "Acme",
        "12 rue de la Paix, Paris"
      ],
      "logoUrl": "https://acme.com/logo.png",
      "socials": [
        {
          "kind": "linkedin",
          "url": "https://www.linkedin.com/in/olivia"
        }
      ],
      "colors": {
        "accent": "#0071E3"
      }
    }
  }),
});
const data = await res.json();
import os, requests

res = requests.put(
    "https://meetzy.me/api/v1/signature",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "config": {
            "template": "compact",
            "name": "Olivia Martin",
            "jobTitle": "Head of Sales",
            "address": ["Acme", "12 rue de la Paix, Paris"],
            "logoUrl": "https://acme.com/logo.png",
            "socials": [
                {
                    "kind": "linkedin",
                    "url": "https://www.linkedin.com/in/olivia"
                }
            ],
            "colors": {
                "accent": "#0071E3"
            }
        }
    },
)
data = res.json()
Response200

See the notes on the left.

POST/signature/preview

Preview a signature

Renders a configuration to HTML without saving it.

Scope: write

Body

configobjectrequired
Signature configuration.
Request
curl -X POST "https://meetzy.me/api/v1/signature/preview" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/signature/preview", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/signature/preview",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response201
{
  "html": "<table role=\"presentation\" …>…</table>"
}
GET/boards/widgets

Widgets for boards

Every widget that can go on the Sales cockpit or Home: id, category, title, description, allowed sizes (xs ¼, s ⅓, m ½, l ⅔, xl full width), default size and what data it needs (deals, erp…).

Scope: read

Query parameters

categorystring
focus, leads, deals, erp, marketing, team or tools.
Request
curl "https://meetzy.me/api/v1/boards/widgets" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/boards/widgets", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/boards/widgets",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "sizes": [
    "xs",
    "s",
    "m",
    "l",
    "xl"
  ],
  "widgets": [
    {
      "id": "focus.tasks",
      "category": "focus",
      "title": "Tasks for today",
      "description": "Open tasks due today, and how many are late",
      "sizes": [
        "xs",
        "s"
      ],
      "default_size": "xs",
      "needs": null
    },
    {
      "id": "focus.followups",
      "category": "focus",
      "title": "Follow-ups due",
      "description": "CRM reminders due today or late",
      "sizes": [
        "xs",
        "s"
      ],
      "default_size": "xs",
      "needs": null
    }
  ]
}
GET/boards/{board}

A board

board is cockpit (Sales cockpit) or home. The widgets in order with their size and key, and whether the arrangement is yours, the team’s or the default one (then widgets is null: the app builds it from your data).

Scope: read

Path parameters

boardstringrequired
cockpit (Sales cockpit) or home.
Request
curl "https://meetzy.me/api/v1/boards/cockpit" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/boards/cockpit", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/boards/cockpit",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "board": "home",
  "source": "yours",
  "can_set_team": true,
  "widgets": [
    {
      "position": 1,
      "key": "ymf530d",
      "widget": "deals.forecast",
      "title": "Forecast",
      "size": "l"
    },
    {
      "position": 2,
      "key": "djnlsgl",
      "widget": "focus.today",
      "title": "Your day",
      "size": "m"
    }
  ]
}
PATCH/boards/{board}

Arrange a board

Replace the whole board with widgets, or change it with add, remove, resize, move (widgets referred to by id or key). reset: true goes back to the team / default board. for_team: true (admins) saves it as everyone’s default. Saved on the server — the same on every device.

Scope: write

Path parameters

boardstringrequired
cockpit (Sales cockpit) or home.

Body

widgetsobject[]
Full list, top to bottom: [{ widget, size? }].
addobject[]
[{ widget, size?, position? }] (position from 1).
removestring[]
Widget ids or keys.
resizeobject[]
[{ widget, size }].
moveobject[]
[{ widget, position }].
resetboolean
Drop the arrangement.
for_teamboolean
Apply to the team default.
Request
curl -X PATCH "https://meetzy.me/api/v1/boards/cockpit" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "widgets": [
      {
        "widget": "focus.today",
        "size": "m"
      },
      {
        "widget": "deals.forecast"
      },
      {
        "widget": "erp.invoiced",
        "size": "s"
      }
    ]
  }'
const res = await fetch("https://meetzy.me/api/v1/boards/cockpit", {
  method: "PATCH",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "widgets": [
      {
        "widget": "focus.today",
        "size": "m"
      },
      {
        "widget": "deals.forecast"
      },
      {
        "widget": "erp.invoiced",
        "size": "s"
      }
    ]
  }),
});
const data = await res.json();
import os, requests

res = requests.patch(
    "https://meetzy.me/api/v1/boards/cockpit",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "widgets": [
            {
                "widget": "focus.today",
                "size": "m"
            },
            {
                "widget": "deals.forecast"
            },
            {
                "widget": "erp.invoiced",
                "size": "s"
            }
        ]
    },
)
data = res.json()
Response200
{
  "board": "home",
  "source": "yours",
  "widgets": [
    {
      "position": 1,
      "key": "djnlsgl",
      "widget": "focus.today",
      "title": "Your day",
      "size": "m"
    },
    {
      "position": 2,
      "key": "ymf530d",
      "widget": "deals.forecast",
      "title": "Forecast",
      "size": "l"
    },
    {
      "position": 3,
      "key": "q8p2v1a",
      "widget": "erp.invoiced",
      "title": "Invoiced",
      "size": "s"
    }
  ]
}
GET/views

Saved views

Saved filters of the lists (yours and the shared ones).

Scope: read

Query parameters

object_typestring
contact, company, deal, task…
Request
curl "https://meetzy.me/api/v1/views?object_type=contact" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/views?object_type=contact", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/views?object_type=contact",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "views": [
    {
      "id": "ec753b7f-59bc-4713-aec9-404fabcbf10b",
      "user_from": "acme",
      "object_type": "contact",
      "name": "Hot",
      "filters": {
        "min_score": 50
      },
      "columns": [],
      "sort": {},
      "is_shared": true,
      "owner_email": "olivia@acme.com",
      "created_at": "2026-10-07T13:23:42.979489+00:00"
    }
  ]
}
POST/views

Save a view

Scope: write

Body

object_typestringrequired
List it applies to.
namestringrequired
Name.
filtersobject
Filters (same keys as the list endpoint’s query).
columnsstring[]
Visible columns.
sortobject
Sort.
is_sharedboolean
Visible to the team.
Request
curl -X POST "https://meetzy.me/api/v1/views" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "object_type": "contact",
    "name": "Hot MQLs",
    "filters": {
      "lifecycle_stage": "mql",
      "min_score": 60
    },
    "is_shared": true
  }'
const res = await fetch("https://meetzy.me/api/v1/views", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "object_type": "contact",
    "name": "Hot MQLs",
    "filters": {
      "lifecycle_stage": "mql",
      "min_score": 60
    },
    "is_shared": true
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/views",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "object_type": "contact",
        "name": "Hot MQLs",
        "filters": {
            "lifecycle_stage": "mql",
            "min_score": 60
        },
        "is_shared": True
    },
)
data = res.json()
Response201
{
  "id": "ec753b7f-59bc-4713-aec9-404fabcbf10b",
  "user_from": "acme",
  "object_type": "contact",
  "name": "Hot",
  "filters": {
    "min_score": 50
  },
  "columns": [],
  "sort": {},
  "is_shared": true,
  "owner_email": "olivia@acme.com",
  "created_at": "2026-10-07T13:23:42.979489+00:00"
}
DELETE/views/{id}

Delete a view

Scope: delete

Path parameters

idstringrequired
Id of the record (UUID).
Request
curl -X DELETE "https://meetzy.me/api/v1/views/e43414d6-f56f-42be-a64c-a836d6015efc" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/views/e43414d6-f56f-42be-a64c-a836d6015efc", {
  method: "DELETE",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.delete(
    "https://meetzy.me/api/v1/views/e43414d6-f56f-42be-a64c-a836d6015efc",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "deleted": true
}
GET/properties

Custom properties

Extra fields defined for contacts, companies or deals. Their values live in custom_properties (contacts) or custom (companies, deals), under the property key.

Scope: read

Query parameters

object_typestring
contact, company or deal.
Request
curl "https://meetzy.me/api/v1/properties" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/properties", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/properties",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "properties": [
    {
      "id": "2d88f4ee-0f91-43a3-aded-4dbd80f50d18",
      "user_from": "acme",
      "object_type": "contact",
      "key": "shoe_size",
      "label": "Shoe size",
      "field_type": "number",
      "options": [],
      "group_name": null,
      "required": false,
      "position": 0,
      "created_at": "2026-10-07T13:09:53.215782+00:00"
    },
    {
      "id": "01823011-c6f7-4f9b-a4c8-0f174ed0409c",
      "user_from": "acme",
      "object_type": "contact",
      "key": "shoe_size_1791379423679",
      "label": "Shoe size 1791379423679",
      "field_type": "number",
      "options": [],
      "group_name": null,
      "required": false,
      "position": 0,
      "created_at": "2026-10-07T13:23:44.389568+00:00"
    }
  ]
}
POST/properties

Create a custom property

The key is made from the label (Shoe size → shoe_size). 409 if it already exists.

Scope: write

Body

object_typestringrequired
contact, company or deal.
labelstringrequired
Label.
keystring
Key (default from the label).
field_typestring
text, number, date, boolean, select, multiselect, url…
optionsstring[]
Choices for selects.
group_namestring
Section it shows in.
requiredboolean
Required in forms.
positioninteger
Order.
Request
curl -X POST "https://meetzy.me/api/v1/properties" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "object_type": "company",
    "label": "Distribution channel",
    "field_type": "select",
    "options": [
      "Retail",
      "Wholesale",
      "E-commerce"
    ]
  }'
const res = await fetch("https://meetzy.me/api/v1/properties", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "object_type": "company",
    "label": "Distribution channel",
    "field_type": "select",
    "options": [
      "Retail",
      "Wholesale",
      "E-commerce"
    ]
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/properties",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "object_type": "company",
        "label": "Distribution channel",
        "field_type": "select",
        "options": ["Retail", "Wholesale", "E-commerce"]
    },
)
data = res.json()
Response201
{
  "id": "01823011-c6f7-4f9b-a4c8-0f174ed0409c",
  "user_from": "acme",
  "object_type": "contact",
  "key": "shoe_size_1791379423679",
  "label": "Shoe size 1791379423679",
  "field_type": "number",
  "options": [],
  "group_name": null,
  "required": false,
  "position": 0,
  "created_at": "2026-10-07T13:23:44.389568+00:00"
}
DELETE/properties/{id}

Delete a custom property

Scope: delete

Path parameters

idstringrequired
Id of the record (UUID).
Request
curl -X DELETE "https://meetzy.me/api/v1/properties/e43414d6-f56f-42be-a64c-a836d6015efc" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/properties/e43414d6-f56f-42be-a64c-a836d6015efc", {
  method: "DELETE",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.delete(
    "https://meetzy.me/api/v1/properties/e43414d6-f56f-42be-a64c-a836d6015efc",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "deleted": true
}