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.
/companiesList and search companiesPOST/companiesCreate a companyGET/companies/{id}Get a company (account view)PATCH/companies/{id}Update a companyDELETE/companies/{id}Delete a companyGET/companies/gridEvery company with its numbersGET/companies/{id}/salesA company’s sales (ERP)POST/companies/bulkChange many companies at oncePOST/companies/auto-associateLink every contact to its companyGET/companies/{id}/interactionsEverything that happened with its peopleGET/companies/duplicatesFind duplicate companiesPOST/companies/mergeMerge companiesPOST/companies/merge-duplicatesMerge every safe duplicate/companiesList and search companies
Companies with roll-ups: contacts_count, open_deals, pipeline_value and won_value. Sorted by last update by default.
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 (
fabrefinds “Groupe Fabre”). ownerstring- Owner email.
lifecycle_stagestring- Lifecycle stage.
company_typestring- Relationship type.
tierstring- Tier.
sortstring- Column to sort by. Default
updated_at. orderstringascordesc(default).limitinteger- Page size, 1–1000. Default 100.
offsetinteger- Rows to skip.
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(){
"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
}/companiesCreate a company
Needs a name or a domain. With a domain that already exists, the existing company is returned.
Body
namestringname or domain- Company name.
domainstring- Website domain (
payfit.com). Normalised:https://www.payfit.com/becomespayfit.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 setscustomer. 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).
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(){
"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"
}/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.
Path parameters
idstringrequired- Id of the record (UUID).
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(){
"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
}/companies/{id}Update a company
Send only the fields to change.
Path parameters
idstringrequired- Id of the record (UUID).
Body
namestring- Company name.
domainstring- Website domain (
payfit.com). Normalised:https://www.payfit.com/becomespayfit.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 setscustomer. 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).
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(){
"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"
}/companies/{id}Delete a company
Deletes the company. Its contacts stay, without the link.
Path parameters
idstringrequired- Id of the record (UUID).
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(){
"deleted": true
}/companies/gridEvery 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.
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.
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(){
"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"
}/companies/{id}/salesA 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.
Path parameters
idstringrequired- Id of the record (UUID).
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(){
"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": []
}
}/companies/bulkChange 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.
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.
deletebooleantruedeletes the companies (their contacts and deals are kept, unlinked).
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(){
"updated": 1
}/companies/auto-associateLink 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.
Body
dry_runbooleantrueonly counts, links nothing.createbooleantruealso creates the companies of the contacts nothing matched (one per domain or name — never a duplicate). For a first set-up.
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(){
"scanned": 312,
"linked": 287,
"ambiguous": 6,
"unmatched": 19,
"kept_manual": 0,
"dry_run": false,
"companies_created": 0
}/companies/{id}/interactionsEverything 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}.
Path parameters
idstringrequired- Id of the record (UUID).
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(){
"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
}/companies/duplicatesFind 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).
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(){
"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
}/companies/mergeMerge 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.
Body
keep_iduuidrequired- The company kept.
merge_idsuuid[]required- Companies merged into it.
confirm_erpbooleantrueto merge companies that are different customers in your ERP.
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(){
"kept": {
"id": "3cdc3e21-931a-4e8b-a189-3cab5dfbd636",
"name": "Lumière Paris"
},
"merged": 1,
"moved": {
"unified_leads": 1,
"sales_deals": 0,
"sales_activities": 3
}
}/companies/merge-duplicatesMerge every safe duplicate
Merges all the groups of GET /companies/duplicates marked safe.
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(){
"groups": 3,
"merged": 4
}