# Report a conversion goal's results

Source: https://kirora.io/docs/api/reference/getConversionGoalMetrics

`GET /v1/conversion-goals/{id}/metrics`

Requires an API key with the `conversion-goals:read` scope. [About keys and scopes](https://kirora.io/docs/api/reference/authentication)

Works with integration, agent and partner keys.

Conversions, the contacts who converted out of those sent to, and revenue when the goal has a `valueProperty`. Revenue sums values in the goal currency only: a value counts when it is a non-negative number or numeric string (`"49.90"`, no thousands separators) up to 999,999,999,999.99. `conversionsWithoutValue` counts the conversions that carried none — the property missing or unusable, a negative (refunds are not revenue), or an event naming another currency — so it explains a gap between conversions and revenue. `reachedContacts` counts only sends a conversion could be credited to: from one attribution window before `countedFrom`. `conversionRate` is null until there is such a send. The totals are all time, every conversion the goal has counted since `countedFrom` (each under the attribution window in force when it was counted; see `windowChangedAt`); `history` covers the report window (`from` inclusive to `to` exclusive, the last 30 days by default) day by day in the workspace timezone.

## Path parameters

- `id` (string, required, uuid) — The conversion goal's id.

## Query parameters

- `from` (string, optional) — Start of the window, inclusive: a date-time, or a date meaning the start of that day in the workspace timezone. Give with `to`; omit both for the last 30 days.
- `to` (string, optional) — End of the window, exclusive, in the same forms. To include a whole last day, pass the day after it: `from=2026-10-01&to=2026-10-08` covers 1 to 7 October. No later than the end of today; a window touches at most 366 days. Give with `from`.

## Header parameters

- `Kirora-Workspace` (string, optional, pattern `^[A-Za-z0-9._:-]{1,128}$`) — Partner keys only: the child workspace to act in, by the external id the partner gave it. Without it, a partner key acts in its own workspace. Any other key that sends it is refused with 403, and an unknown workspace is 404.

## Returns

Returns `200 OK` with a `ConversionGoalMetrics` in `data`. Otherwise returns an error; [Errors](https://kirora.io/docs/api/reference/errors) lists every code and which to retry.

- `conversionGoalId` (string, required, uuid)
- `conversions` (integer, required, min 0) — All time: every event the goal counted, from `countedFrom`; one contact can convert more than once.
- `convertedContacts` (integer, required, min 0) — All time: the contacts behind `conversions`.
- `reachedContacts` (integer, required, min 0) — All time: contacts sent to that a conversion could be credited to, from one attribution window before `countedFrom`.
- `conversionRate` (number | null, required, min 0) — All time: `convertedContacts` over `reachedContacts`; `null` before there is such a send.
- `revenue` (object | null, required) — All time: the value property's sum, in the goal currency; `null` when the goal has no `valueProperty`.
  - `currency` (string | null, required) — The currency, an ISO 4217 code; null when none was named.
  - `value` (number, required) — The amount in that currency.
- `conversionsWithoutValue` (integer | null, required, min 0) — All time: conversions counted without a value (the property missing, not a non-negative number, too large, or the event naming another currency); `null` when the goal has no `valueProperty`.
- `history` (object, required) — The conversions in the report window.
  - `from` (string, required, date-time) — Start of the window, inclusive.
  - `to` (string, required, date-time) — End of the window, exclusive.
  - `timezone` (string, required) — The workspace timezone the days are in.
  - `series` (object[], required) — One entry per day in the window, by when each conversion happened.
    - `startsAt` (string, required, date-time) — When this day starts in `timezone`, given as an instant.
    - `conversions` (integer, required, min 0)
    - `revenue` (object | null, required) — The day's revenue; null when the goal has no `valueProperty`.
      - `currency` (string | null, required) — The currency, an ISO 4217 code; null when none was named.
      - `value` (number, required) — The amount in that currency.

## Example

```bash
curl https://api.kirora.io/v1/conversion-goals/018f2a4e-6b1c-7d3e-9f40-37386ae05a6b/metrics \
  -H "Authorization: Bearer $KIRORA_API_KEY"
```

Response `200`:

```json
{
  "data": {
    "conversionGoalId": "0192f3d0-7a1b-7c2d-8e3f-4a5b6c7d8e9f",
    "conversions": 41,
    "convertedContacts": 38,
    "reachedContacts": 1180,
    "conversionRate": 0.03220338983050847,
    "revenue": {
      "currency": "USD",
      "value": 2050
    },
    "conversionsWithoutValue": 0,
    "history": {
      "from": "2026-09-26T00:00:00.000Z",
      "to": "2026-09-28T00:00:00.000Z",
      "timezone": "UTC",
      "series": [
        {
          "startsAt": "2026-09-26T00:00:00.000Z",
          "conversions": 3,
          "revenue": {
            "currency": "USD",
            "value": 150
          }
        },
        {
          "startsAt": "2026-09-27T00:00:00.000Z",
          "conversions": 2,
          "revenue": {
            "currency": "USD",
            "value": 100
          }
        }
      ]
    }
  }
}
```
