Reference
Every event type, workflow trigger, condition field, operator, action, sequence step, merge tag, stage and period — the values the API accepts.
The same lists are served by GET /catalog (no API key needed), so an integration can build its pickers from them.
API scopes
| Scope | Allows |
|---|---|
read | Read CRM data |
write | Create & update records |
delete | Delete records |
webhooks | Manage webhooks |
mcp | Use as MCP token (Codex, Cursor, …) |
Event types
| Event | When | Group |
|---|---|---|
contact.created | Contact created | Contacts |
contact.stage_changed | Contact pipeline stage changed | Contacts |
contact.status_changed | Contact status changed | Contacts |
contact.lifecycle_changed | Lifecycle stage changed | Contacts |
contact.score_changed | Lead score changed | Contacts |
contact.owner_changed | Contact owner changed | Contacts |
contact.replied | Contact replied (email, LinkedIn, WhatsApp) | Contacts |
contact.email_sent | You emailed the contact (any mailbox: Outlook, Gmail…) | Contacts |
contact.email_received | The contact emailed you (any mailbox) | Contacts |
contact.message_received | WhatsApp / LinkedIn message received | Contacts |
contact.message_sent | You sent a WhatsApp / LinkedIn message (any device) | Contacts |
contact.email_opened | Email opened | Contacts |
contact.email_clicked | Email link clicked | Contacts |
contact.website_visit | Visited the website | Contacts |
contact.meeting_booked | Meeting booked | Contacts |
contact.linkedin_connected | LinkedIn invitation accepted | Contacts |
contact.tags_changed | Labels / tags changed | Contacts |
contact.note_added | Note added | Contacts |
contact.property_changed | Contact property changed | Contacts |
contact.deleted | Contact deleted | Contacts |
deal.created | Deal created | Deals |
deal.stage_changed | Deal stage changed | Deals |
deal.won | Deal won | Deals |
deal.lost | Deal lost | Deals |
deal.reopened | Deal reopened | Deals |
deal.amount_changed | Deal amount changed | Deals |
deal.owner_changed | Deal owner changed | Deals |
deal.rotting | Deal stuck in stage too long | Deals |
deal.overdue | Deal past its close date | Deals |
deal.property_changed | Deal property changed | Deals |
company.created | Company created | Companies |
company.lifecycle_changed | Company lifecycle changed | Companies |
task.created | Task created | Tasks |
task.completed | Task completed | Tasks |
task.overdue | Task overdue | Tasks |
quote.sent | Quote sent | Quotes |
quote.viewed | Quote viewed | Quotes |
quote.accepted | Quote accepted | Quotes |
quote.declined | Quote declined | Quotes |
sequence.enrolled | Enrolled in sequence | Sequences |
sequence.completed | Sequence completed | Sequences |
sequence.exited | Exited sequence | Sequences |
email.sent | Email sent (campaign or workflow) | |
email.opened | Email opened | |
email.clicked | Link clicked in an email | |
email.failed | Email could not be sent | |
contact.unsubscribed | Contact unsubscribed | |
webhook.received | Inbound webhook (n8n, Zapier, forms…) | External |
form.submitted | Form submitted | External |
workflow.enrolled | Enrolled manually (CRM, another workflow, API, Claude) | External |
Trigger config
Optional settings of a workflow trigger, in trigger.config. Every event type can be a trigger; a schedule trigger is { "type": "schedule", "config": { "frequency": "daily" | "weekdays" | "weekly", "time": "09:00", "weekday": 1, "timezone": "Europe/Paris" } }.
| Trigger | Config |
|---|---|
email.sent | campaign_id — Campaign |
email.opened | campaign_id — Campaign |
email.clicked | campaign_id — Campaign |
contact.stage_changed | to — New stage is |
contact.score_changed | above — Score crosses above |
contact.lifecycle_changed | to — New lifecycle is |
contact.website_visit | min_visits — Min. total visits |
contact.property_changed | property — Property |
deal.property_changed | property — Property |
deal.stage_changed | pipeline_id — Pipeline · to — New stage is |
deal.amount_changed | above — Amount above |
deal.rotting | days — Days in stage (overrides stage rot) |
Fields watched by contact.property_changed: pipeline_stage, lead_status, lifecycle_stage, lead_score, assigned_to, title, company, company_id, phone, primary_email, country, city, tags, do_not_contact, custom_properties. By deal.property_changed: stage_id, status, amount, close_date, owner_email, priority, next_step, probability, company_id, custom.
Condition fields
| Field | Label | Type |
|---|---|---|
lead_score | Lead score | number |
sales_cycle_id | Sales cycle | sales_cycle |
pipeline_stage | Stage (in their sales cycle) | contact_stage |
lifecycle_stage | Lifecycle stage | lifecycle |
lead_status | Status | text |
assigned_to | Owner | owner |
primary_email | text | |
company | Company name | text |
title | Job title | text |
seniority | Seniority | text |
country | Country | text |
organization_industry | Industry | text |
organization_num_employees | Company size | number |
primary_source | Source | text |
total_email_replies | Email replies | number |
total_emails_opened | Emails opened | number |
total_website_visits | Website visits | number |
linkedin_connection_status | LinkedIn status | text |
tags | Tags | array |
do_not_contact | Do not contact | boolean |
days_since_last_contact | Days since last contacted (computed) | number |
days_since_created | Days since created (computed) | number |
open_deals_count | Open deals (computed) | number |
open_deals_amount | Open deals amount (computed) | number |
won_deals_count | Won deals (computed) | number |
active_sequences | Active sequences (computed) | number |
open_tasks | Open tasks (computed) | number |
email_domain | Email domain (computed) | text |
| Field | Label | Type |
|---|---|---|
amount | Amount | number |
stage_id | Stage | deal_stage |
pipeline_id | Pipeline | pipeline |
status | Status | text |
owner_email | Owner | owner |
priority | Priority | text |
deal_type | Deal type | text |
source | Source | text |
tags | Tags | array |
| Field | Label | Type |
|---|---|---|
name | Name | text |
industry | Industry | text |
employees | Employees | number |
country | Country | text |
lifecycle_stage | Lifecycle | lifecycle |
tier | Tier | text |
| Field | Label | Type |
|---|---|---|
type | Type | text |
priority | Priority | text |
owner_email | Owner | owner |
| Field | Label | Type |
|---|---|---|
company.name | Company: name | text |
company.industry | Company: industry | text |
company.employees | Company: employees | number |
company.tier | Company: ABM tier | text |
company.lifecycle_stage | Company: lifecycle | lifecycle |
company.country | Company: country | text |
deal.amount | Deal: amount | number |
deal.stage_id | Deal: stage | deal_stage |
deal.status | Deal: status | text |
deal.days_in_stage | Deal: days in stage | number |
deal.days_to_close | Deal: days to close date | number |
wait.result | Workflow: last wait result (received / timeout) | text |
split.variant | Workflow: A/B variant (a / b) | text |
event.from | Trigger: previous value | text |
event.to | Trigger: new value | text |
event.subject | Email: subject | text |
event.snippet | Email / message: text (beginning) | text |
event.channel | Message: channel (whatsapp, linkedin, email) | text |
event.nth | Email: how many emails you sent them (this one included) | number |
event.in_copy | Email: they were only in copy (true / false) | text |
event.mailbox | Email: mailbox it went through | text |
Condition operators
| Operator | Means |
|---|---|
eq | is |
neq | is not |
contains | contains |
not_contains | does not contain |
gt | greater than |
gte | at least |
lt | less than |
lte | at most |
is_set | is known |
is_not_set | is unknown |
in | is any of (comma separated) |
Workflow actions
Each step is { "type": "<action>", "config": { … } }; if_else and ab_split carry branches.
| Action | Does | Config |
|---|---|---|
delay | Pause before the next step. | amount, unit (minutes, hours, days, business_days) |
wait_until | Pause until the contact matches a condition (checked every run, with timeout). | field, op, value, timeout_days |
if_else | Split the flow into a YES path and a NO path based on conditions. | branches: yes, no |
ab_split | Randomly send records down path A or B (e.g. test two emails). | percent_a · branches: a, b |
wait_for_event | Pause until something happens (reply, meeting, stage change…) or a timeout. Then branch on "wait.result". | event_type, timeout_days |
stop | End the run here. | — |
move_cycle_stage | The contact stays in their sales cycle and goes to this stage (matched by name, so one workflow works for every cycle that has it). Forward only by default: never moves someone back. | stage, forward_only (yes, no), cycle |
update_contact | Set stage, status, lifecycle, score or any field. | field, value |
adjust_score | Increase or decrease the lead score. | points |
assign_owner | Assign to a teammate or rotate (round-robin). | mode (specific, round_robin, least_loaded), owner |
add_tag | Tag the contact. | tag |
remove_tag | Remove a tag. | tag |
add_note | Write a note on the record (merge tags supported). | note |
associate_company | Find or create the company from the contact email domain / company name. | — |
create_task | Create a to-do, call, email or LinkedIn task. | title, type (todo, call, email, meeting, linkedin, follow_up), due_in_days, priority (low, medium, high), owner |
create_deal | Open a deal for this contact. | name, pipeline_id, stage_id, amount |
update_deal | Move stage / set property on the triggering deal (or the contact's open deal). | field (stage_id, status, amount, priority, owner_email, close_date, next_step), value |
enroll_sequence | Start a nurturing sequence. | sequence_id |
unenroll_sequence | Stop all (or one) active sequences. | sequence_id |
update_company | Set a property on the associated company. | field (lifecycle_stage, company_type, tier, owner_email, industry, health_score), value |
enroll_workflow | Hand the record over to another workflow (chain automations). | automation_id |
send_email | Send an email from the connected mailbox — pick a template or write it, with variables, tracking and optional AI personalisation. | template_id, subject, body, track (yes, no), unsubscribe_link (no, yes), ai_instructions |
add_to_mailing | Subscribe the contact to a recurring email campaign (e.g. a daily or weekly mailing). | campaign_id |
remove_from_mailing | Stop sending a recurring campaign to this contact. | campaign_id |
send_linkedin_invite | Blank connection request via the connected LinkedIn account. | — |
send_linkedin_message | Only works if already connected. | message |
send_slack | Message a Slack channel via an incoming webhook URL. | webhook_url, text |
send_teams | Message a Teams channel via an incoming webhook URL. | webhook_url, text |
notify | In-app (and desktop) notification to the owner or a teammate. | title, body, recipient |
http_request | POST the record + event as JSON to any URL. | url, method (POST, PUT, PATCH, GET), headers, body |
log_activity | Write a timeline entry. | type (note, call, meeting, email, system), subject, body |
Sequence step types
| Step | What it is | Runs |
|---|---|---|
email | Automated email | Automatically |
manual_email | Manual email (task) | Creates a task |
linkedin_invite | LinkedIn invitation | Automatically |
linkedin_message | LinkedIn message | Automatically |
call | Call task | Creates a task |
task | Generic task | Creates a task |
Merge tags
Usable in emails, sequences, workflow texts and task titles. Fallbacks with {{contact.first_name | there}}, conditions with {{#if …}}…{{else}}…{{/if}}. In workflows, {{deal.*}} and {{event.*}} are available too ({{deal.name}}, {{deal.amount}}, {{deal.stage}}, {{event.type}}).
| Tag | Gives | Group |
|---|---|---|
{{contact.first_name}} | First name — e.g. Camille | Contact |
{{contact.last_name}} | Last name — e.g. Laurent | Contact |
{{contact.name}} | Full name — e.g. Camille Laurent | Contact |
{{contact.email}} | Email — e.g. camille@payfit.com | Contact |
{{contact.title}} | Job title — e.g. Head of Sales | Contact |
{{contact.company}} | Company — e.g. Payfit | Contact |
{{contact.city}} | City — e.g. Paris | Contact |
{{contact.country}} | Country — e.g. France | Contact |
{{contact.lead_score}} | Lead score — e.g. 72 | Contact |
{{contact.lifecycle_stage}} | Lifecycle stage — e.g. mql | Contact |
{{contact.custom.your_field}} | Custom property — e.g. … | Contact |
{{company.name}} | Company name — e.g. Payfit | Company |
{{company.industry}} | Industry — e.g. Software | Company |
{{company.domain}} | Website — e.g. payfit.com | Company |
{{owner.first_name}} | Sender first name — e.g. Olivia | Sender |
{{owner.name}} | Sender name — e.g. Olivia Owner | Sender |
{{owner.email}} | Sender email — e.g. olivia@acme.com | Sender |
{{today}} | Today — e.g. 05/10/2026 | Dates |
{{weekday}} | Weekday — e.g. lundi | Dates |
{{month}} | Month — e.g. octobre | Dates |
{{contact.first_name | there}} | With fallback — e.g. Camille | Smart |
{{#if contact.company}}at {{contact.company}}{{else}}at your company{{/if}} | If / else block — e.g. at Payfit | Smart |
{{ai.line}} | AI personalised line — e.g. Congrats on the Series B last month! | Smart |
{{unsubscribe_url}} | Unsubscribe link — e.g. https://… | Smart |
Lifecycle stages
| Id | Label |
|---|---|
subscriber | Subscriber |
lead | Lead |
mql | Marketing Qualified |
sql | Sales Qualified |
opportunity | Opportunity |
customer | Customer |
evangelist | Evangelist |
churned | Churned |
other | Other |
Default deal pipeline
| Stage id | Name | Probability | Type | Stuck after |
|---|---|---|---|---|
qualification | Qualification | 10% | open | 14 days |
discovery | Discovery call | 20% | open | 14 days |
demo | Demo / Meeting | 40% | open | 10 days |
proposal | Proposal sent | 60% | open | 10 days |
negotiation | Negotiation | 80% | open | 7 days |
won | Closed won | 100% | won | — |
lost | Closed lost | 0% | lost | — |
Task types, activity types, call outcomes
| Task type | Activity type | Call outcome |
|---|---|---|
todo | note | connected Connected |
call | call | positive Positive / interested |
email | meeting | negative Not interested |
meeting | email | scheduled Meeting scheduled |
linkedin | linkedin | no_answer No answer |
follow_up | whatsapp | voicemail Left voicemail |
stage_change | busy Busy | |
task | wrong_number Wrong number | |
quote | ||
system |
Lost reasons
Price too high · Chose a competitor · No budget · No decision / stalled · Bad timing · Missing feature · Unresponsive · Not a fit · Other
Periods
| Value | Means |
|---|---|
week | This week |
month | This month |
quarter | This quarter |
year | This year |
last_month | Last month |
last_quarter | Last quarter |
last_year | Last year |
d30 | Last 30 days |
d90 | Last 90 days |
m12 | Last 12 months |
all | All time |
Data source objects
| Object | What | Lands in |
|---|---|---|
products | Catalog with prices, stock and every detail | Product catalog |
companies | Customer and prospect accounts | Companies |
contacts | People at those companies | Contacts |
deals | Opportunities in progress | Deals pipeline |
quotes | Quotations sent to customers | Company history |
orders | Sales orders | Company history |
invoices | Invoices and what is still unpaid | Company history |
credit_notes | Refunds and returns | Company history |
price_rules | Customer price scales (coefficient per brand), supplier currencies, incoming stock and tester items | Order forms |
/catalogCatalog of types and values
Event types, trigger types and their config fields, action types with their fields, condition fields and operators, lifecycle stages, task and activity types, call outcomes, lost reasons, pipeline templates, sequence step types, merge tags and API scopes. Public: no key required.
The tables below are this answer, rendered.
curl "https://meetzy.me/api/v1/catalog"const res = await fetch("https://meetzy.me/api/v1/catalog");
const data = await res.json();import os, requests
res = requests.get("https://meetzy.me/api/v1/catalog")
data = res.json()See the notes on the left.