Engage

Workflows

Event-driven automations with conditions, branches, waits, goals and 25+ actions — build, activate, preview, run on demand, or trigger from any tool.

A workflow starts when its trigger happens to a record (or on a schedule), checks its conditions, then runs its actions one by one — waiting, branching, creating tasks and deals, sending emails and messages, calling webhooks. Activation validates every step (a send_email needs a template or content, a Slack step a webhook URL…) and answers 400 with what to fix.

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/automations/catalog

What a workflow can use here

Everything needed to build a workflow in this workspace without guessing: triggers (with their config options and the record they start on), steps (with their fields, options and branches), condition fields and operators, merge tags, and the workspace’s own sales_cycles (stages, and the playbook written for each), pipelines, sequences, email_templates, email_campaigns, team and existing workflows — plus templates, the building rules and what is not possible (limits). Made for API clients and AI assistants.

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

res = requests.get(
    "https://meetzy.me/api/v1/automations/catalog",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "triggers": [
    {
      "type": "contact.email_sent",
      "label": "You emailed the contact (any mailbox: Outlook, Gmail…)",
      "group": "Contacts",
      "record": "contact",
      "config": []
    }
  ],
  "steps": [
    {
      "type": "move_cycle_stage",
      "label": "Move to a stage of their sales cycle",
      "group": "Contact",
      "fields": [
        {
          "key": "stage",
          "label": "Stage",
          "type": "cycle_stage"
        },
        {
          "key": "forward_only",
          "label": "Only move forward",
          "type": "select",
          "options": [
            "yes",
            "no"
          ],
          "default": "yes"
        }
      ]
    }
  ],
  "conditions": {
    "operators": [
      "eq",
      "neq",
      "contains",
      "not_contains",
      "gt",
      "gte",
      "lt",
      "lte",
      "is_set",
      "is_not_set",
      "in"
    ]
  },
  "workspace": {
    "sales_cycles": [
      {
        "id": "default",
        "name": "Prospects",
        "is_default": true,
        "stages": [
          {
            "id": "new_leads",
            "name": "New leads"
          },
          {
            "id": "contacted",
            "name": "Contacted",
            "playbook": "First reach-out on WhatsApp — best reply rate."
          }
        ]
      }
    ]
  },
  "rules": [
    "Shape: { name, description, trigger: { type, config }, conditions, actions, settings, status }."
  ],
  "limits": [
    "No custom code and no loops — chain workflows with \"enroll_workflow\" instead."
  ]
}
POST/automations/check

Check a workflow before saving

Send a workflow body: get errors (it would be refused) and warnings (it would be saved, but probably not as meant — an unknown field, a repeating trigger without allow_reenroll…). Nothing is saved. Creating and updating return the same errors (400) and warnings.

Scope: write

Body

namestring
Name.
triggerobject
Trigger.
conditionsobject
Conditions.
actionsobject[]
Steps.
settingsobject
Settings.
statusstring
active checks it as if turning it on.
Request
curl -X POST "https://meetzy.me/api/v1/automations/check" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Email → Contacted",
    "trigger": {
      "type": "contact.email_sent"
    },
    "actions": [
      {
        "type": "move_cycle_stage",
        "config": {
          "stage": "Contacted"
        }
      }
    ]
  }'
const res = await fetch("https://meetzy.me/api/v1/automations/check", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "name": "Email → Contacted",
    "trigger": {
      "type": "contact.email_sent"
    },
    "actions": [
      {
        "type": "move_cycle_stage",
        "config": {
          "stage": "Contacted"
        }
      }
    ]
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/automations/check",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "name": "Email → Contacted",
        "trigger": {
            "type": "contact.email_sent"
        },
        "actions": [
            {
                "type": "move_cycle_stage",
                "config": {
                    "stage": "Contacted"
                }
            }
        ]
    },
)
data = res.json()
Response201
{
  "errors": [],
  "warnings": [
    "This trigger happens many times for the same record: set settings.allow_reenroll = true, or a record runs it only once."
  ]
}
GET/automations/templates

Workflow templates

Ready-made recipes available in this workspace: key, category, name, description, trigger, steps and what you choose after creating it (needs).

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

