---
title: "Read the public intelligence change feed"
description: "Returns immutable public-resource lifecycle events in global order. An authenticated API key receives globally visible intelligence changes plus changes owned by its user or workspace tenant. Anonymous x402 requests receive globally visible intelligence changes only. Tenant records are never exposed across scopes. The `watermark` is an opaque exclusive checkpoint: persist the returned value and send it on the next request. Replaying a checkpoint never skips later events and may safely be retried after a consumer failure. Deleted resources are represented as tombstones. Events are append-only in schema version `1.0`. No retention expiry is currently applied."
canonical: https://y2.dev/docs/api/reference/intel/listChangesV2/
---

Endpoint Reference[Intel](https://y2.dev/docs/api/reference/intel)

# Read the public intelligence change feed

Returns immutable public-resource lifecycle events in global order. An authenticated API key receives globally visible intelligence changes plus changes owned by its user or workspace tenant. Anonymous x402 requests receive globally visible intelligence changes only. Tenant records are never exposed across scopes. The \`watermark\` is an opaque exclusive checkpoint: persist the returned value and send it on the next request. Replaying a checkpoint never skips later events and may safely be retried after a consumer failure. Deleted resources are represented as tombstones. Events are append-only in schema version \`1.0\`. No retention expiry is currently applied.

`GET https://api.y2.dev/api/v2/changes`

- Operation ID: `listChangesV2`
- Required scopes: `osint:read`
- Accepts x402 pay-per-request payment
- Contract: https://y2.dev/openapi.json

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `format` | query | `json`, `ndjson` | No | `json` uses the resource envelope. `ndjson` streams one canonical row per line. |
| `watermark` | query | string | No | Opaque exclusive checkpoint returned by an earlier response. |
| `limit` | query | integer | No | Maximum number of change events to return. |

## Responses

| Status | Description | Body |
| --- | --- | --- |
| 200 | Ordered public resource changes after the supplied watermark. | `ChangeFeedResponse` |
| 400 | Invalid request parameters |  |
| 401 | Missing or invalid API key |  |
| 402 | x402 payment required | `X402PaymentRequiredResponse` |
| 403 | Insufficient permissions or access denied |  |
| 429 | Rate limit exceeded (per-key or per-account aggregate) |  |
| 500 | Internal server error |  |

### 200 response fields

| Field | Type | Description |
| --- | --- | --- |
| `data[]` | array of `PublicChangeEvent` |  |
| `data[].source` | `RecordSource` | Where a record came from, how Y2 obtained it, and when. |
| `data[].id` | string |  |
| `data[].type` | string |  |
| `data[].changeType` | `created`, `updated`, `deleted` |  |
| `data[].resource` | object |  |
| `data[].changedAt` | string (date-time) |  |
| `data[].tombstone` | boolean | True when the referenced resource has been deleted. |
| `data[].schemaVersion` | string |  |
| `meta` | `ChangeFeedMeta` |  |
| `meta.count` | integer |  |
| `meta.pageCount` | integer |  |
| `meta.limit` | integer |  |
| `meta.isDone` | boolean |  |
| `meta.hasMore` | boolean |  |
| `meta.nextCursor` | string or null |  |
| `meta.asOf` | string (date-time) |  |
| `meta.page` | `PublicPageMeta` |  |
| `meta.watermark` | string or null | Exclusive checkpoint after the final event in this response. |
| `meta.fromExclusive` | boolean |  |
| `links` | `ChangeFeedLinks` |  |
| `links.self` | string |  |
| `links.next` | string or null |  |
| `links.resume` | string or null | URL containing the checkpoint to persist even when the feed is caught up. |
