CRM

Companies

Accounts: create, search, roll-ups of contacts and deals, the full account view, bulk changes and the sales each company makes in your ERP.

Companies group contacts, deals, tasks and — when a data source syncs them — quotes, orders and invoices. A company is unique by domain: creating one with a domain that exists returns the existing company. Companies coming from an ERP keep their customer code in custom.erp, which is how invoices find them.

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

List and search companies

Companies with roll-ups: contacts_count, open_deals, pipeline_value and won_value. Sorted by last update by default.

Scope: read

Query parameters

qstring
Search by words in name, domain, industry, city, country and ERP code: every word must appear, in any order, accents and case ignored (fabre finds “Groupe Fabre”).
ownerstring
Owner email.
lifecycle_stagestring
Lifecycle stage.
company_typestring
Relationship type.
tierstring
Tier.
sortstring
Column to sort by. Default updated_at.
orderstring
asc or desc (default).
limitinteger
Page size, 1–1000. Default 100.
offsetinteger
Rows to skip.
Request
curl "https://meetzy.me/api/v1/companies?q=pay&tier=A" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/companies?q=pay&tier=A", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/companies?q=pay&tier=A",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "companies": [
    {
      "id": "166c436d-a874-4730-a0d8-c8d7fa090268",
      "user_from": "acme",
      "name": "Payfit",
      "domain": "payfit.com",
      "website": null,
      "industry": "Software",
      "employees": null,
      "annual_revenue": null,
      "country": null,
      "city": null,
      "address": null,
      "phone": null,
      "linkedin_url": null,
      "description": null,
      "logo_url": null,
      "owner_email": "olivia@acme.com",
      "lifecycle_stage": "lead",
      "company_type": "prospect",
      "tier": "A",
      "health_score": null,
      "tags": [
        "api"
      ],
      "custom": {},
      "parent_company_id": null,
      "apollo_id": null,
      "last_activity_at": null,
      "created_by": "olivia@acme.com",
      "created_at": "2026-10-07T13:22:31.105534+00:00",
      "updated_at": "2026-10-07T13:22:31.105534+00:00",
      "contacts_count": 0,
      "open_deals": 0,
      "pipeline_value": 0,
      "won_value": 0
    }
  ],
  "total": 1
}
POST/companies

Create a company

Needs a name or a domain. With a domain that already exists, the existing company is returned.

Scope: write

Body

namestringname or domain
Company name.
domainstring
Website domain (payfit.com). Normalised: https://www.payfit.com/ becomes payfit.com. Used to match contacts by email domain.
websitestring
Website URL.
industrystring
Industry.
employeesinteger
Number of employees.
annual_revenuenumber
Annual revenue.
countrystring
Country.
citystring
City.
addressstring
Street address.
phonestring
Main phone number.
linkedin_urlstring
LinkedIn company page.
descriptionstring
What the company does.
logo_urlstring
Logo image URL.
owner_emailstring
Account owner (teammate email). Defaults to the key’s user on create.
lifecycle_stagestring
Lifecycle stage of the account (same values as contacts).
company_typestring
Relationship, e.g. prospect, customer, partner, supplier, competitor. Winning a deal sets customer.
tierstring
Account tier for account-based selling, e.g. A, B, C.
health_scoreinteger
Account health, 0–100.
tagsstring[]
Free labels.
customobject
Custom properties and ERP data (custom.erp.code, custom.erp.group… are filled by data sources).
parent_company_iduuid
Parent company (group / subsidiaries).
Request
curl -X POST "https://meetzy.me/api/v1/companies" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Payfit",
    "domain": "payfit.com",
    "industry": "Software",
    "employees": 900,
    "country": "France",
    "company_type": "prospect",
    "tier": "A",
    "owner_email": "olivia@acme.com"
  }'