res = requests.get(
    "https://meetzy.me/api/v1/automations/templates",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "templates": [
    {
      "key": "email_moves_stage",
      "category": "Sales cycle on autopilot",
      "name": "First email sent → next stage of their sales cycle",
      "trigger": "contact.email_sent",
      "steps": [
        "move_cycle_stage"
      ],
      "needs": [
        "the stage to move to"
      ]
    }
  ]
}
POST/automations/from-template

Create a workflow from a template

A template as a new draft. overrides replaces its trigger, conditions, steps or settings (e.g. to set the stage it needs).

Scope: write

Body

keystringrequired
Template key.
namestring
Name (default: the template’s).
overridesobject
{ trigger, conditions, actions, settings }.
Request
curl -X POST "https://meetzy.me/api/v1/automations/from-template" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "key": "email_moves_stage",
    "name": "Email → Contacted",
    "overrides": {
      "actions": [
        {
          "type": "move_cycle_stage",
          "config": {
            "stage": "Contacted"
          }
        }
      ]
    }
  }'
const res = await fetch("https://meetzy.me/api/v1/automations/from-template", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "key": "email_moves_stage",
    "name": "Email → Contacted",
    "overrides": {
      "actions": [
        {
          "type": "move_cycle_stage",
          "config": {
            "stage": "Contacted"
          }
        }
      ]
    }
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/automations/from-template",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "key": "email_moves_stage",
        "name": "Email → Contacted",
        "overrides": {
            "actions": [
                {
                    "type": "move_cycle_stage",
                    "config": {
                        "stage": "Contacted"
                    }
                }
            ]
        }
    },
)
data = res.json()
Response201

Empty answer.

GET/automations

List workflows

Every workflow with its trigger, conditions, actions, settings, status (draft, active, paused) and counters.

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

res = requests.get(
    "https://meetzy.me/api/v1/automations",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "automations": [
    {
      "id": "3aba8ed9-a884-4f32-a536-43ec8685e640",
      "user_from": "acme",
      "name": "Tag inbound leads",
      "description": null,
      "status": "draft",
      "trigger": {
        "type": "contact.created"
      },
      "conditions": {
        "match": "all",
        "rules": []
      },
      "actions": [
        {
          "id": "a0_0_bdf1du",
          "type": "add_tag",
          "config": {
            "tag": "from-api"
          }
        }
      ],
      "settings": {},
      "stats": {
        "runs": 0,
        "failed": 0,
        "completed": 0
      },
      "template_key": null,
      "inbound_token": "8a71b47c499f34f0a3ffb94154523014",
      "next_run_at": null,
      "last_run_at": null,
      "created_by": "olivia@acme.com",
      "created_at": "2026-10-07T13:23:21.971442+00:00",
      "updated_at": "2026-10-07T13:23:21.971442+00:00"
    },
    {
      "id": "8729063c-509a-40e2-aa01-f89e98801698",
      "user_from": "acme",
      "name": "Tag inbound leads (copy)",
      "description": null,
      "status": "draft",
      "trigger": {
        "type": "contact.created"
      },
      "conditions": {
        "match": "all",
        "rules": []
      },
      "actions": [
        {
          "id": "a0_0_649rr7",
          "type": "add_tag",
          "config": {
            "tag": "from-api"
          }
        }
      ],
      "settings": {
        "rr_pointer": 0
      },
      "stats": {
        "runs": 0,
        "failed": 0,
        "completed": 0
      },
      "template_key": null,
      "inbound_token": "bc497da644d1b9b1234887e06bcc180c",
      "next_run_at": null,
      "last_run_at": null,
      "created_by": "olivia@acme.com",
      "created_at": "2026-10-07T13:20:30.622812+00:00",
      "updated_at": "2026-10-07T13:20:30.622812+00:00"
    }
  ]
}
POST/automations

Create a workflow

