---
title: "List events"
url: https://docs.light-ai.app/api-reference/events/list-events.md
canonical_url: https://docs.light-ai.app/api-reference/events/list-events
last_updated: 2026-10-13
summary: "GET /v1/events: Events of the last 30 days your scopes can read."
api_status: beta
related:
  - https://docs.light-ai.app/api-reference/events
---

# List events

> GET /v1/events: Events of the last 30 days your scopes can read.

`GET /v1/events`

Events of the last 30 days your scopes can read. `events:read` or one of `leads:read`, `clients:read`, `projects:read` or `quotes:read` works: the feed holds only the event types those scopes can read (lead events need `leads:read`, quote events `quotes:read`, and so on). Polling integrations should use `sort=sync_asc`: store `next_cursor` and pass it back as `cursor`; every event appears exactly once (no gaps, even for slow transactions). A partner key without Light-AI-Organization lists events of every connected organization under one cursor, each with its `grant`.

|   |   |
| --- | --- |
| Scope | `events:read` |
| Credential | API key: `Authorization: Bearer lai_live_…` (or `lai_test_…`). Partner keys add `Light-AI-Organization`. |
| Test mode | Works with test keys against simulated test objects. |

## Query parameters

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `limit` | integer |  | Page size, 1–100 (default 25). 1–100. |
| `cursor` | string |  | next_cursor from the previous page. At most 400 characters. |
| `sort` | string |  | `sync_asc` is the gapless polling order: store next_cursor and pass it back; every event appears exactly once. One of: `created_desc`, `sync_asc`. |
| `type` | string |  | One of: `lead.created`, `lead.touched`, `lead.updated`, `lead.mockup_ready`, `client.created`, `client.updated`, `client.deleted`, `project.created`, `project.stage_changed`, `quote.published`, `quote.viewed`, `quote.external_link_clicked`, `quote.change_requested`, `quote.approved`, `quote.declined`, `quote.expired`, `quote.link_disabled`, `quote.link_enabled`, `quote.superseded`, `mockup.completed`, `mockup.failed`, `organization.entitlement_changed`, `grant.created`, `grant.revoked`, `api_key.expiring`, `webhook_endpoint.disabled`, `ping`. |
| `types` | string |  | Comma-separated event types. At most 1000 characters. |
| `created_after` | timestamp |  | Only events created after this time (first sync_asc poll only). |
| `grant_id` | string |  | Partner keys: one grant's events. Id prefix `grant_`. |

