<!-- Source: https://useworkloom.com/dev/reports/ · Workloom API v1 -->

# Reports

The revenue report: won, lost and open deals over a period, by stage, by source, by lost reason and by teammate. It is read-only.

Scopes: `reports:read`.

## The report object

- `period` (object): The window the report covers.
- `summary` (object): Counts and values. `win_rate_pct` is null when nothing closed. `no_amount` counts deals with no amount, which are not in `value`.
- `by_stage` (array of object): Open deals per stage, in your pipeline’s order.
- `by_source` (array of object): Where deals came from, and what each source won.
- `lost_reasons` (array of object): Why deals were lost, counted. "unrecorded" when no reason was given.
- `by_rep` (array of object): Per teammate, with unowned deals as their own row (seat_id null).

```json
{
  "period": {
    "days": 90,
    "since": "2026-07-09T09:00:00.000Z",
    "until": "2026-10-07T09:00:00.000Z"
  },
  "summary": {
    "open": {
      "count": 23,
      "value": 687700,
      "no_amount": 2
    },
    "won": {
      "count": 6,
      "value": 179400,
      "no_amount": 0
    },
    "lost": {
      "count": 9,
      "value": 211000,
      "no_amount": 1
    },
    "created": {
      "count": 31,
      "value": 902300,
      "no_amount": 3
    },
    "win_rate_pct": 40,
    "median_cycle_days": 34,
    "average_won_value": 29900,
    "currency": "USD"
  },
  "by_stage": [
    {
      "stage": "discovery",
      "label": "Discovery",
      "count": 14,
      "value": 418600
    },
    {
      "stage": "proposal",
      "label": "Proposal",
      "count": 6,
      "value": 179400
    },
    {
      "stage": "commit",
      "label": "Commit",
      "count": 3,
      "value": 89700
    }
  ],
  "by_source": [
    {
      "source": "manual",
      "open": 12,
      "open_value": 358800,
      "won": 4,
      "won_value": 119600,
      "lost": 5,
      "win_rate_pct": 44
    }
  ],
  "lost_reasons": [
    {
      "reason": "no_budget",
      "count": 4,
      "value": 96000
    }
  ],
  "by_rep": [
    {
      "seat_id": "66e0f1a2e4b0a1b2c3d40a0b",
      "name": "Asha Rao",
      "open": 9,
      "open_value": 269100,
      "won": 3,
      "won_value": 89700,
      "lost": 2
    }
  ]
}
```

## Endpoints

### Revenue report

`GET /reports/revenue`

Won revenue, pipeline and win rate over a period.

Scope: `reports:read`

**Query parameters**

- `days` (integer): How far back, in days. Default 90.

**Request**

```bash
curl "https://api.useworkloom.com/api/public/v1/reports/revenue" \
  -H "Authorization: Bearer $WORKLOOM_KEY"
```

```javascript
const res = await fetch("https://api.useworkloom.com/api/public/v1/reports/revenue", {
  method: "GET",
  headers: {
    Authorization: `Bearer ${process.env.WORKLOOM_KEY}`
  }
});
const data = await res.json();
```

```python
import os, requests

res = requests.get(
    "https://api.useworkloom.com/api/public/v1/reports/revenue",
    headers={"Authorization": f"Bearer {os.environ['WORKLOOM_KEY']}"},
)
data = res.json()
```

**Response (sample, 200)**

```json
{
  "data": {
    "period": {
      "days": 90,
      "since": "2026-07-09T09:00:00.000Z",
      "until": "2026-10-07T09:00:00.000Z"
    },
    "summary": {
      "open": {
        "count": 23,
        "value": 687700,
        "no_amount": 2
      },
      "won": {
        "count": 6,
        "value": 179400,
        "no_amount": 0
      },
      "lost": {
        "count": 9,
        "value": 211000,
        "no_amount": 1
      },
      "created": {
        "count": 31,
        "value": 902300,
        "no_amount": 3
      },
      "win_rate_pct": 40,
      "median_cycle_days": 34,
      "average_won_value": 29900,
      "currency": "USD"
    },
    "by_stage": [
      {
        "stage": "discovery",
        "label": "Discovery",
        "count": 14,
        "value": 418600
      },
      {
        "stage": "proposal",
        "label": "Proposal",
        "count": 6,
        "value": 179400
      },
      {
        "stage": "commit",
        "label": "Commit",
        "count": 3,
        "value": 89700
      }
    ],
    "by_source": [
      {
        "source": "manual",
        "open": 12,
        "open_value": 358800,
        "won": 4,
        "won_value": 119600,
        "lost": 5,
        "win_rate_pct": 44
      }
    ],
    "lost_reasons": [
      {
        "reason": "no_budget",
        "count": 4,
        "value": 96000
      }
    ],
    "by_rep": [
      {
        "seat_id": "66e0f1a2e4b0a1b2c3d40a0b",
        "name": "Asha Rao",
        "open": 9,
        "open_value": 269100,
        "won": 3,
        "won_value": 89700,
        "lost": 2
      }
    ]
  }
}
```

**Errors**

- 400: `invalid_request`, `unknown_fields`, `reason_required` or `unsupported_version`.
- 401: `authentication_required` or `invalid_key`.
- 403: `missing_scope`, `forbidden`, `seat_inactive` or `organisation_inactive`.
- 429: `rate_limited`. Wait `Retry-After` seconds.
- 500: `internal_error`.
