CRM

Tasks & activities

The daily queue of calls, emails and to-dos, and the timeline of everything logged on contacts, deals and companies.

Tasks are what someone has to do; activities are what happened (a call, a meeting, a note, an email, a stage change). Completing a task logs an activity on the timeline automatically, with its outcome.

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/tasks

List tasks

Open tasks by default, soonest first, each with its contact, deal and company and an is_overdue flag.

Scope: read

Query parameters

statusstring
open (default), done or all.
ownerstring
me or a teammate’s email.
duestring
overdue, today, upcoming or no_date.
typestring
Task type.
lead_iduuid
Tasks of a contact.
deal_iduuid
Tasks of a deal.
company_iduuid
Tasks of a company.
limitinteger
Page size, 1–1000. Default 300.
offsetinteger
Rows to skip.
Request
curl "https://meetzy.me/api/v1/tasks?owner=me&due=today" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/tasks?owner=me&due=today", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/tasks?owner=me&due=today",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "tasks": [
    {
      "id": "c1538a0c-ffff-4229-a25a-9f84ae863bc8",
      "user_from": "acme",
      "title": "Call Camille",
      "description": null,
      "type": "call",
      "priority": "medium",
      "status": "open",
      "due_at": "2026-10-08T13:22:53.656+00:00",
      "completed_at": null,
      "owner_email": "olivia@acme.com",
      "lead_id": "8028ff76-1da4-451f-a0e7-dd91db772c20",
      "deal_id": null,
      "company_id": null,
      "sequence_enrollment_id": null,
      "source": "manual",
      "created_by": "olivia@acme.com",
      "created_at": "2026-10-07T13:22:54.323282+00:00",
      "updated_at": "2026-10-07T13:22:54.323282+00:00",
      "contact": {
        "id": "8028ff76-1da4-451f-a0e7-dd91db772c20",
        "display_name": "Camille Laurent",
        "primary_email": "camille@payfit.com",
        "phone": "+33612345678",
        "title": "Head of Sales",
        "company": "Payfit",
        "avatar_url": null,
        "linkedin_profile_url": null
      },
      "deal": null,
      "company_ref": null,
      "is_overdue": false
    },
    {
      "id": "010c6058-d8ee-49f9-ae8d-2bb84f48ceb9",
      "user_from": "acme",
      "title": "Send deck",
      "description": null,
      "type": "todo",
      "priority": "medium",
      "status": "open",
      "due_at": null,
      "completed_at": null,
      "owner_email": "olivia@acme.com",
      "lead_id": "30bd93b4-7fef-4b9b-ae22-979d87a26ee2",
      "deal_id": null,
      "company_id": null,
      "sequence_enrollment_id": null,
      "source": "manual",
      "created_by": "olivia@acme.com",
      "created_at": "2026-10-07T13:09:38.341206+00:00",
      "updated_at": "2026-10-07T13:09:38.341206+00:00",
      "contact": null,
      "deal": null,
      "company_ref": null,
      "is_overdue": null
    }
  ],
  "total": 10
}
POST/tasks

Create a task

Scope: write

Body

titlestringrequired
What to do.
descriptionstring
Details.
typestring
todo, call, email, meeting, linkedin or follow_up.
prioritystring
low, medium or high.
statusstring
open or done.
due_atdatetime
Due date and time (ISO 8601).
owner_emailstring
Who does it. Default: the key’s user.
lead_iduuid
Contact the task is about.
deal_iduuid
Deal the task is about.
company_iduuid
Company the task is about.
sourcestring
Where the task comes from (api, zapier…).
Request
curl -X POST "https://meetzy.me/api/v1/tasks" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Call Camille about the pricing",
    "type": "call",
    "priority": "high",
    "due_at": "2026-10-08T09:30:00+02:00",
    "lead_id": "e43414d6-f56f-42be-a64c-a836d6015efc"
  }'
const res = await fetch("https://meetzy.me/api/v1/tasks", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "title": "Call Camille about the pricing",
    "type": "call",
    "priority": "high",
    "due_at": "2026-10-08T09:30:00+02:00",
    "lead_id": "e43414d6-f56f-42be-a64c-a836d6015efc"
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/tasks",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "title": "Call Camille about the pricing",
        "type": "call",
        "priority": "high",
        "due_at": "2026-10-08T09:30:00+02:00",
        "lead_id": "e43414d6-f56f-42be-a64c-a836d6015efc"
    },
)
data = res.json()
Response201
{
  "id": "c1538a0c-ffff-4229-a25a-9f84ae863bc8",
  "user_from": "acme",
  "title": "Call Camille",
  "description": null,
  "type": "call",
  "priority": "medium",
  "status": "open",
  "due_at": "2026-10-08T13:22:53.656+00:00",
  "completed_at": null,
  "owner_email": "olivia@acme.com",
  "lead_id": "8028ff76-1da4-451f-a0e7-dd91db772c20",
  "deal_id": null,
  "company_id": null,
  "sequence_enrollment_id": null,
  "source": "manual",
  "created_by": "olivia@acme.com",
  "created_at": "2026-10-07T13:22:54.323282+00:00",
  "updated_at": "2026-10-07T13:22:54.323282+00:00"
}
POST/tasks/bulk