const res = await fetch("https://meetzy.me/api/v1/companies", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "name": "Payfit",
    "domain": "payfit.com",
    "industry": "Software",
    "employees": 900,
    "country": "France",
    "company_type": "prospect",
    "tier": "A",
    "owner_email": "olivia@acme.com"
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/companies",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "name": "Payfit",
        "domain": "payfit.com",
        "industry": "Software",
        "employees": 900,
        "country": "France",
        "company_type": "prospect",
        "tier": "A",
        "owner_email": "olivia@acme.com"
    },
)
data = res.json()
Response201
{
  "id": "166c436d-a874-4730-a0d8-c8d7fa090268",
  "user_from": "acme",
  "name": "Payfit",
  "domain": "payfit.com",
  "website": null,
  "industry": "Software",
  "employees": null,
  "annual_revenue": null,
  "country": null,
  "city": null,
  "address": null,
  "phone": null,
  "linkedin_url": null,
  "description": null,
  "logo_url": null,
  "owner_email": "olivia@acme.com",
  "lifecycle_stage": "lead",
  "company_type": "prospect",
  "tier": "A",
  "health_score": null,
  "tags": [
    "api"
  ],
  "custom": {},
  "parent_company_id": null,
  "apollo_id": null,
  "last_activity_at": null,
  "created_by": "olivia@acme.com",
  "created_at": "2026-10-07T13:22:31.105534+00:00",
  "updated_at": "2026-10-07T13:22:31.105534+00:00"
}
GET/companies/{id}

Get a company (account view)

The company with its contacts (best score first), deals (with stage and weighted amount), open tasks, the account timeline (what was logged on the company, its people and its deals), subsidiaries, and history: what it bought according to the ERP — revenue of the last 12 months, orders, last order date, open quotes, unpaid invoices, top products and the latest documents.

Scope: read

Path parameters

idstringrequired
Id of the record (UUID).
Request
curl "https://meetzy.me/api/v1/companies/e43414d6-f56f-42be-a64c-a836d6015efc" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/companies/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/companies/e43414d6-f56f-42be-a64c-a836d6015efc",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "company": {
    "id": "166c436d-a874-4730-a0d8-c8d7fa090268",
    "user_from": "acme",
    "name": "Payfit",
    "domain": "payfit.com",
    "website": null,
    "industry": "Software",
    "employees": null,
    "annual_revenue": null,
    "country": null,
    "city": null,
    "address": null,
    "phone": null,
    "linkedin_url": null,
    "description": null,
    "logo_url": null,
    "owner_email": "olivia@acme.com",
    "lifecycle_stage": "lead",
    "company_type": "prospect",
    "tier": "A",
    "health_score": null,
    "tags": [
      "api"
    ],
    "custom": {},
    "parent_company_id": null,
    "apollo_id": null,
    "last_activity_at": null,
    "created_by": "olivia@acme.com",
    "created_at": "2026-10-07T13:22:31.105534+00:00",
    "updated_at": "2026-10-07T13:22:31.105534+00:00"
  },
  "contacts": [],
  "deals": [],
  "tasks": [],
  "activities": [],
  "children": [],
  "history": null
}
PATCH/companies/{id}

Update a company

Send only the fields to change.

Scope: write

Path parameters

idstringrequired
Id of the record (UUID).

Body

namestring
Company name.
domainstring
Website domain (payfit.com). Normalised: https://www.payfit.com/ becomes payfit.com. Used to match contacts by email domain.
websitestring
Website URL.
industrystring
Industry.
employeesinteger
Number of employees.
annual_revenuenumber
Annual revenue.
countrystring
Country.
citystring
City.
addressstring
Street address.
phonestring
Main phone number.
linkedin_urlstring
LinkedIn company page.
descriptionstring
What the company does.
logo_urlstring
Logo image URL.
owner_emailstring
Account owner (teammate email). Defaults to the key’s user on create.
lifecycle_stagestring
Lifecycle stage of the account (same values as contacts).
company_typestring
Relationship, e.g. prospect, customer, partner, supplier, competitor. Winning a deal sets customer.
tierstring
Account tier for account-based selling, e.g. A, B, C.
health_scoreinteger
Account health, 0–100.
tagsstring[]
Free labels.
customobject
Custom properties and ERP data (custom.erp.code, custom.erp.group… are filled by data sources).
parent_company_iduuid
Parent company (group / subsidiaries).
Request
curl -X PATCH "https://meetzy.me/api/v1/companies/e43414d6-f56f-42be-a64c-a836d6015efc" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tier": "B",
    "tags": [
      "vip"
    ],
    "health_score": 80
  }'
