Data

Reports & analytics

Pipeline report and forecast, goals, sales analytics from the ERP (by customer, salesperson, country, brand, category, product), receivables, cockpit figures and credits.

Two families of numbers. The pipeline report is about deals, tasks and activities in Meetzy. Sales analytics is about what was really sold: quotes, orders, invoices and credit notes synced from an ERP, a shop, a file or the API (see Data sources) — net sales excl. tax, in the main currency, compared like for like.

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/reports/summary

Pipeline report and forecast

For a period: KPIs (pipeline value, weighted pipeline, won value and count with change, win rate, average deal, sales cycle, deals created, new contacts, activities, forecast commit / best case, overdue deals, tasks), deals by stage, funnel, forecast by close month, trend, activity by type and per day, leaderboard per owner, loss reasons, deals by source, goals with progress, and stuck deals.

Scope: read

Query parameters

periodstring
week, month, quarter, year, last_month, last_quarter, last_year, d30, d90, m12 (last 12 months) or all. Default month. Changes are against the previous period of the same length.
pipeline_iduuid
Only one pipeline.
ownerstring
Only one owner (email).
Request
curl "https://meetzy.me/api/v1/reports/summary?period=quarter" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/reports/summary?period=quarter", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/reports/summary?period=quarter",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "period": "quarter",
  "start": "2026-09-30T22:00:00.000Z",
  "end": "2026-12-31T23:00:00.000Z",
  "currency": "EUR",
  "kpis": {
    "pipeline_value": 12000,
    "open_deals": 1,
    "weighted_pipeline": 7200,
    "won_value": 0,
    "won_count": 0,
    "won_change": 0,
    "lost_count": 0,
    "win_rate": 0,
    "win_rate_prev": 0,
    "avg_deal_size": 12000,
    "sales_cycle_days": 0,
    "deals_created": 1,
    "deals_created_change": 100,
    "new_contacts": 1,
    "new_contacts_change": 100,
    "activities": 8,
    "activities_change": 100,
    "forecast_commit": 0,
    "forecast_best_case": 12000,
    "forecast_closing": 12000,
    "overdue_deals": 0,
    "tasks_overdue": 0,
    "tasks_today": 1,
    "tasks_open": 10
  },
  "by_stage": [
    {
      "id": "qualification",
      "name": "Qualification",
      "color": "#6366F1",
      "probability": 10,
      "count": 0,
      "value": 0,
      "weighted": 0
    },
    {
      "id": "discovery",
      "name": "Discovery call",
      "color": "#3B82F6",
      "probability": 20,
      "count": 0,
      "value": 0,
      "weighted": 0
    }
  ],
  "funnel": [
    {
      "id": "qualification",
      "name": "Qualification",
      "reached": 1,
      "conversion": 100
    },
    {
      "id": "discovery",
      "name": "Discovery call",
      "reached": 1,
      "conversion": 100
    }
  ],
  "forecast": [
    {
      "month": "2026-09",
      "label": "Oct 26",
      "pipeline": 0,
      "weighted": 0,
      "won": 0,
      "count": 0
    },
    {
      "month": "2026-10",
      "label": "Nov 26",
      "pipeline": 12000,
      "weighted": 7200,
      "won": 0,
      "count": 1
    }
  ],
  "trend": [
    {
      "month": "2026-04",
      "label": "May",
      "won": 0,
      "deals_won": 0,
      "deals_created": 0
    },
    {
      "month": "2026-05",
      "label": "Jun",
      "won": 0,
      "deals_won": 0,
      "deals_created": 0
    }
  ],
  "activity_by_type": [
    {
      "type": "call",
      "count": 6,
      "prev": 0
    },
    {
      "type": "email",
      "count": 0,
      "prev": 0
    }
  ],
  "activity_daily": [
    {
      "date": "2026-09-23",
      "label": "Sep 24",
      "calls": 0,
      "emails": 0,
      "meetings": 0,
      "linkedin": 0,
      "total": 0
    },
    {
      "date": "2026-09-24",
      "label": "Sep 25",
      "calls": 0,
      "emails": 0,
      "meetings": 0,
      "linkedin": 0,
      "total": 0
    }
  ],
  "leaderboard": [
    {
      "email": "olivia@acme.com",
      "name": "Olivia Martin",
      "memoji": null,
      "won_value": 0,
      "won_count": 0,
      "win_rate": 0,
      "pipeline": 12000,
      "calls": 6,
      "emails": 0,
      "meetings": 0,
      "activities": 8,
      "open_tasks": 10
    }
  ],
  "lost_reasons": [],
  "by_source": [
    {
      "source": "Unknown",
      "count": 1,
      "won": 0,
      "value": 0
    }
  ],
  "goals": [],
  "rotting": [],
  "pipelines": [
    {
      "id": "cacafee6-6c63-407f-a948-5d6570c20143",
      "name": "Sales pipeline",
      "is_default": true
    },
    {
      "id": "d9b0bf57-c46d-451f-adc0-adb7d2d43938",
      "name": "Partners",
      "is_default": false
    }
  ]
}
GET/goals

