# List the conversion goals of a campaign or journey

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

`GET /v1/conversion-goals`

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.

Pass exactly one of `campaignId` or `journeyId`. Cursor-paginated: pass `meta.pagination.nextCursor` back as `cursor` until it is `null`.

## Query parameters

- `limit` (integer, optional, min > 0, max 100, default `20`) — How many items a page holds: 1 to 100, 20 by default.
- `cursor` (string, optional, 1–2,048 characters) — Where the page starts: the previous page's `meta.pagination.nextCursor`. Omit it for the first page, and send the same filters with it.
- `campaignId` (string, optional, uuid) — The campaign's goals.
- `journeyId` (string, optional, uuid) — The journey's goals.

## 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 list of `ConversionGoal` objects in `data`, and the next page's cursor in `meta` (see [pagination](https://kirora.io/docs/api/reference/pagination)). Otherwise returns an error; [Errors](https://kirora.io/docs/api/reference/errors) lists every code and which to retry.

- `id` (string, required, uuid)
- `campaignId` (string | null, required, uuid) — The campaign it measures.
- `journeyId` (string | null, required, uuid) — The journey it measures.
- `eventName` (string, required) — The event that counts as a conversion.
- `where` (object[] | null, required, at least 1 item, at most 5 items) — Property conditions the event must meet; `null` counts every one.
  - `property` (string, required, 1–64 characters) — The event property key.
  - `operator` (string, required, one of `equals`, `notEquals`, `gt`, `gte`, `lt`, `lte`) — `notEquals` also matches an event without the property. `equals` and `notEquals` compare the property as text, ignoring case and accents.
  - `value` (string, required, up to 255 characters) — What to compare with, as text (`"pro"`, `"true"`); a number (`"50"`) for `gt`, `gte`, `lt` and `lte`.
- `occurrence` (string | null, required, one of `first`, `repeat`) — `first`: only the contact's first event of this name; `repeat`: any after it; `null`: every one.
- `attributionWindow` (Duration, required) — How long after a message the event still counts, in days.
  - `value` (integer, required, min > 0)
  - `unit` (string, required, one of `seconds`, `minutes`, `hours`, `days`)
- `windowChangedAt` (string | null, required, date-time) — When the attribution window was last changed; `null` if never. A change applies to events processed after it: conversions counted before keep the window they were counted under.
- `valueProperty` (string | null, required) — The event property summed as revenue; `null` counts no value.
- `currency` (string | null, required) — The revenue's currency, if named.
- `countedFrom` (string, required, date-time) — The earliest events the goal can count: when it was created, the start of the event history then retained. Events from then on are matched to the sends before them, those tracked before the goal existed included; older ones are gone.
- `createdAt` (string, required, date-time)

## Example

```bash
curl https://api.kirora.io/v1/conversion-goals \
  -H "Authorization: Bearer $KIRORA_API_KEY"
```

Response `200`:

```json
{
  "data": [
    {
      "id": "0192f3d0-7a1b-7c2d-8e3f-4a5b6c7d8e9f",
      "campaignId": null,
      "journeyId": "0192f3a4-3d5e-7a7f-8c43-6b8c9d0e1f2a",
      "eventName": "Order Completed",
      "where": null,
      "occurrence": null,
      "attributionWindow": {
        "value": 30,
        "unit": "days"
      },
      "windowChangedAt": null,
      "valueProperty": "total",
      "currency": "USD",
      "countedFrom": "2026-07-03T09:30:00.000Z",
      "createdAt": "2026-10-01T09:30:00.000Z"
    }
  ],
  "meta": {
    "pagination": {
      "limit": 20,
      "nextCursor": null
    }
  }
}
```