const res = await fetch("https://meetzy.me/api/v1/companies/e43414d6-f56f-42be-a64c-a836d6015efc", {
  method: "PATCH",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "tier": "B",
    "tags": [
      "vip"
    ],
    "health_score": 80
  }),
});
const data = await res.json();
import os, requests

res = requests.patch(
    "https://meetzy.me/api/v1/companies/e43414d6-f56f-42be-a64c-a836d6015efc",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "tier": "B",
        "tags": ["vip"],
        "health_score": 80
    },
)
data = res.json()
Response200
{
  "id": "166c436d-a874-4730-a0d8-c8d7fa090268",
  "user_from": "acme",
  "name": "Payfit",
  "domain": "payfit.com",
  "website": null,
  "industry": "Software",
  "employees": 42,
  "annual_revenue": null,
  "country": null,
  "city": null,
  "address": null,
  "phone": null,
  "linkedin_url": null,
  "description": null,
  "logo_url": null,
  "owner_email": "olivia@acme.com",
  "lifecycle_stage": "lead",
  "company_type": "prospect",
  "tier": "A",
  "health_score": null,
  "tags": [
    "api"
  ],
  "custom": {},
  "parent_company_id": null,
  "apollo_id": null,
  "last_activity_at": null,
  "created_by": "olivia@acme.com",
  "created_at": "2026-10-07T13:22:31.105534+00:00",
  "updated_at": "2026-10-07T13:22:35.297927+00:00"
}
DELETE/companies/{id}

Delete a company

Deletes the company. Its contacts stay, without the link.

Scope: delete

Path parameters

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

Every company with its numbers

All companies in one call, for spreadsheets and BI: CRM roll-ups (contacts, open deals and pipeline, next task) and, when an ERP is connected, ERP code and group, sales this year vs last year, last purchase and buying status. Not paginated.

Scope: read

Query parameters

