Engage

Mailbox

Read, search, send, reply, forward, file and delete emails in the user’s own inbox — and the full email thread with any contact.

These calls work on the mailbox the key’s user connected in Meetzy (Gmail, Outlook / Microsoft 365 or IMAP) — the real inbox, not copies. Without one they answer 409 (mailbox_not_connected). Emails you send carry your signature and are logged on the contact’s timeline when the recipient is in the CRM. For tracked one-to-one or bulk emails from templates, see Email campaigns.

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/mailbox/folders

List folders

Folders and labels of the mailbox (Inbox, Sent, Archive, custom labels…) with their ids for move.

Scope: read

Answer: { folders: [...] } — the provider’s folders as it describes them (id, name, role such as inbox / sent, counts).

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

res = requests.get(
    "https://meetzy.me/api/v1/mailbox/folders",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200

See the notes on the left.

GET/mailbox/emails

List or search emails

Newest first. With q, a real search: mode=content (default) looks in subjects and bodies, mode=people in senders and recipients. Page with cursor.

Scope: read

Query parameters

qstring
Search text (switches to search).
modestring
content (default) or people — with q.
rolestring
inbox, sent or spam.
folderstring
A folder id.
fromstring
Sender address.
tostring
Recipient address.
afterdatetime
Received after.
beforedatetime
Received before.
limitinteger
Default 20.
cursorstring
Next page (from the previous answer).
Request
curl "https://meetzy.me/api/v1/mailbox/emails?q=order%20form&after=2026-09-01" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/mailbox/emails?q=order%20form&after=2026-09-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/mailbox/emails?q=order%20form&after=2026-09-01",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "items": [
    {
      "id": "em_7Hq…",
      "provider_id": "<CAF…@mail.gmail.com>",
      "thread_id": "th_19a…",
      "subject": "Re: Order form October",
      "from": "camille@payfit.com",
      "from_name": "Camille Laurent",
      "to": [
        "olivia@acme.com"
      ],
      "cc": [],
      "date": "2026-10-06T16:22:00Z",
      "role": "inbox",
      "read": true,
      "read_date": "2026-10-06T16:30:00Z",
      "folders": [
        "INBOX"
      ],
      "has_attachments": true,
      "snippet": "Here is the signed order form…"
    }
  ],
  "cursor": "eyJwYWdlIjoyfQ"
}
GET/mailbox/emails/{id}

Read an email

The full email: headers, HTML and plain bodies, and its attachments (download them with GET /mail/attachment).

Scope: read

Path parameters

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

res = requests.get(
    "https://meetzy.me/api/v1/mailbox/emails/e43414d6-f56f-42be-a64c-a836d6015efc",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "id": "em_7Hq…",
  "thread_id": "th_19a…",
  "subject": "Re: Order form October",
  "from": "camille@payfit.com",
  "to": [
    "olivia@acme.com"
  ],
  "cc": [],
  "date": "2026-10-06T16:22:00Z",
  "role": "inbox",
  "folders": [
    "INBOX"
  ],
  "body_html": "<p>Here is the signed order form…</p>",
  "body_plain": "Here is the signed order form…",
  "attachments": [
    {
      "id": "att_1",
      "name": "order-form-signed.pdf",
      "mime": "application/pdf",
      "size": 184220
    }
  ]
}
POST/mailbox/emails

Send an email

Sends from the user’s mailbox with their signature. Addresses: an array of emails (["a@x.com"]). Attachments: [{ "id": "…" }] (uploaded with the endpoints below), [{ "alias": "…" }], or small files inline [{ "filename": "deck.pdf", "content": "<base64>", "encoding": "base64", "contentType": "application/pdf" }].

Scope: write

Body

tostring[]required
Recipients.
subjectstringrequired
Subject.
bodystringrequired
Body, HTML or plain text.
ccstring[]
Copy.
bccstring[]
Blind copy.
attachmentsobject[]
Attachments.
in_reply_tostring
Provider message id of the email you answer (threading).
trackingboolean
Provider open / click tracking. Default false.
Request
curl -X POST "https://meetzy.me/api/v1/mailbox/emails" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": [
      "camille@payfit.com"
    ],
    "subject": "Your order form",
    "body": "<p>Hi Camille,</p><p>Please find your October order form attached.</p>",
    "attachments": [
      {
        "id": "f3a1c2d4"
      }
    ]
  }'