Create many tasks

Creates several tasks in one call (each needs a title). Returns how many were created.

Scope: write

Body

tasksobject[]required
Tasks, same fields as POST /tasks.
Request
curl -X POST "https://meetzy.me/api/v1/tasks/bulk" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tasks": [
      {
        "title": "Send the deck",
        "lead_id": "e43414d6-f56f-42be-a64c-a836d6015efc"
      },
      {
        "title": "Book the onsite",
        "type": "meeting",
        "due_at": "2026-10-15T10:00:00Z"
      }
    ]
  }'
const res = await fetch("https://meetzy.me/api/v1/tasks/bulk", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "tasks": [
      {
        "title": "Send the deck",
        "lead_id": "e43414d6-f56f-42be-a64c-a836d6015efc"
      },
      {
        "title": "Book the onsite",
        "type": "meeting",
        "due_at": "2026-10-15T10:00:00Z"
      }
    ]
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/tasks/bulk",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "tasks": [
            {
                "title": "Send the deck",
                "lead_id": "e43414d6-f56f-42be-a64c-a836d6015efc"
            },
            {
                "title": "Book the onsite",
                "type": "meeting",
                "due_at": "2026-10-15T10:00:00Z"
            }
        ]
    },
)
data = res.json()
Response201
{
  "created": 1
}
PATCH/tasks/{id}

Update or complete a task

Set status: "done" to complete it: the completion time is saved and an activity is logged (a call for call tasks, a meeting for meetings) with outcome and completion_note. status: "open" reopens it.

Scope: write

Path parameters

idstringrequired
Id of the record (UUID).

Body

titlestring
What to do.
descriptionstring
Details.
typestring
todo, call, email, meeting, linkedin or follow_up.
prioritystring
low, medium or high.
statusstring
open or done.
due_atdatetime
Due date and time (ISO 8601).
owner_emailstring
Who does it. Default: the key’s user.
lead_iduuid
Contact the task is about.
deal_iduuid
Deal the task is about.
company_iduuid
Company the task is about.
sourcestring
Where the task comes from (api, zapier…).
outcomestring
When completing a call: connected, positive, negative, scheduled, no_answer, voicemail, busy, wrong_number.
completion_notestring
When completing: what happened.
Request
curl -X PATCH "https://meetzy.me/api/v1/tasks/e43414d6-f56f-42be-a64c-a836d6015efc" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "done",
    "outcome": "scheduled",
    "completion_note": "Demo booked for Thursday"
  }'
const res = await fetch("https://meetzy.me/api/v1/tasks/e43414d6-f56f-42be-a64c-a836d6015efc", {
  method: "PATCH",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "status": "done",
    "outcome": "scheduled",
    "completion_note": "Demo booked for Thursday"
  }),
});
const data = await res.json();
import os, requests

res = requests.patch(
    "https://meetzy.me/api/v1/tasks/e43414d6-f56f-42be-a64c-a836d6015efc",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "status": "done",
        "outcome": "scheduled",
        "completion_note": "Demo booked for Thursday"
    },
)
data = res.json()
Response200
{
  "id": "c1538a0c-ffff-4229-a25a-9f84ae863bc8",
  "user_from": "acme",
  "title": "Call Camille",
  "description": null,
  "type": "call",
  "priority": "medium",
  "status": "done",
  "due_at": "2026-10-08T13:22:53.656+00:00",
  "completed_at": "2026-10-07T13:22:56.47+00:00",
  "owner_email": "olivia@acme.com",
  "lead_id": "8028ff76-1da4-451f-a0e7-dd91db772c20",
  "deal_id": null,
  "company_id": null,
  "sequence_enrollment_id": null,
  "source": "manual",
  "created_by": "olivia@acme.com",
  "created_at": "2026-10-07T13:22:54.323282+00:00",
  "updated_at": "2026-10-07T13:22:56.496051+00:00"
}
DELETE/tasks/{id}

Delete a task

Scope: delete

Path parameters

idstringrequired
Id of the record (UUID).
Request
curl -X DELETE "https://meetzy.me/api/v1/tasks/e43414d6-f56f-42be-a64c-a836d6015efc" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/tasks/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/tasks/e43414d6-f56f-42be-a64c-a836d6015efc",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "deleted": true
}
GET/activities

List activities (timeline)

Timeline entries, newest first. Without a contact / deal / company filter, the feed also includes notes and stage moves made on the CRM board.

Scope: read