compactboolean
Leave out the fields that have no value (null, empty text, empty list or object) to make the response much lighter. Default false: every company carries every field.
Request
curl "https://meetzy.me/api/v1/companies/grid" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/companies/grid", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/companies/grid",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "companies": [
    {
      "id": "166c436d-a874-4730-a0d8-c8d7fa090268",
      "name": "Payfit",
      "domain": "payfit.com",
      "country": null,
      "city": null,
      "industry": "Software",
      "employees": 42,
      "phone": null,
      "owner_email": "olivia@acme.com",
      "lifecycle_stage": "lead",
      "company_type": "prospect",
      "tier": "A",
      "tags": [
        "api"
      ],
      "health_score": null,
      "last_activity_at": null,
      "created_at": "2026-10-07T13:22:31.105534+00:00",
      "updated_at": "2026-10-07T13:22:35.297927+00:00",
      "logo_url": null,
      "parent_company_id": null,
      "contacts": 0,
      "open_deals": 0,
      "pipeline": 0,
      "won": 0,
      "open_tasks": 0,
      "next_task": null,
      "erp_code": null,
      "erp_group": null,
      "erp_owner": null,
      "erp_balance": null,
      "erp_price_list": null,
      "erp_active": null,
      "erp_fields": {},
      "sales_ytd": 0,
      "sales_ly_ytd": 0,
      "sales_change": null,
      "sales_last_year": 0,
      "sales_12m": 0,
      "sales_prev_12m": 0,
      "sales_12m_change": null,
      "sales_total": 0,
      "docs_12m": 0,
      "avg_12m": null,
      "first_purchase": null,
      "last_purchase": null,
      "days_since_purchase": null,
      "open_amount": 0,
      "open_invoices": 0,
      "overdue_amount": 0,
      "buying_status": "never"
    },
    {
      "id": "d6aeac09-918a-4d9b-af32-f1308b1dbd57",
      "name": "Beta Corp",
      "domain": null,
      "country": "France",
      "city": null,
      "industry": null,
      "employees": null,
      "phone": null,
      "owner_email": null,
      "lifecycle_stage": "lead",
      "company_type": "prospect",
      "tier": null,
      "tags": [],
      "health_score": null,
      "last_activity_at": null,
      "created_at": "2026-10-07T13:12:56.902413+00:00",
      "updated_at": "2026-10-07T13:12:56.902413+00:00",
      "logo_url": null,
      "parent_company_id": null,
      "contacts": 0,
      "open_deals": 0,
      "pipeline": 0,
      "won": 0,
      "open_tasks": 0,
      "next_task": null,
      "erp_code": "C2",
      "erp_group": null,
      "erp_owner": null,
      "erp_balance": null,
      "erp_price_list": null,
      "erp_active": true,
      "erp_fields": {},
      "sales_ytd": 0,
      "sales_ly_ytd": 0,
      "sales_change": null,
      "sales_last_year": 0,
      "sales_12m": 0,
      "sales_prev_12m": 0,
      "sales_12m_change": null,
      "sales_total": 0,
      "docs_12m": 0,
      "avg_12m": null,
      "first_purchase": null,
      "last_purchase": null,
      "days_since_purchase": null,
      "open_amount": 0,
      "open_invoices": 0,
      "overdue_amount": 0,
      "buying_status": "never"
    }
  ],
  "currency": "EUR",
  "erp": true,
  "payments": {
    "reliable": true,
    "old_invoices": 0,
    "old_settled": 0
  },
  "statuses": [
    {
      "id": "new",
      "label": "New customer",
      "hint": "First purchase in the last 90 days",
      "color": "#34C759"
    },
    {
      "id": "active",
      "label": "Active",
      "hint": "Bought in the last 6 months",
      "color": "#007AFF"
    }
  ],
  "generated_at": "2026-10-07T13:22:36.259Z"
}
GET/companies/{id}/sales

A company’s sales (ERP)

What one customer buys, from the synced invoices or orders: this year vs last year to date (with the month-by-month timeline), every year, products, brands and categories bought (when lines are synced), salespeople, and money still to collect with the open invoices. Returns connected: false when no ERP data exists.

Scope: read

Path parameters

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

res = requests.get(
    "https://meetzy.me/api/v1/companies/e43414d6-f56f-42be-a64c-a836d6015efc/sales",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "connected": true,
  "currency": "EUR",
  "has_lines": false,
  "basis": "invoiced",
  "year": {
    "kpis": {
      "current": {
        "sales": 0,
        "docs": 0,
        "credits": 0,
        "customers": 0,
        "avg": 0,
        "units": 0,
        "new_customers": 0
      },
      "compare": {
        "sales": 0,
        "docs": 0,
        "credits": 0,
        "customers": 0,
        "avg": 0,
        "units": 0,
        "new_customers": 0
      },
      "change": null
    },
    "range": {
      "start": "2026-01-01",
      "end": "2026-12-31",
      "to_date": true,
      "compare": {
        "incomplete": true,
        "synced_from": "2026-10-07",
        "mode": "last_year",
        "start": "2025-01-01",
        "end": "2025-10-07",
        "full_end": "2025-12-31"
      },
      "group": "month"
    },
    "timeline": [
      {
        "key": "2026-01",
        "label": "Jan 26",
        "current": 0,
        "compare": 0,
        "docs": 0
      },
      {
        "key": "2026-02",
        "label": "Feb 26",
        "current": 0,
        "compare": 0,
        "docs": 0
      },
      {
        "key": "2026-03",
        "label": "Mar 26",
        "current": 0,
        "compare": 0,
        "docs": 0
      }
    ]
  },
  "years": [],
  "first_date": null,
  "totals": {
    "sales": 0,
    "docs": 0,
    "credits": 0,
    "customers": 0,
    "avg": 0,
    "units": 0,
    "new_customers": 0
  },
  "products": [],
  "brands": [],
  "categories": [],
  "reps": [],
  "receivables": {
    "reliable": true,
    "old_invoices": 0,
    "old_settled": 0,
    "open_amount": 0,
    "open_count": 0,
    "overdue_amount": 0,
    "overdue_count": 0,
    "aging": [
      {
        "id": "not_due",
        "label": "Not due yet",
        "amount": 0,
        "count": 0
      },
      {
        "id": "d30",
        "label": "1–30 days late",
        "amount": 0,
        "count": 0
      },
      {
        "id": "d60",
        "label": "31–60 days",
        "amount": 0,
        "count": 0
      }
    ],
    "invoices": []
  }
}
POST/companies/bulk