const res = await fetch("https://meetzy.me/api/v1/mailbox/emails", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "to": [
      "camille@payfit.com"
    ],
    "subject": "Your order form",
    "body": "<p>Hi Camille,</p><p>Please find your October order form attached.</p>",
    "attachments": [
      {
        "id": "f3a1c2d4"
      }
    ]
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/mailbox/emails",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "to": ["camille@payfit.com"],
        "subject": "Your order form",
        "body": "<p>Hi Camille,</p><p>Please find your October order form attached.</p>",
        "attachments": [
            {
                "id": "f3a1c2d4"
            }
        ]
    },
)
data = res.json()
Response201
{
  "sent": true,
  "signature_appended": true,
  "provider_response": {
    "tracking_id": "trk_8Kd…"
  }
}
POST/mailbox/drafts

Create a draft

Saves a draft in the mailbox (with the signature) for someone to review and send. Attachments: [{ "id": "…" }] (uploaded with the endpoints below), [{ "alias": "…" }], or small files inline [{ "filename": "deck.pdf", "content": "<base64>", "encoding": "base64", "contentType": "application/pdf" }].

Scope: write

Body

subjectstringrequired
Subject.
bodystringrequired
Body.
tostring[]
Recipients.
ccstring[]
Copy.
bccstring[]
Blind copy.
attachmentsobject[]
Attachments.
in_reply_tostring
Message id it answers.
Request
curl -X POST "https://meetzy.me/api/v1/mailbox/drafts" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": [
      "camille@payfit.com"
    ],
    "subject": "Proposal",
    "body": "Draft for review…"
  }'
const res = await fetch("https://meetzy.me/api/v1/mailbox/drafts", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "to": [
      "camille@payfit.com"
    ],
    "subject": "Proposal",
    "body": "Draft for review…"
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/mailbox/drafts",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "to": ["camille@payfit.com"],
        "subject": "Proposal",
        "body": "Draft for review…"
    },
)
data = res.json()
Response201
{
  "drafted": true,
  "signature_appended": true,
  "provider_response": {
    "id": "dr_2Lm…"
  }
}
POST/mailbox/emails/{id}/reply

Reply to an email

Replies in the thread (to the sender, or everyone with reply_all), with the signature. as_draft saves it instead of sending. Attachments: [{ "id": "…" }] (uploaded with the endpoints below), [{ "alias": "…" }], or small files inline [{ "filename": "deck.pdf", "content": "<base64>", "encoding": "base64", "contentType": "application/pdf" }].

Scope: write

Path parameters

idstringrequired
Id of the record (UUID).

Body

bodystringrequired
Reply.
reply_allboolean
Reply to all.
tostring[]
Override recipients.
ccstring[]
Copy.
bccstring[]
Blind copy.
attachmentsobject[]
Attachments.
as_draftboolean
Save as a draft.
Request
curl -X POST "https://meetzy.me/api/v1/mailbox/emails/e43414d6-f56f-42be-a64c-a836d6015efc/reply" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "body": "Thanks Camille — received, I’ll confirm the delivery date tomorrow."
  }'
const res = await fetch("https://meetzy.me/api/v1/mailbox/emails/e43414d6-f56f-42be-a64c-a836d6015efc/reply", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "body": "Thanks Camille — received, I’ll confirm the delivery date tomorrow."
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/mailbox/emails/e43414d6-f56f-42be-a64c-a836d6015efc/reply",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "body": "Thanks Camille — received, I’ll confirm the delivery date tomorrow."
    },
)
data = res.json()
Response201
{
  "ok": true,
  "action": "sent",
  "signature_appended": true,
  "provider_response": {}
}
POST/mailbox/emails/{id}/forward

Forward an email

Forwards with a message on top; the original attachments follow unless include_original_attachments: false.

Scope: write

Path parameters

idstringrequired
Id of the record (UUID).

Body