List goals

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

res = requests.get(
    "https://meetzy.me/api/v1/goals",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "goals": [
    {
      "id": "caec41a9-910e-4891-ad3e-899cb955602e",
      "user_from": "acme",
      "owner_email": null,
      "metric": "revenue_won",
      "period": "month",
      "target": 50000,
      "created_at": "2026-10-07T13:23:41.485554+00:00"
    }
  ]
}
POST/goals

Create a goal

A target for the team or one person. Progress (actual, % reached, % of the period elapsed) shows in GET /reports/summary.

Scope: write

Body

metricstringrequired
revenue_won, deals_won, deals_created, meetings, calls or activities.
targetnumberrequired
Target value.
periodstring
week, month, quarter or year.
owner_emailstring
One person (empty = the team).
Request
curl -X POST "https://meetzy.me/api/v1/goals" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "metric": "revenue_won",
    "period": "quarter",
    "target": 150000
  }'
const res = await fetch("https://meetzy.me/api/v1/goals", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "metric": "revenue_won",
    "period": "quarter",
    "target": 150000
  }),
});
const data = await res.json();
import os, requests

res = requests.post(
    "https://meetzy.me/api/v1/goals",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "metric": "revenue_won",
        "period": "quarter",
        "target": 150000
    },
)
data = res.json()
Response201
{
  "id": "caec41a9-910e-4891-ad3e-899cb955602e",
  "user_from": "acme",
  "owner_email": null,
  "metric": "revenue_won",
  "period": "month",
  "target": 50000,
  "created_at": "2026-10-07T13:23:41.485554+00:00"
}
PATCH/goals/{id}

Update a goal

Scope: write

Path parameters

idstringrequired
Id of the record (UUID).

Body

metricstring
Metric.
targetnumber
Target.
periodstring
Period.
owner_emailstring
Owner.
Request
curl -X PATCH "https://meetzy.me/api/v1/goals/e43414d6-f56f-42be-a64c-a836d6015efc" \
  -H "Authorization: Bearer $MEETZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "target": 180000
  }'
const res = await fetch("https://meetzy.me/api/v1/goals/e43414d6-f56f-42be-a64c-a836d6015efc", {
  method: "PATCH",
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "target": 180000
  }),
});
const data = await res.json();
import os, requests

res = requests.patch(
    "https://meetzy.me/api/v1/goals/e43414d6-f56f-42be-a64c-a836d6015efc",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
    json={
        "target": 180000
    },
)
data = res.json()
Response200
{
  "id": "b1c2d3e4-f5a6-4b7c-8d9e-0f1a2b3c4d5e",
  "user_from": "acme",
  "owner_email": null,
  "metric": "revenue_won",
  "period": "quarter",
  "target": 180000
}
DELETE/goals/{id}