Trigger — { "type": "<event>", "config": { … } }. Any event type (contact.created, deal.stage_changed, contact.replied, webhook.received…) with its optional config (e.g. deal.stage_changed: pipeline_id, to; contact.score_changed: above — see trigger config), or a schedule: { "type": "schedule", "config": { "frequency": "daily" | "weekdays" | "weekly", "time": "09:00", "weekday": 1, "timezone": "Europe/Paris" } }. Conditions — who may enter: { "match": "all" | "any", "rules": [{ "field": "lead_score", "op": "gte", "value": 50 }] }. Fields of the contact, deal, company or task, plus related fields (company.industry, deal.amount…) — see condition fields and operators. Actions — the steps, in order: [{ "type": "create_task", "config": { "title": "Call {{contact.name}}", "type": "call", "due_in_days": 1 } }]. Branching steps carry their own lists: if_else → branches: { yes: [...], no: [...] } with config.rules, ab_split → branches: { a: [...], b: [...] }. Every action and its config fields are in the action reference; merge tags work in every text. Settings — goal ({ match, rules }: a run ends as soon as the record matches it), exit_on_events (event types that end the run, e.g. ["contact.meeting_booked"]), allow_reenroll (default false: once per record), max_runs_per_day, continue_on_error, and for inbound triggers create_contact (default true).

Scope: write

Body

namestringrequired
Name.
triggerobjectrequired
What starts it (type required).
conditionsobject
Who may enter. Default: everyone.
actionsobject[]
Steps.
settingsobject
Goal, exits, limits.
statusstring
draft (default), active or paused.
descriptionstring
Description.
Request
curl -X POST "https://meetzy.me/api/v1/automations" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Smart follow-up",
    "status": "active",
    "trigger": {
      "type": "email.sent"
    },
    "conditions": {
      "match": "all",
      "rules": [
        {
          "field": "lifecycle_stage",
          "op": "in",
          "value": "lead,mql"
        }
      ]
    },
    "actions": [
      {
        "type": "wait_for_event",
        "config": {
          "event_type": "contact.replied",
          "timeout_days": 3
        }
      },
      {
        "type": "if_else",
        "config": {
          "match": "all",
          "rules": [
            {
              "field": "wait.result",
              "op": "eq",
              "value": "received"
            }
          ]
        },
        "branches": {
          "yes": [
            {
              "type": "update_contact",
              "config": {
                "field": "lifecycle_stage",
                "value": "sql"
              }
            },
            {
              "type": "create_task",
              "config": {
                "title": "Call {{contact.name}} — replied",
                "type": "call",
                "due_in_days": 0,
                "priority": "high"
              }
            }
          ],
          "no": [
            {
              "type": "send_linkedin_invite",
              "config": {}
            }
          ]
        }
      }
    ],
    "settings": {
      "exit_on_events": [
        "contact.meeting_booked"
      ]
    }
  }'