tostring[]required
Recipients.
bodystring
Message on top.
ccstring[]
Copy.
bccstring[]
Blind copy.
include_original_attachmentsboolean
Default true.
attachmentsobject[]
Extra attachments.
as_draftboolean
Save as a draft.
Request
curl -X POST "https://meetzy.me/api/v1/mailbox/emails/e43414d6-f56f-42be-a64c-a836d6015efc/forward" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": [
      "logistics@acme.com"
    ],
    "body": "Can you plan this delivery?"
  }'
const res = await fetch("https://meetzy.me/api/v1/mailbox/emails/e43414d6-f56f-42be-a64c-a836d6015efc/forward", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "to": [
      "logistics@acme.com"
    ],
    "body": "Can you plan this delivery?"
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/mailbox/emails/e43414d6-f56f-42be-a64c-a836d6015efc/forward",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "to": ["logistics@acme.com"],
        "body": "Can you plan this delivery?"
    },
)
data = res.json()
Response201
{
  "ok": true,
  "action": "sent",
  "signature_appended": true,
  "forwarded_attachments": 1,
  "provider_response": {}
}
POST/mailbox/emails/{id}/move

Move an email

Moves it to one or more folders / labels (ids from GET /mailbox/folders).

Scope: write

Path parameters

idstringrequired
Id of the record (UUID).

Body

foldersstring[]required
Target folders (or folder for one).
Request
curl -X POST "https://meetzy.me/api/v1/mailbox/emails/e43414d6-f56f-42be-a64c-a836d6015efc/move" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "folders": [
      "Label_12"
    ]
  }'
const res = await fetch("https://meetzy.me/api/v1/mailbox/emails/e43414d6-f56f-42be-a64c-a836d6015efc/move", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "folders": [
      "Label_12"
    ]
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/mailbox/emails/e43414d6-f56f-42be-a64c-a836d6015efc/move",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "folders": ["Label_12"]
    },
)
data = res.json()
Response201
{
  "ok": true
}
PATCH/mailbox/emails/{id}

Mark read or unread

Scope: write

Path parameters

idstringrequired
Id of the record (UUID).

Body

unreadbooleanrequired
true marks it unread, false read.
Request
curl -X PATCH "https://meetzy.me/api/v1/mailbox/emails/e43414d6-f56f-42be-a64c-a836d6015efc" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "unread": false
  }'
const res = await fetch("https://meetzy.me/api/v1/mailbox/emails/e43414d6-f56f-42be-a64c-a836d6015efc", {
  method: "PATCH",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "unread": false
  }),
});
const data = await res.json();
import os, requests

res = requests.patch(
    "https://meetzy.me/api/v1/mailbox/emails/e43414d6-f56f-42be-a64c-a836d6015efc",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "unread": False
    },
)
data = res.json()
Response200
{
  "ok": true
}
DELETE/mailbox/emails/{id}

Delete an email

Moves it to the trash of the mailbox.

Scope: delete

Path parameters

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

Uploaded attachments

Files you uploaded for sending, with their id and alias.

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

res = requests.get(
    "https://meetzy.me/api/v1/mailbox/attachments",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "items": [
    {
      "id": "f3a1c2d4",
      "filename": "order-form.pdf",
      "alias": "order-form",
      "size": 184220,
      "contentType": "application/pdf",
      "created_at": "2026-10-07T09:00:00Z"
    }
  ]
}
POST/mailbox/attachments/upload-ticket

Get an upload URL for a file

A one-time URL valid 10 minutes to upload large or binary files, then attach them by id: curl -X POST "<upload_url>" -H "X-Upload-Token: <token>" -F "file=@deck.pdf" returns { "uploaded": [{ "id", "filename", "alias" }] }.

Scope: write
Request
curl -X POST "https://meetzy.me/api/v1/mailbox/attachments/upload-ticket" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/mailbox/attachments/upload-ticket", {
  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/mailbox/attachments/upload-ticket",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response201
{
  "upload_url": "https://meetzy.me/api/mcp/upload-attachment",
  "token": "up_…",
  "expires_in_seconds": 600,
  "header": "X-Upload-Token",
  "curl_example": "curl -s -X POST \"https://meetzy.me/api/mcp/upload-attachment\" -H \"X-Upload-Token: up_…\" -F \"file=@/path/to/file\""
}
POST/mailbox/attachments/from-url