Query parameters

lead_iduuid
Activities of a contact.
deal_iduuid
Activities of a deal.
company_iduuid
Activities of a company.
typestring
note, call, meeting, email, linkedin, whatsapp, stage_change, task, quote or system.
actorstring
Who logged it (email).
sincedatetime
Only activities after this date.
include_crmstring
false to leave out CRM board notes and moves.
limitinteger
Default 100.
Request
curl "https://meetzy.me/api/v1/activities?type=call&since=2026-10-01" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/activities?type=call&since=2026-10-01", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/activities?type=call&since=2026-10-01",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "activities": [
    {
      "id": "238b537f-c5c1-43c6-a882-dc25d67c8527",
      "user_from": "acme",
      "type": "call",
      "subject": "Discovery",
      "body": null,
      "outcome": "connected",
      "direction": null,
      "duration_sec": 600,
      "occurred_at": "2026-10-07T13:22:57.247+00:00",
      "actor_email": "olivia@acme.com",
      "lead_id": "8028ff76-1da4-451f-a0e7-dd91db772c20",
      "deal_id": null,
      "company_id": null,
      "metadata": {},
      "created_at": "2026-10-07T13:22:57.274612+00:00"
    },
    {
      "id": "26868ee3-f0fb-4302-afc3-9a32952648bd",
      "user_from": "acme",
      "type": "call",
      "subject": "Completed: Call Camille",
      "body": null,
      "outcome": "positive",
      "direction": null,
      "duration_sec": null,
      "occurred_at": "2026-10-07T13:22:56.515+00:00",
      "actor_email": "olivia@acme.com",
      "lead_id": "8028ff76-1da4-451f-a0e7-dd91db772c20",
      "deal_id": null,
      "company_id": null,
      "metadata": {
        "task_id": "c1538a0c-ffff-4229-a25a-9f84ae863bc8",
        "task_type": "call"
      },
      "created_at": "2026-10-07T13:22:56.539869+00:00"
    }
  ]
}
POST/activities

Log an activity

Writes an entry on the timeline of a contact, deal and/or company. Calls, meetings, emails and messages also update “last contacted” on the contact and “last activity” on the deal and company — the way to bring calls from a phone system or meetings from a calendar into Meetzy.

Scope: write

Body

typestringrequired
Activity type (see GET /activities).
subjectstring
Title.
bodystring
Details.
outcomestring
Result (for calls, see task outcomes).
directionstring
inbound or outbound.
duration_secinteger
Duration in seconds.
occurred_atdatetime
When it happened. Default: now.
actor_emailstring
Who did it. Default: the key’s user.
lead_iduuid
Contact.
deal_iduuid
Deal.
company_iduuid
Company.
metadataobject
Anything else (recording URL, call id…).
Request
curl -X POST "https://meetzy.me/api/v1/activities" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "call",
    "direction": "outbound",
    "subject": "Discovery call",
    "outcome": "connected",
    "duration_sec": 640,
    "lead_id": "e43414d6-f56f-42be-a64c-a836d6015efc",
    "metadata": {
      "recording_url": "https://calls.example.com/r/8812"
    }
  }'
const res = await fetch("https://meetzy.me/api/v1/activities", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "type": "call",
    "direction": "outbound",
    "subject": "Discovery call",
    "outcome": "connected",
    "duration_sec": 640,
    "lead_id": "e43414d6-f56f-42be-a64c-a836d6015efc",
    "metadata": {
      "recording_url": "https://calls.example.com/r/8812"
    }
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/activities",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "type": "call",
        "direction": "outbound",
        "subject": "Discovery call",
        "outcome": "connected",
        "duration_sec": 640,
        "lead_id": "e43414d6-f56f-42be-a64c-a836d6015efc",
        "metadata": {
            "recording_url": "https://calls.example.com/r/8812"
        }
    },
)
data = res.json()
Response201
{
  "id": "238b537f-c5c1-43c6-a882-dc25d67c8527",
  "user_from": "acme",
  "type": "call",
  "subject": "Discovery",
  "body": null,
  "outcome": "connected",
  "direction": null,
  "duration_sec": 600,
  "occurred_at": "2026-10-07T13:22:57.247+00:00",
  "actor_email": "olivia@acme.com",
  "lead_id": "8028ff76-1da4-451f-a0e7-dd91db772c20",
  "deal_id": null,
  "company_id": null,
  "metadata": {},
  "created_at": "2026-10-07T13:22:57.274612+00:00"
}
DELETE/activities/{id}

Delete an activity

Scope: delete

Path parameters

idstringrequired
Id of the record (UUID).
Request
curl -X DELETE "https://meetzy.me/api/v1/activities/e43414d6-f56f-42be-a64c-a836d6015efc" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/activities/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/activities/e43414d6-f56f-42be-a64c-a836d6015efc",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "deleted": true
}