Delete a goal

Scope: delete

Path parameters

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

Sales forecast (ERP)

The next months of sales (6 by default), month by month, from what your ERP or shop synced. Two models blended: customer by customer (run-rate, own trend vs last year, season, when their next orders should fall, how likely they still buy) plus what new customers usually bring; and the whole business (deseasonalised level, damped trend, seasonality). Both forecast the last 6 complete months from the data before them (backtest): their errors set the blend, a bias correction and the bands (low / high ≈ 2 chances in 3). Also customers (forecast, last 6 months, same period last year, status new / active / at_risk / dormant, rhythm, next order expected), brands (each customer’s forecast split by what they bought in 12 months) and reps. Recomputed when new documents are synced (else cached 30 minutes).

Scope: read

Query parameters

monthsinteger
How many months, 3 to 12. Default 6 (the current month first).
basisstring
invoiced (default when invoices exist) or ordered.
Request
curl "https://meetzy.me/api/v1/analytics/forecast" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/analytics/forecast", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/analytics/forecast",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "connected": true,
  "enough": true,
  "currency": "EUR",
  "basis": "invoiced",
  "months": [
    {
      "month": "2026-10",
      "forecast": 1191000,
      "low": 798000,
      "high": 1585000,
      "last_year": 1428000,
      "so_far": 214000
    }
  ],
  "total": 5216000,
  "total_low": 4754000,
  "total_high": 5678000,
  "same_period_last_year": 5487000,
  "new_business": 253000,
  "backtest": {
    "error_pct": 28.5,
    "total_error_pct": 5.9,
    "accuracy_pct": 71.5
  },
  "customers": [
    {
      "id": "3cdc3e21-931a-4e8b-a189-3cab5dfbd636",
      "name": "Lumière Paris",
      "forecast": 229000,
      "last_6m": 214000,
      "status": "active",
      "every_days": 31,
      "next_order": "2026-10-19",
      "active_pct": 100
    }
  ],
  "brands": [
    {
      "brand": "Guerlain",
      "forecast": 336000,
      "last_12m": 690000
    }
  ],
  "reps": [
    {
      "name": "Fabrizio",
      "forecast": 965000,
      "customers": 41
    }
  ]
}
GET/analytics/sales

Sales analytics (ERP)

The numbers of Meetzy’s Sales analytics page. KPIs for the period and the compared one (sales, docs, credits, customers, avg, units, new_customers, change) — compared to date while the period runs; a timeline; every year month by month (like for like); breakdowns by customer, rep, country and, when lines are synced, brand, category, product (each row: key, name, current, compare, change, share, docs, qty, last); receivables (open and past-due amounts, aging buckets, invoices); the documents; and options — the keys you can filter on. connected: false when nothing is synced.

Scope: read

Query parameters