Attach a file from a URL

Downloads a public file and stores it as an attachment you can send by id.

Scope: write

Body

urlstringrequired
File URL.
filenamestring
File name.
contentTypestring
MIME type.
aliasstring
A name to refer to it.
Request
curl -X POST "https://meetzy.me/api/v1/mailbox/attachments/from-url" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://acme.com/files/catalogue-2026.pdf",
    "alias": "catalogue"
  }'
const res = await fetch("https://meetzy.me/api/v1/mailbox/attachments/from-url", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "url": "https://acme.com/files/catalogue-2026.pdf",
    "alias": "catalogue"
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/mailbox/attachments/from-url",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "url": "https://acme.com/files/catalogue-2026.pdf",
        "alias": "catalogue"
    },
)
data = res.json()
Response201
{
  "id": "f3a1c2d4",
  "filename": "catalogue-2026.pdf",
  "contentType": "application/pdf"
}
GET/contacts/{id}/mail

Email threads with a contact

Every email exchanged with the contact (all their addresses) in the user’s mailbox, grouped in threads, newest first: subject, participants, unread, attachments, whether you wrote last, and the messages. When nothing can be read, reason says why (no_email, not_connected, disconnected).

Scope: read

Path parameters

idstringrequired
Id of the record (UUID).

Query parameters

cursorstring
Next page.
show_hiddenstring
1 includes threads you hid.
hidden_onlystring
1 only hidden threads.
Request
curl "https://meetzy.me/api/v1/contacts/e43414d6-f56f-42be-a64c-a836d6015efc/mail" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/contacts/e43414d6-f56f-42be-a64c-a836d6015efc/mail", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/contacts/e43414d6-f56f-42be-a64c-a836d6015efc/mail",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "mailbox": {
    "email": "olivia@acme.com"
  },
  "threads": [
    {
      "id": "th_19a…",
      "subject": "Order form October",
      "last_date": "2026-10-06T16:22:00Z",
      "count": 3,
      "unread": false,
      "has_attachments": true,
      "participants": [
        {
          "email": "camille@payfit.com",
          "name": "Camille Laurent"
        },
        {
          "email": "olivia@acme.com",
          "name": "Olivia Martin"
        }
      ],
      "last_from_me": false,
      "snippet": "Here is the signed order form…",
      "hidden": false,
      "messages": []
    }
  ],
  "hidden_count": 0,
  "cursor": null
}
POST/contacts/{id}/mail/draft

Draft an email with AI

Writes a 1:1 email to the contact from a brief — new email, reply or forward — the way a good salesperson writes: a greeting line, short paragraphs, one clear next step and a closing line. No name is written at the end (the signature is added when you send). Nothing is sent.

Scope: write

Path parameters

idstringrequired
Id of the record (UUID).

Body

briefstringrequired
What the email should say.
modestring
new (default), reply, replyAll or forward.
conversationobject[]
The thread so far, oldest first: { from, sent, text } (sent = written by you).
languagestring
fr or en. Default: the conversation’s, else the brief’s.
subjectstring
The thread’s subject (replies).
Request
curl -X POST "https://meetzy.me/api/v1/contacts/e43414d6-f56f-42be-a64c-a836d6015efc/mail/draft" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "brief": "Thank her for the order, confirm delivery next Tuesday, ask if she needs testers",
    "mode": "new"
  }'
const res = await fetch("https://meetzy.me/api/v1/contacts/e43414d6-f56f-42be-a64c-a836d6015efc/mail/draft", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "brief": "Thank her for the order, confirm delivery next Tuesday, ask if she needs testers",
    "mode": "new"
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/contacts/e43414d6-f56f-42be-a64c-a836d6015efc/mail/draft",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "brief": "Thank her for the order, confirm delivery next Tuesday, ask if she needs testers",
        "mode": "new"
    },
)
data = res.json()
Response201
{
  "subject": "Your order and next Tuesday’s delivery",
  "text": "Hello Camille,\n\nThank you for your order…\n\nBest regards,",
  "html": "<div>Hello Camille,</div><div><br></div>…",
  "language": "en"
}
POST/contacts/{id}/mail

