Reports API
GET /api/v1/reports
Returns the numbers on the Performance page as JSON, for one date range. Requires the read:reports scope (or *). The page and the API run the same queries, so they always agree.
GET /api/v1/reports?range=custom&from=2026-09-01&to=2026-09-30§ions=forecast,winLoss HTTP/1.1
Host: agentlyleads.com
Authorization: Bearer alk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxQuery parameters
| Parameter | Description |
|---|---|
range | this-month (default), last-month, quarter, or custom |
from, to | With custom, both required, as YYYY-MM-DD. Inclusive. Up to 366 days. Sending them implies range=custom |
ownerId | A user ID from this workspace. Narrows every section to that rep |
sections | Comma-separated: any of forecast, outreach, activity, winLoss. Default all four |
Dates are read in UTC. Money is in the workspace's currency, as plain numbers.
Response: 200
{
"report": {
"range": { "preset": "custom", "from": "2026-09-01T00:00:00.000Z", "to": "2026-09-30T23:59:59.999Z" },
"ownerId": null,
"forecast": {
"stageProbability": { "NEW": 0.1, "QUALIFIED": 0.25, "PROPOSAL": 0.5, "NEGOTIATION": 0.75 },
"months": [
{
"month": "2026-09",
"byStage": {
"NEW": { "count": 0, "value": 0, "weighted": 0 },
"QUALIFIED": { "count": 1, "value": 4000, "weighted": 1000 },
"PROPOSAL": { "count": 1, "value": 1000, "weighted": 500 },
"NEGOTIATION": { "count": 0, "value": 0, "weighted": 0 }
},
"totalValue": 5000,
"totalWeighted": 1500
}
],
"noCloseDate": { "count": 2, "value": 3500 },
"totalValue": 5000,
"totalWeighted": 1500
},
"winLoss": {
"rows": [{ "source": "Referral", "wonCount": 1, "wonValue": 500, "lostCount": 0, "lostValue": 0, "avgDaysToClose": 10 }],
"totals": { "wonCount": 1, "wonValue": 500, "lostCount": 0, "lostValue": 0, "winRate": 100 }
}
}
}Sections
| Section | What it holds |
|---|---|
forecast | Open deals by expected close month and stage, raw and weighted by stage probability. noCloseDate counts open deals with no expected close date, which the forecast can't place |
outreach | Per campaign with sends in the range: sent, delivered, replies, positive replies, unsubscribes and rates (percent, one decimal). repliesByWeek buckets first replies into 7-day windows from from |
activity | Per active user: emails sent, replies received on their contacts, calls and notes logged, tasks completed, deal stage moves, and the total |
winLoss | Deals won or lost in the range, grouped by the contact's source, with the average days from creation to close and the overall win rate (percent) |
Only the sections you ask for appear in report.
For a live snapshot of open and won deals by stage, the MCP connector's pipeline_report tool is the quicker read.
Errors
400 with a message for anything the page would have quietly ignored:
{ "error": "A custom range needs both from and to, as YYYY-MM-DD." }{ "error": "ownerId is not a user in this workspace." }{ "error": "Unknown section \"pipeline\". sections takes a comma-separated list of: forecast, outreach, activity, winLoss." }