periodstring
week, month, quarter, year, last_month, last_quarter, last_year, d30, d90, m12 (last 12 months) or all. Default year.
fromdate
Custom start YYYY-MM-DD (with to).
todate
Custom end (with from).
comparestring
last_year (default), previous or none.
basisstring
invoiced (invoices minus credit notes, default when invoices exist) or ordered.
groupstring
Timeline step: day, week, month, quarter, year. Default: from the period length.
scopestring
me — only the key user’s sales.
customerstring
Filter: customer keys, comma separated (from options.customer).
repstring
Filter: salesperson keys.
countrystring
Filter: countries.
brandstring
Filter: brands (line-level).
categorystring
Filter: categories (line-level).
productstring
Filter: product SKUs or names (line-level).
Request
curl "https://meetzy.me/api/v1/analytics/sales?period=quarter&compare=last_year&brand=Pepe%20Jeans" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/analytics/sales?period=quarter&compare=last_year&brand=Pepe%20Jeans", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/analytics/sales?period=quarter&compare=last_year&brand=Pepe%20Jeans",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "connected": true,
  "source": "custom:sage-100",
  "synced_at": "2026-10-07T13:21:04.195+00:00",
  "currency": "EUR",
  "has_lines": false,
  "has": {
    "invoiced": true,
    "ordered": false,
    "credit_notes": false
  },
  "basis": "invoiced",
  "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"
  },
  "first_date": "2026-10-07",
  "last_date": "2026-10-07",
  "kpis": {
    "current": {
      "sales": 1200,
      "docs": 1,
      "credits": 0,
      "customers": 1,
      "avg": 1200,
      "units": 0,
      "new_customers": 1
    },
    "compare": {
      "sales": 0,
      "docs": 0,
      "credits": 0,
      "customers": 0,
      "avg": 0,
      "units": 0,
      "new_customers": 0
    },
    "change": null
  },
  "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
    }
  ],
  "years": [
    {
      "year": 2026,
      "months": [
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        1200,
        null,
        null
      ],
      "total": 1200,
      "docs": 1,
      "quarters": [
        null,
        null,
        null,
        1200
      ],
      "change": null,
      "compared_months": null,
      "partial": true
    }
  ],
  "breakdowns": {
    "customer": [
      {
        "key": "05762c5d-3e1e-4fcf-adfa-f989a30f8462",
        "name": "Payfit",
        "current": 1200,
        "compare": 0,
        "change": null,
        "share": 100,
        "docs": 1,
        "qty": 0,
        "last": "2026-10-07",
        "company_id": "05762c5d-3e1e-4fcf-adfa-f989a30f8462"
      }
    ],
    "rep": [
      {
        "key": "olivia@acme.com",
        "name": "Olivia Martin",
        "current": 1200,
        "compare": 0,
        "change": null,
        "share": 100,
        "docs": 1,
        "qty": 0,
        "last": "2026-10-07",
        "company_id": null
      }
    ],
    "country": [
      {
        "key": "Unknown",
        "name": "Unknown",
        "current": 1200,
        "compare": 0,
        "change": null,
        "share": 100,
        "docs": 1,
        "qty": 0,
        "last": "2026-10-07",
        "company_id": null
      }
    ]
  },
  "receivables": {
    "reliable": true,
    "old_invoices": 0,
    "old_settled": 0,
    "open_amount": 1200,
    "open_count": 1,
    "overdue_amount": 0,
    "overdue_count": 0,
    "aging": [
      {
        "id": "not_due",
        "label": "Not due yet",
        "amount": 1200,
        "count": 1
      },
      {
        "id": "d30",
        "label": "1–30 days late",
        "amount": 0,
        "count": 0
      },
      {
        "id": "d60",
        "label": "31–60 days",
        "amount": 0,
        "count": 0
      }
    ],
    "invoices": [
      {
        "id": "83d62171-1cc8-466a-ad9c-f9fbce63d4bf",
        "number": "F-1",
        "date": "2026-10-07",
        "due_date": null,
        "customer": "Payfit",
        "customer_key": "05762c5d-3e1e-4fcf-adfa-f989a30f8462",
        "company_id": "05762c5d-3e1e-4fcf-adfa-f989a30f8462",
        "rep": "Olivia Martin",
        "country": "Unknown",
        "amount": 1200,
        "total": 1200,
        "days_late": 0,
        "age": "not_due"
      }
    ]
  },
  "documents": [
    {
      "id": "83d62171-1cc8-466a-ad9c-f9fbce63d4bf",
      "type": "invoice",
      "number": "F-1",
      "date": "2026-10-07",
      "customer": "Payfit",
      "company_id": "05762c5d-3e1e-4fcf-adfa-f989a30f8462",
      "rep": "Olivia Martin",
      "country": "Unknown",
      "status": "open",
      "amount": 1200,
      "lines": 0
    }
  ],
  "documents_total": 1,
  "options": {
    "customer": [
      {
        "key": "05762c5d-3e1e-4fcf-adfa-f989a30f8462",
        "name": "Payfit"
      }
    ],
    "rep": [
      {
        "key": "olivia@acme.com",
        "name": "Olivia Martin"
      }
    ],
    "country": [
      {
        "key": "Unknown",
        "name": "Unknown"
      }
    ]
  },
  "other_currencies": []
}
GET/widgets/erp