Write to a contact from the mailbox

A new email, a reply (reply_to_id) or a forward, from the user’s mailbox, with their signature, logged on the contact’s timeline. Attachments inline in base64 (up to 10).

Scope: write

Path parameters

idstringrequired
Id of the record (UUID).

Body

tostring[]required
Recipients (emails, or { email } objects).
subjectstring
Subject.
htmlstringrequired
Message (HTML or plain text).
ccstring[]
Copy.
bccstring[]
Blind copy.
reply_to_idstring
Provider id of the email answered.
forwardboolean
It is a forward.
quote_htmlstring
Original message quoted under the reply.
attachmentsobject[]
[{ filename, content (base64), contentType }].
signatureboolean
Append the signature. Default true.
Request
curl -X POST "https://meetzy.me/api/v1/contacts/e43414d6-f56f-42be-a64c-a836d6015efc/mail" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": [
      "camille@payfit.com"
    ],
    "subject": "Following up",
    "html": "Hi Camille,\n\nAny news on the order form?"
  }'
const res = await fetch("https://meetzy.me/api/v1/contacts/e43414d6-f56f-42be-a64c-a836d6015efc/mail", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "to": [
      "camille@payfit.com"
    ],
    "subject": "Following up",
    "html": "Hi Camille,\n\nAny news on the order form?"
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/contacts/e43414d6-f56f-42be-a64c-a836d6015efc/mail",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "to": ["camille@payfit.com"],
        "subject": "Following up",
        "html": "Hi Camille,\n\nAny news on the order form?"
    },
)
data = res.json()
Response201
{
  "sent": true,
  "from": "olivia@acme.com",
  "id": "em_9Pz…"
}
POST/mail/hidden

Hide or show a thread

Hides a thread from the contact’s email tab (newsletters, internal noise) — it stays in the mailbox.

Scope: write

Body

thread_idstringrequired
Thread id.
hiddenboolean
Default true.
Request
curl -X POST "https://meetzy.me/api/v1/mail/hidden" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "thread_id": "th_19a…",
    "hidden": true
  }'
const res = await fetch("https://meetzy.me/api/v1/mail/hidden", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "thread_id": "th_19a…",
    "hidden": true
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/mail/hidden",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "thread_id": "th_19a…",
        "hidden": True
    },
)
data = res.json()
Response201
{
  "ok": true,
  "hidden": true
}
GET/mail/attachment

Download an attachment

Streams the file (binary, with its content type).

Scope: read

Query parameters

email_idstringrequired
Email id.
attachment_idstringrequired
Attachment id.
namestring
File name to download as.

Answers the file itself, not JSON.

Request
curl "https://meetzy.me/api/v1/mail/attachment?email_id=em_7Hq…&attachment_id=att_1&name=order-form.pdf" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/mail/attachment?email_id=em_7Hq…&attachment_id=att_1&name=order-form.pdf", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/mail/attachment?email_id=em_7Hq…&attachment_id=att_1&name=order-form.pdf",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200

See the notes on the left.

GET/mail/address-book

Address book

Every address a “To” field can suggest, in one call — people you email (most first, n = emails sent to them lately), your team and the CRM’s contacts — to filter locally as someone types.

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

res = requests.get(
    "https://meetzy.me/api/v1/mail/address-book",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "people": [
    {
      "email": "camille@payfit.com",
      "name": "Camille Laurent",
      "source": "mailbox",
      "n": 12
    },
    {
      "email": "marc@globex.com",
      "name": "Marc Dupuis",
      "source": "crm",
      "company": "Globex"
    }
  ],
  "at": "2026-10-08T09:00:00.000Z"
}
GET/mail/suggestions

Address suggestions

People you email most and CRM contacts matching a text — for a “To” field.

Scope: read

Query parameters

qstring
Start of a name or address.
Request
curl "https://meetzy.me/api/v1/mail/suggestions?q=cam" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/mail/suggestions?q=cam", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/mail/suggestions?q=cam",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "suggestions": [
    {
      "email": "camille@payfit.com",
      "name": "Camille Laurent",
      "source": "crm"
    }
  ]
}