# List Leads

> Leads with their consent records (newest first).

Source: https://shopassist.coec.dk/docs/api/reference/engagement/list-leads · Updated 2026-11-03

`GET /v1/stores/{store_id}/leads`

- Scope: `leads:read`
- Rate limit: 600 requests/min per API key (test keys: 60/min)

Leads with their consent records (newest first).

## Parameters [#parameters]

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `store_id` | path | `string` | yes |  |
| `updated_since` | query | `string \| null` | no |  |
| `newsletter_status` | query | `"none" \| "pending_confirmation" \| "confirmed" \| "unsubscribed" \| null` | no |  |
| `limit` | query | `integer` | no | Page size |
| `cursor` | query | `string \| null` | no | Cursor from the previous page |

## Example request [#example-request]

```bash
curl -X GET "https://api.shopassist.coec.dk/v1/stores/sto_01j8000000e008000000000000/leads" \
  -H "Authorization: Bearer $SHOPASSIST_API_KEY"
```

## Response 200 (Page_Lead_) [#response]

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `data` | `Lead[]` | yes |  |
| `data[].confirmed_at` | `string \| null` | yes | format date-time |
| `data[].consents` | `ConsentRecordView[]` | yes |  |
| `data[].consents[].confirmed_at` | `string \| null` | yes | format date-time |
| `data[].consents[].consent_text` | `string` | yes |  |
| `data[].consents[].consent_text_version` | `string` | yes |  |
| `data[].consents[].created_at` | `string` | yes | format date-time |
| `data[].consents[].id` | `string` | yes | pattern `^cns_[0-9a-hjkmnp-tv-z]{26}$` |
| `data[].consents[].is_granted` | `boolean` | yes |  |
| `data[].consents[].locale` | `string` | yes |  |
| `data[].consents[].purpose` | `string (enum)` | yes | one of newsletter, marketing_email, back_in_stock, transcript_email, handoff_share, analytics, preferences |
| `data[].consents[].source` | `string (enum)` | yes | one of widget_form, chat, cmp, double_opt_in, unsubscribe, dashboard, api |
| `data[].consents[].withdrawn_at` | `string \| null` | yes | format date-time |
| `data[].conversation_id` | `string \| null` | yes | pattern `^conv_[0-9a-hjkmnp-tv-z]{26}$` |
| `data[].created_at` | `string` | yes | format date-time |
| `data[].email` | `string` | yes |  |
| `data[].id` | `string` | yes | pattern `^lead_[0-9a-hjkmnp-tv-z]{26}$` |
| `data[].locale` | `string \| null` | yes |  |
| `data[].name` | `string \| null` | yes |  |
| `data[].newsletter_status` | `"none" \| "pending_confirmation" \| "confirmed" \| "unsubscribed"` | yes |  |
| `data[].platform_sync_status` | `"not_required" \| "pending" \| "synced" \| "failed"` | yes |  |
| `data[].purposes` | `("newsletter" \| "contact_request" \| "back_in_stock" \| "transcript")[]` | yes |  |
| `data[].source` | `"lead_form" \| "chat_tool" \| "handoff" \| "back_in_stock"` | yes |  |
| `data[].unsubscribed_at` | `string \| null` | yes | format date-time |
| `has_more` | `boolean` | yes |  |
| `next_cursor` | `string \| null` | yes | Opaque cursor for the next page; null on the last page |

```json
{
  "data": [
    {
      "confirmed_at": "2026-09-28T10:15:30.123Z",
      "consents": [
        {
          "confirmed_at": "2026-09-28T10:15:30.123Z",
          "consent_text": "string",
          "consent_text_version": "string",
          "created_at": "2026-09-28T10:15:30.123Z",
          "id": "cns_01j8000000e008000000000000",
          "is_granted": true,
          "locale": "da-DK",
          "purpose": "newsletter",
          "source": "widget_form",
          "withdrawn_at": "2026-09-28T10:15:30.123Z"
        }
      ],
      "conversation_id": "conv_01j8000000e008000000000000",
      "created_at": "2026-09-28T10:15:30.123Z",
      "email": "string",
      "id": "lead_01j8000000e008000000000000",
      "locale": "da-DK",
      "name": "string",
      "newsletter_status": "none",
      "platform_sync_status": "not_required",
      "purposes": [
        "newsletter"
      ],
      "source": "lead_form",
      "unsubscribed_at": "2026-09-28T10:15:30.123Z"
    }
  ],
  "has_more": true,
  "next_cursor": "string"
}
```

## Errors [#errors]

| Status | Meaning |
| --- | --- |
| 400 | Bad Request ([error codes](/docs/api/errors)) |
| 401 | Unauthorized ([error codes](/docs/api/errors)) |
| 403 | Forbidden ([error codes](/docs/api/errors)) |
| 404 | Not Found ([error codes](/docs/api/errors)) |
| 422 | Unprocessable Content ([error codes](/docs/api/errors)) |
| 429 | Too Many Requests ([error codes](/docs/api/errors)) |