const res = await fetch("https://meetzy.me/api/v1/automations", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "name": "Smart follow-up",
    "status": "active",
    "trigger": {
      "type": "email.sent"
    },
    "conditions": {
      "match": "all",
      "rules": [
        {
          "field": "lifecycle_stage",
          "op": "in",
          "value": "lead,mql"
        }
      ]
    },
    "actions": [
      {
        "type": "wait_for_event",
        "config": {
          "event_type": "contact.replied",
          "timeout_days": 3
        }
      },
      {
        "type": "if_else",
        "config": {
          "match": "all",
          "rules": [
            {
              "field": "wait.result",
              "op": "eq",
              "value": "received"
            }
          ]
        },
        "branches": {
          "yes": [
            {
              "type": "update_contact",
              "config": {
                "field": "lifecycle_stage",
                "value": "sql"
              }
            },
            {
              "type": "create_task",
              "config": {
                "title": "Call {{contact.name}} — replied",
                "type": "call",
                "due_in_days": 0,
                "priority": "high"
              }
            }
          ],
          "no": [
            {
              "type": "send_linkedin_invite",
              "config": {}
            }
          ]
        }
      }
    ],
    "settings": {
      "exit_on_events": [
        "contact.meeting_booked"
      ]
    }
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/automations",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "name": "Smart follow-up",
        "status": "active",
        "trigger": {
            "type": "email.sent"
        },
        "conditions": {
            "match": "all",
            "rules": [
                {
                    "field": "lifecycle_stage",
                    "op": "in",
                    "value": "lead,mql"
                }
            ]
        },
        "actions": [
            {
                "type": "wait_for_event",
                "config": {
                    "event_type": "contact.replied",
                    "timeout_days": 3
                }
            },
            {
                "type": "if_else",
                "config": {
                    "match": "all",
                    "rules": [
                        {
                            "field": "wait.result",
                            "op": "eq",
                            "value": "received"
                        }
                    ]
                },
                "branches": {
                    "yes": [
                        {
                            "type": "update_contact",
                            "config": {
                                "field": "lifecycle_stage",
                                "value": "sql"
                            }
                        },
                        {
                            "type": "create_task",
                            "config": {
                                "title": "Call {{contact.name}} — replied",
                                "type": "call",
                                "due_in_days": 0,
                                "priority": "high"
                            }
                        }
                    ],
                    "no": [
                        {
                            "type": "send_linkedin_invite",
                            "config": {}
                        }
                    ]
                }
            }
        ],
        "settings": {
            "exit_on_events": ["contact.meeting_booked"]
        }
    },
)
data = res.json()
Response201
{
  "id": "3aba8ed9-a884-4f32-a536-43ec8685e640",
  "user_from": "acme",
  "name": "Tag inbound leads",
  "description": null,
  "status": "draft",
  "trigger": {
    "type": "contact.created"
  },
  "conditions": {
    "match": "all",
    "rules": []
  },
  "actions": [
    {
      "id": "a0_0_bdf1du",
      "type": "add_tag",
      "config": {
        "tag": "from-api"
      }
    }
  ],
  "settings": {},
  "stats": {
    "runs": 0,
    "failed": 0,
    "completed": 0
  },
  "template_key": null,
  "inbound_token": "8a71b47c499f34f0a3ffb94154523014",
  "next_run_at": null,
  "last_run_at": null,
  "created_by": "olivia@acme.com",
  "created_at": "2026-10-07T13:23:21.971442+00:00",
  "updated_at": "2026-10-07T13:23:21.971442+00:00"
}
GET/automations/{id}

Get a workflow and its runs

The workflow, its last 500 runs (status, step reached, waiting until, errors, log) and per-step stats: how many runs reached, completed, failed or wait on each step, and the YES / NO, A / B split of branches.

Scope: read

Path parameters

idstringrequired
Id of the record (UUID).
Request
curl "https://meetzy.me/api/v1/automations/e43414d6-f56f-42be-a64c-a836d6015efc" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/automations/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/automations/e43414d6-f56f-42be-a64c-a836d6015efc",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "automation": {
    "id": "3aba8ed9-a884-4f32-a536-43ec8685e640",
    "user_from": "acme",
    "name": "Tag inbound leads",
    "description": null,
    "status": "draft",
    "trigger": {
      "type": "contact.created"
    },
    "conditions": {
      "match": "all",
      "rules": []
    },
    "actions": [
      {
        "id": "a0_0_bdf1du",
        "type": "add_tag",
        "config": {
          "tag": "from-api"
        }
      }
    ],
    "settings": {},
    "stats": {
      "runs": 0,
      "failed": 0,
      "completed": 0
    },
    "template_key": null,
    "inbound_token": "8a71b47c499f34f0a3ffb94154523014",
    "next_run_at": null,
    "last_run_at": null,
    "created_by": "olivia@acme.com",
    "created_at": "2026-10-07T13:23:21.971442+00:00",
    "updated_at": "2026-10-07T13:23:21.971442+00:00"
  },
  "runs": [],
  "step_stats": {},
  "run_counts": {}
}
PATCH/automations/{id}

Update, activate or pause

Send what changes. status: "active" validates the steps first; status: "paused" stops waiting runs.

Scope: write

Path parameters

idstringrequired
Id of the record (UUID).

Body

namestring
Name.
triggerobject
Trigger.
conditionsobject
Conditions.
actionsobject[]
Steps (replace all).
settingsobject
Settings.
statusstring
Status.
descriptionstring
Description.
Request
curl -X PATCH "https://meetzy.me/api/v1/automations/e43414d6-f56f-42be-a64c-a836d6015efc" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "active"
  }'
const res = await fetch("https://meetzy.me/api/v1/automations/e43414d6-f56f-42be-a64c-a836d6015efc", {
  method: "PATCH",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "status": "active"
  }),
});
const data = await res.json();
import os, requests