Change many companies at once

Up to 5,000 companies per call: set owner, lifecycle stage, type or tier, add or remove tags — or delete them all.

Scope: write

Body

idsuuid[]required
Companies to change.
patchobject
Fields to set: owner_email, lifecycle_stage, company_type, tier (empty string clears).
add_tagsstring[]
Tags to add.
remove_tagsstring[]
Tags to remove.
deleteboolean
true deletes the companies (their contacts and deals are kept, unlinked).
Request
curl -X POST "https://meetzy.me/api/v1/companies/bulk" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "ids": [
      "3cdc3e21-931a-4e8b-a189-3cab5dfbd636"
    ],
    "patch": {
      "owner_email": "olivia@acme.com",
      "tier": "A"
    },
    "add_tags": [
      "q4-focus"
    ]
  }'
const res = await fetch("https://meetzy.me/api/v1/companies/bulk", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "ids": [
      "3cdc3e21-931a-4e8b-a189-3cab5dfbd636"
    ],
    "patch": {
      "owner_email": "olivia@acme.com",
      "tier": "A"
    },
    "add_tags": [
      "q4-focus"
    ]
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/companies/bulk",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "ids": ["3cdc3e21-931a-4e8b-a189-3cab5dfbd636"],
        "patch": {
            "owner_email": "olivia@acme.com",
            "tier": "A"
        },
        "add_tags": ["q4-focus"]
    },
)
data = res.json()
Response201
{
  "updated": 1
}
POST/companies/auto-associate

Link every contact to its company

Goes through the contacts without a company and links each one when its company is clear: the email domain (or website) of exactly one company, else exactly the same company name. A domain several companies share stays unlinked (ambiguous). Nothing is created, and contacts whose company was chosen by hand are left alone. Free email providers (gmail.com, outlook.com…) are ignored.

Scope: write

Body

dry_runboolean
true only counts, links nothing.
createboolean
true also creates the companies of the contacts nothing matched (one per domain or name — never a duplicate). For a first set-up.
Request
curl -X POST "https://meetzy.me/api/v1/companies/auto-associate" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/companies/auto-associate", {
  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/companies/auto-associate",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response201
{
  "scanned": 312,
  "linked": 287,
  "ambiguous": 6,
  "unmatched": 19,
  "kept_manual": 0,
  "dry_run": false,
  "companies_created": 0
}
GET/companies/{id}/interactions

Everything that happened with its people

The company’s whole timeline, its people’s together: for each of its contacts (main or other company) the emails exchanged from the key user’s mailbox — whole conversations, emails in copy included (mail) — website visits, email opens and clicks, LinkedIn and WhatsApp, meetings, sequences, stage changes, deals, quotes, tasks and notes. Newest first, each with lead_id and contact_name; one event once even when it involves several people. Logged activities come with GET /companies/{id}.