## Headers

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `Light-AI-Organization` | string |  | Partner keys: the connected organization to act for (`org_…`). Organization keys may omit it. Id prefix `org_`. |
| `Light-AI-Version` | string |  | Pin a dated API version (defaults to the key's version). One of: `2026-11-01`. |

## Response 200

A page of events.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | Always `list`. |
| `data` | Event[] | yes |  |
| `has_more` | boolean | yes |  |
| `next_cursor` | string \| null | yes | Pass as `cursor` to fetch the next page. |

## Errors

| Status | Meaning |
| --- | --- |
| `400` | Bad request. [`bad_request`](https://docs.light-ai.app/errors#bad_request), [`test_mode_mismatch`](https://docs.light-ai.app/errors#test_mode_mismatch), [`test_mode_unsupported`](https://docs.light-ai.app/errors#test_mode_unsupported), [`unsupported_api_version`](https://docs.light-ai.app/errors#unsupported_api_version) |
| `401` | Missing or invalid credential. [`authentication_required`](https://docs.light-ai.app/errors#authentication_required), [`invalid_api_key`](https://docs.light-ai.app/errors#invalid_api_key), [`api_key_revoked`](https://docs.light-ai.app/errors#api_key_revoked), [`api_key_expired`](https://docs.light-ai.app/errors#api_key_expired), [`api_key_suspended`](https://docs.light-ai.app/errors#api_key_suspended) |
| `403` | Not allowed. [`insufficient_scope`](https://docs.light-ai.app/errors#insufficient_scope), [`plan_upgrade_required`](https://docs.light-ai.app/errors#plan_upgrade_required), [`organization_paused`](https://docs.light-ai.app/errors#organization_paused), [`organization_off_season`](https://docs.light-ai.app/errors#organization_off_season), [`api_disabled`](https://docs.light-ai.app/errors#api_disabled), [`api_access_not_enabled`](https://docs.light-ai.app/errors#api_access_not_enabled), [`ip_not_allowed`](https://docs.light-ai.app/errors#ip_not_allowed), [`forbidden`](https://docs.light-ai.app/errors#forbidden) |
| `404` | Not found (also for objects of other organizations and for organizations without an active grant). |
| `422` | Validation failed. [`idempotency_key_reused`](https://docs.light-ai.app/errors#idempotency_key_reused) |
| `429` | Rate limited or daily cap reached. See Retry-After and the RateLimit headers. [`rate_limited`](https://docs.light-ai.app/errors#rate_limited), [`daily_cap_reached`](https://docs.light-ai.app/errors#daily_cap_reached) |
| `500` | Unexpected server error. Safe to retry with exponential backoff; quote the Request-Id to support. [`internal_error`](https://docs.light-ai.app/errors#internal_error) |
| `503` | Temporarily unavailable. Retry with exponential backoff. [`service_unavailable`](https://docs.light-ai.app/errors#service_unavailable) |

## Examples

**Request**

curl:

```bash
curl -X GET "https://api.light-ai.app/v1/events" \
  -H "Authorization: Bearer $LIGHT_AI_API_KEY"
```

JavaScript:

```javascript
const response = await fetch('https://api.light-ai.app/v1/events', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.LIGHT_AI_API_KEY}`,
  },
});
const data = await response.json();
```

Python:

```python
import os, uuid, requests

response = requests.get(
    "https://api.light-ai.app/v1/events",
    headers={
        "Authorization": f"Bearer {os.environ['LIGHT_AI_API_KEY']}",
    },
    timeout=30,
)
data = response.json()
```

**Response 200**

```json
{
  "object": "list",
  "data": [
    {
      "id": "evt_3f9c2a7be41d…",
      "object": "event",
      "api_version": "2026-11-01",
      "created": "2026-10-12T14:03:11.000Z",
      "livemode": false,
      "organization": {
        "id": "org_3f9c2a7be41d…",
        "name": "Dana Reyes"
      },
      "grant": {
        "id": "grant_3f9c2a7be41d…",
        "external_reference": "string",
        "metadata": {}
      },
      "origin": {
        "type": "app",
        "principal_id": "string",
        "source_system": "string",
        "external_ref": {
          "system": "string",
          "namespace": {},
          "id": "string"
        }
      },
      "type": "lead.created",
      "data": {
        "object": {
          "id": "lead_3f9c2a7be41d…",
          "object": "lead",
          "livemode": false,
          "status": "new",
          "held": true,
          "needs_address": true,
          "source": "website_widget",
          "source_detail": "string",
          "contact": {
            "first_name": {},
            "last_name": {},
            "email": {},
            "email_raw": {},
            "phone": {},
            "phone_raw": {},
            "phone_verified": {}
          },
          "address": {
            "line1": {},
            "line2": {},
            "city": {},
            "region": {},
            "postal_code": {},
            "country": {},
            "formatted": {},
            "lat": {},
            "lng": {}
          },
          "service_interest": "christmas_lights",
          "service_interest_raw": "string",
          "message": "string",
          "attribution": {},
          "consent": {},
          "custom_fields": {},
          "notes": "string",
          "status_reason": "string",
          "client_id": "cli_3f9c2a7be41d…",
          "property_id": "prop_3f9c2a7be41d…",
          "possible_client_match": {
            "client_id": {}
          },
          "project": {
            "id": {},
            "status": {},
            "pipeline_stage": {},
            "app_url": {}
          },
          "form": {
            "id": {},
            "name": {}
          },
          "mockup_status": "not_requested",
          "form_answers": [],
          "preview_looks": [
            "warm_white"
          ],
          "offer": {
            "template": "black_friday",
            "headline": "Black Friday: 20% off installs",
            "discount_type": "percent",
            "discount_percent": 20,
            "discount_amount": null,
            "label": "20% off",
            "ends_at": "2026-11-30T05:59:00Z",
            "book_by": "Book by Dec 1 for install before Christmas",
            "captured_at": "2026-11-27T14:03:11Z"
          },
          "assets": {
            "photos": [],
            "mockups": []
          },
          "external_refs": [],
          "touch_count": 1,
          "last_touched_at": "2026-10-12T14:03:11.000Z",
          "submitted_at": "2026-10-12T14:03:11.000Z",
          "created_at": "2026-10-12T14:03:11.000Z",
          "updated_at": "2026-10-12T14:03:11.000Z",
          "replayed": true,
          "fixture": true
        },
        "previous_attributes": {}
      }
    }
  ],
  "has_more": true,
  "next_cursor": "string"
}
```