ERP figures for the cockpit

The tiles of the Sales cockpit: ordered and invoiced year to date and for the period (with change vs last year), average invoice, unpaid and overdue amounts, aging, payment reliability (payments.reliable: false means the ERP rarely marks invoices as paid, so open amounts are overstated), sales by month, top customers, sales by salesperson, overdue invoices, purchases.

Scope: read

Query parameters

periodstring
week, month, quarter, year, last_month, last_quarter, last_year, d30, d90, m12 (last 12 months) or all. Default year.
scopestring
team (default) or me.
Request
curl "https://meetzy.me/api/v1/widgets/erp?period=month&scope=me" \
  -H "Authorization: Bearer $MEETZY_API_KEY"
const res = await fetch("https://meetzy.me/api/v1/widgets/erp?period=month&scope=me", {
  headers: { Authorization: `Bearer ${process.env.MEETZY_API_KEY}` },
});
const data = await res.json();
import os, requests

res = requests.get(
    "https://meetzy.me/api/v1/widgets/erp?period=month&scope=me",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "connected": true,
  "currency": "EUR",
  "year": 2026,
  "kpis": {
    "orders_ytd": 0,
    "orders_count_ytd": 0,
    "orders_change": null,
    "invoiced_ytd": 1200,
    "invoices_count_ytd": 1,
    "invoiced_change": null,
    "avg_invoice": 1200,
    "unpaid_amount": 1200,
    "unpaid_count": 1,
    "overdue_amount": 0,
    "overdue_count": 0,
    "invoiced_period": 1200,
    "invoiced_period_count": 1,
    "invoiced_period_change": null,
    "orders_period": 0,
    "orders_period_count": 0,
    "orders_period_change": null,
    "spend_ytd": 0,
    "has_spend": false,
    "has_orders": false,
    "has_invoices": true,
    "customers_ytd": 1
  },
  "period": {
    "id": "year",
    "label": "This year",
    "start": "2026-01-01",
    "end": "2027-01-01",
    "compare_start": "2025-01-01",
    "compare_end": "2025-10-08",
    "comparable": false,
    "synced_from": "2026-10-07"
  },
  "aging": [
    {
      "id": "not_due",
      "label": "Not due yet",
      "count": 1,
      "amount": 1200
    },
    {
      "id": "d30",
      "label": "1–30 days late",
      "count": 0,
      "amount": 0
    }
  ],
  "payments": {
    "reliable": true,
    "old_invoices": 0,
    "old_settled": 0
  },
  "monthly": [
    {
      "month": 1,
      "label": "Jan",
      "this_year": 0,
      "last_year": 0
    },
    {
      "month": 2,
      "label": "Feb",
      "this_year": 0,
      "last_year": 0
    }
  ],
  "top_customers": [
    {
      "company_id": "05762c5d-3e1e-4fcf-adfa-f989a30f8462",
      "name": "Payfit",
      "amount": 1200,
      "count": 1,
      "last": "2026-10-07"
    }
  ],
  "by_rep": [
    {
      "email": "olivia@acme.com",
      "amount": 1200,
      "count": 1
    }
  ],
  "overdue": [],
  "other_currencies": []
}
GET/widgets/desktop

Desktop widget snapshot

What the macOS widgets show: today’s tasks, follow-ups due, hot leads, this month’s sales and quick actions, with meetzy:// links that open the app on the right screen. Works with a read-only key — ideal for your own widgets, dashboards or a status bar.

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