Scope: read

Path parameters

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

res = requests.get(
    "https://meetzy.me/api/v1/companies/e43414d6-f56f-42be-a64c-a836d6015efc/interactions",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "items": [
    {
      "id": "0b1c…:open-81",
      "type": "email_open",
      "subject": "Opened “Your autumn selection”",
      "occurred_at": "2026-10-06T09:12:00Z",
      "direction": "inbound",
      "lead_id": "0b1c2d3e-4f5a-4b6c-8d7e-9f0a1b2c3d4e",
      "contact_name": "Nadia Benali"
    }
  ],
  "contacts": 4
}
GET/companies/duplicates

Find duplicate companies

Companies that look like the same one: exactly the same name, or the same domain. Each group says which one to keep (keep_id) and which to merge into it (merge_ids); safe groups need no choice. Two companies with different ERP codes are different customers: they are never proposed for a merge (unsure_ids lists the ones to decide by hand).

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

res = requests.get(
    "https://meetzy.me/api/v1/companies/duplicates",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "groups": [
    {
      "reason": "name",
      "members": [
        {
          "id": "3cdc3e21-931a-4e8b-a189-3cab5dfbd636",
          "name": "Lumière Paris",
          "domain": "lumiere.fr",
          "code": "C000412",
          "contacts": 4
        },
        {
          "id": "7a1f0c55-2b6e-4f0e-9a51-0d3f6c2b8e11",
          "name": "Lumiere Paris",
          "domain": null,
          "code": null,
          "contacts": 1
        }
      ],
      "keep_id": "3cdc3e21-931a-4e8b-a189-3cab5dfbd636",
      "merge_ids": [
        "7a1f0c55-2b6e-4f0e-9a51-0d3f6c2b8e11"
      ],
      "unsure_ids": [],
      "safe": true
    }
  ],
  "safe": 1
}
POST/companies/merge

Merge companies

Moves everything of merge_ids — contacts, deals, activities, tasks, quotes, ERP documents — to keep_id, fills its empty fields from them, then deletes them. For good: their sync links and ERP codes now point at the company kept, so later syncs update it instead of bringing the others back. Two companies with different ERP codes answer 409 (code: erp_conflict) unless confirm_erp is true.

Scope: write

Body

keep_iduuidrequired
The company kept.
merge_idsuuid[]required
Companies merged into it.
confirm_erpboolean
true to merge companies that are different customers in your ERP.
Request
curl -X POST "https://meetzy.me/api/v1/companies/merge" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "keep_id": "3cdc3e21-931a-4e8b-a189-3cab5dfbd636",
    "merge_ids": [
      "7a1f0c55-2b6e-4f0e-9a51-0d3f6c2b8e11"
    ]
  }'
const res = await fetch("https://meetzy.me/api/v1/companies/merge", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "keep_id": "3cdc3e21-931a-4e8b-a189-3cab5dfbd636",
    "merge_ids": [
      "7a1f0c55-2b6e-4f0e-9a51-0d3f6c2b8e11"
    ]
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/companies/merge",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "keep_id": "3cdc3e21-931a-4e8b-a189-3cab5dfbd636",
        "merge_ids": ["7a1f0c55-2b6e-4f0e-9a51-0d3f6c2b8e11"]
    },
)
data = res.json()
Response201
{
  "kept": {
    "id": "3cdc3e21-931a-4e8b-a189-3cab5dfbd636",
    "name": "Lumière Paris"
  },
  "merged": 1,
  "moved": {
    "unified_leads": 1,
    "sales_deals": 0,
    "sales_activities": 3
  }
}
POST/companies/merge-duplicates

Merge every safe duplicate

Merges all the groups of GET /companies/duplicates marked safe.

Scope: write
Request
curl -X POST "https://meetzy.me/api/v1/companies/merge-duplicates" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/companies/merge-duplicates", {
  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/companies/merge-duplicates",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response201
{
  "groups": 3,
  "merged": 4
}