res = requests.patch(
    "https://meetzy.me/api/v1/automations/e43414d6-f56f-42be-a64c-a836d6015efc",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "status": "active"
    },
)
data = res.json()
Response200
{
  "id": "3aba8ed9-a884-4f32-a536-43ec8685e640",
  "user_from": "acme",
  "name": "Tag inbound leads",
  "description": null,
  "status": "active",
  "trigger": {
    "type": "contact.created"
  },
  "conditions": {
    "match": "all",
    "rules": []
  },
  "actions": [
    {
      "id": "a0_0_bdf1du",
      "type": "add_tag",
      "config": {
        "tag": "from-api"
      }
    }
  ],
  "settings": {},
  "stats": {
    "runs": 0,
    "failed": 0,
    "completed": 0
  },
  "template_key": null,
  "inbound_token": "8a71b47c499f34f0a3ffb94154523014",
  "next_run_at": null,
  "last_run_at": null,
  "created_by": "olivia@acme.com",
  "created_at": "2026-10-07T13:23:21.971442+00:00",
  "updated_at": "2026-10-07T13:23:21.971442+00:00"
}
DELETE/automations/{id}

Delete a workflow

Scope: delete

Path parameters

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

Duplicate a workflow

Copy as a draft, named “(copy)”.

Scope: write

Path parameters

idstringrequired
Id of the record (UUID).
Request
curl -X POST "https://meetzy.me/api/v1/automations/e43414d6-f56f-42be-a64c-a836d6015efc/duplicate" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/automations/e43414d6-f56f-42be-a64c-a836d6015efc/duplicate", {
  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/automations/e43414d6-f56f-42be-a64c-a836d6015efc/duplicate",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response201
{
  "id": "cf673d76-b486-444a-a4e0-82b63890441b",
  "user_from": "acme",
  "name": "Tag inbound leads (copy)",
  "description": null,
  "status": "draft",
  "trigger": {
    "type": "contact.created"
  },
  "conditions": {
    "match": "all",
    "rules": []
  },
  "actions": [
    {
      "id": "a0_0_bdf1du",
      "type": "add_tag",
      "config": {
        "tag": "from-api"
      }
    }
  ],
  "settings": {
    "rr_pointer": 0
  },
  "stats": {
    "runs": 0,
    "failed": 0,
    "completed": 0
  },
  "template_key": null,
  "inbound_token": "b3a90b090bfdafb8b5a7b004f190ad13",
  "next_run_at": null,
  "last_run_at": null,
  "created_by": "olivia@acme.com",
  "created_at": "2026-10-07T13:23:25.031276+00:00",
  "updated_at": "2026-10-07T13:23:25.031276+00:00"
}
POST/automations/{id}/run

Run a workflow on records now

Enrolls up to 500 contacts or deals right away, ignoring the trigger and conditions (event workflow.enrolled). Re-enrollment is allowed.

Scope: write

Path parameters

idstringrequired
Id of the record (UUID).

Body

contact_idsuuid[]
Contacts to run it on.
deal_idsuuid[]
Deals to run it on.
Request
curl -X POST "https://meetzy.me/api/v1/automations/e43414d6-f56f-42be-a64c-a836d6015efc/run" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contact_ids": [
      "e43414d6-f56f-42be-a64c-a836d6015efc"
    ]
  }'
const res = await fetch("https://meetzy.me/api/v1/automations/e43414d6-f56f-42be-a64c-a836d6015efc/run", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "contact_ids": [
      "e43414d6-f56f-42be-a64c-a836d6015efc"
    ]
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/automations/e43414d6-f56f-42be-a64c-a836d6015efc/run",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "contact_ids": ["e43414d6-f56f-42be-a64c-a836d6015efc"]
    },
)
data = res.json()
Response201
{
  "started": 1,
  "results": [
    {
      "contact_id": "e43414d6-f56f-42be-a64c-a836d6015efc",
      "run_id": "0c2f1e3d-5b6a-4c7d-8e9f-a0b1c2d3e4f5"
    }
  ]
}
POST/automations/{id}/preview

Who matches a workflow now

How many contacts match the workflow’s conditions (or the conditions you send), with a sample — before you activate it.