res = requests.get(
    "https://meetzy.me/api/v1/widgets/desktop",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "generated_at": "2026-10-07T13:23:28.100Z",
  "user": {
    "name": "Olivia",
    "email": "olivia@acme.com"
  },
  "currency": "EUR",
  "today": {
    "count": 10,
    "overdue": 0,
    "items": [
      {
        "id": "e3ecc019-a3ac-4a49-a642-3fbec133aa2e",
        "title": "Intro call",
        "type": "todo",
        "due_at": "2026-10-07T17:23:10.013+00:00",
        "overdue": false,
        "who": "Camille Laurent",
        "url": "meetzy://app/sales/contacts/8028ff76-1da4-451f-a0e7-dd91db772c20"
      },
      {
        "id": "010c6058-d8ee-49f9-ae8d-2bb84f48ceb9",
        "title": "Send deck",
        "type": "todo",
        "due_at": null,
        "overdue": false,
        "who": null,
        "url": "meetzy://app/sales/tasks"
      },
      {
        "id": "459ed592-bb05-46d6-afa7-2ca190787126",
        "title": "Book the onsite",
        "type": "todo",
        "due_at": null,
        "overdue": false,
        "who": null,
        "url": "meetzy://app/sales/tasks"
      }
    ],
    "url": "meetzy://app/sales/tasks"
  },
  "followups": {
    "count": 0,
    "items": [],
    "url": "meetzy://app/crm?view=grid&filter=reminders:urgent"
  },
  "hot_leads": {
    "items": [
      {
        "id": "8028ff76-1da4-451f-a0e7-dd91db772c20",
        "name": "Camille Laurent",
        "company": "Payfit",
        "score": 40,
        "url": "meetzy://app/sales/contacts/8028ff76-1da4-451f-a0e7-dd91db772c20"
      }
    ],
    "url": "meetzy://app/crm?view=grid"
  },
  "sales": {
    "won_month": 0,
    "won_count": 0,
    "pipeline": 12000,
    "open_deals": 1,
    "new_leads": 0,
    "hot": 0,
    "erp": {
      "currency": "EUR",
      "invoiced_ytd": 1200,
      "orders_ytd": 0,
      "change": null,
      "year": 2026
    },
    "url": "meetzy://app/sales"
  },
  "next_meeting": null,
  "links": {
    "home": "meetzy://app/dashboard",
    "cockpit": "meetzy://app/sales",
    "new_contact": "meetzy://action/new-contact",
    "new_task": "meetzy://app/sales/tasks?new=1",
    "search": "meetzy://action/search"
  }
}
GET/credits

Credits balance and usage

Monthly AI & data credits: total, used, remaining, reset date, usage by action and by teammate, recent consumption, and the cost of each action (revealing a contact, enriching a company, AI emails…).

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

res = requests.get(
    "https://meetzy.me/api/v1/credits",
    headers={"Authorization": f"Bearer {os.environ['MEETZY_API_KEY']}"},
)
data = res.json()
Response200
{
  "balance": {
    "success": true,
    "total": 500,
    "used": 0,
    "remaining": 500,
    "unlimited": false,
    "month_year": "2026-10",
    "resets_at": "2026-10-31T23:00:00.000Z",
    "plan": "starter",
    "onboarding_done": false,
    "dont_show_warning": "false"
  },
  "usage": {
    "tracked": true,
    "by_action": [],
    "by_member": [],
    "recent": []
  },
  "packs": [],
  "actions": [
    {
      "id": "enrich_person",
      "group": "prospecting",
      "label": "Reveal a contact",
      "desc": "Email, phone and profile of one person (refunded if nothing is found)",
      "cost": 1
    },
    {
      "id": "enrich_company",
      "group": "prospecting",
      "label": "Enrich a company",
      "desc": "Firmographics, headcount and tech of one company",
      "cost": 1
    }
  ]
}