agentlyleads docs
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&sections=forecast,winLoss HTTP/1.1
Host: agentlyleads.com
Authorization: Bearer alk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Query parameters

ParameterDescription
rangethis-month (default), last-month, quarter, or custom
from, toWith custom, both required, as YYYY-MM-DD. Inclusive. Up to 366 days. Sending them implies range=custom
ownerIdA user ID from this workspace. Narrows every section to that rep
sectionsComma-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

SectionWhat it holds
forecastOpen 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
outreachPer 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
activityPer active user: emails sent, replies received on their contacts, calls and notes logged, tasks completed, deal stage moves, and the total
winLossDeals 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." }

On this page