Scope: write

Path parameters

idstringrequired
Id of the record (UUID).

Body

conditionsobject
Conditions to test instead of the saved ones.
Request
curl -X POST "https://meetzy.me/api/v1/automations/e43414d6-f56f-42be-a64c-a836d6015efc/preview" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/automations/e43414d6-f56f-42be-a64c-a836d6015efc/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/automations/e43414d6-f56f-42be-a64c-a836d6015efc/preview",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response201
{
  "total": 1,
  "matching": 1,
  "approximate": false,
  "sample": [
    {
      "id": "8028ff76-1da4-451f-a0e7-dd91db772c20",
      "name": "Camille Laurent",
      "company": "Payfit",
      "score": 40
    }
  ]
}
POST/automations/preview

Who matches some conditions

Same as above without a saved workflow.

Scope: write

Body

conditionsobjectrequired
Conditions to test.
Request
curl -X POST "https://meetzy.me/api/v1/automations/preview" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "conditions": {
      "match": "all",
      "rules": [
        {
          "field": "lead_score",
          "op": "gte",
          "value": 60
        },
        {
          "field": "company.employees",
          "op": "gt",
          "value": 50
        }
      ]
    }
  }'
const res = await fetch("https://meetzy.me/api/v1/automations/preview", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "conditions": {
      "match": "all",
      "rules": [
        {
          "field": "lead_score",
          "op": "gte",
          "value": 60
        },
        {
          "field": "company.employees",
          "op": "gt",
          "value": 50
        }
      ]
    }
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/automations/preview",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "conditions": {
            "match": "all",
            "rules": [
                {
                    "field": "lead_score",
                    "op": "gte",
                    "value": 60
                },
                {
                    "field": "company.employees",
                    "op": "gt",
                    "value": 50
                }
            ]
        }
    },
)
data = res.json()
Response201
{
  "total": 1840,
  "matching": 214,
  "approximate": false,
  "sample": [
    {
      "id": "e43414d6-f56f-42be-a64c-a836d6015efc",
      "name": "Camille Laurent",
      "company": "Payfit"
    }
  ]
}
POST/inbound/{token}

Trigger a workflow from any tool

For workflows with the trigger webhook.received or form.submitted: each one has a secret URL https://meetzy.me/api/v1/inbound/{token} (shown in the app). Post JSON or a plain HTML form to it — no API key, the token is the secret. The contact is found by email or created (first name, last name, company, title, phone, source), then the workflow runs with the whole payload available as {{event.*}}. HTML forms can send _redirect (or ?redirect=) to land on a thank-you page.

No API key

Path parameters

tokenstringrequired
The workflow’s inbound token (its secret URL).

Body

emailstring
Contact email (also contact.email, primary_email).
contact_iduuid
Or an existing contact.
first_namestring
First name (also firstName).
last_namestring
Last name (also lastName).
companystring
Company.
titlestring
Job title (also job_title).
phonestring
Phone.
sourcestring
Source. Default webhook or form.
…any
Any other field, readable in the workflow.

Answers 202. 404 for an unknown token, 409 when the workflow is not active.

Request
curl -X POST "https://meetzy.me/api/v1/inbound/inb_9f3c2a71e4b84d0c" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "camille@payfit.com",
    "first_name": "Camille",
    "company": "Payfit",
    "plan": "Business",
    "message": "Can we talk about SAP?"
  }'
const res = await fetch("https://meetzy.me/api/v1/inbound/inb_9f3c2a71e4b84d0c", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    "email": "camille@payfit.com",
    "first_name": "Camille",
    "company": "Payfit",
    "plan": "Business",
    "message": "Can we talk about SAP?"
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/inbound/inb_9f3c2a71e4b84d0c",
    json={
        "email": "camille@payfit.com",
        "first_name": "Camille",
        "company": "Payfit",
        "plan": "Business",
        "message": "Can we talk about SAP?"
    },
)
data = res.json()
Response202
{
  "accepted": true,
  "run_id": "0c2f1e3d-5b6a-4c7d-8e9f-a0b1c2d3e4f5",
  "contact_id": "e43414d6-f56f-42be-a64c-a836d6015efc"
}