# Public app update feed

Retrieve `https://bluejetty.ai/v1/changes` without authentication to discover material public-record changes observed since this feed's rollout. Existing index, packet and filter contracts are unchanged. This feed complements the sitemap; it is not a full export or a record of every intermediate publisher edit.

Parameters: `after` is an unsigned decimal event ID (default `0`); `limit` is 1–20 (default 20). Unknown or duplicate parameters are rejected with 400. Follow `meta.next` unchanged even if `data` is empty. When `next` is null, save `meta.poll` and use that URL for subsequent polling. Respect no-store, bounded concurrency and error backoff. ETags and HEAD are supported after current-publication checks.

Each event has `id`, `kind`, `url`, and `observedAt`. Currently readable observations also include `recordUrl` for the live JSON representation. IDs are strings and may have gaps. `observedAt` is the time Blue Jetty detected the change, not a store release date or publisher edit timestamp.

- `observed`: first observation by this feed. It does **not** mean the app was newly added.
- `updated`: a different material public representation, including identity, context, destinations or available playable content.
- `removed`: a previously public URL was withdrawn or replaced. Only its prior URL is supplied.

Example: `{"data":[{"id":"42","kind":"updated","url":"https://bluejetty.ai/apps/example-00000042","recordUrl":"https://bluejetty.ai/v1/index/apps/00000042","observedAt":"2026-09-15T00:00:00.000Z"}],"meta":{"format":"bluejetty.app_changes/1","next":null,"poll":"https://bluejetty.ai/v1/changes?after=42&limit=20","checkpoint":"42","order":"observation_sequence","history":"since_rollout","initialEvent":"observed_not_newly_added"}}`

Invalid examples: `?after=-1`, `?limit=21`, `?after=1&after=2`, `?unknown=1`.

Events contain no private source snapshots. Current permission checks can omit observations; cursor progress still advances over those events. Changes are detected by the bounded maintenance worker, not synchronously at every write. Multiple edits between checks can be coalesced. No historical completeness or indexing guarantee is implied. An IndexNow acknowledgement means notification acceptance, not confirmed search indexing.

Sitemap dates use the last detected material change where available, preserving existing record dates at first observation. Repeated checks and deployments do not intentionally advance those dates. Newly added or withdrawn content becomes visible to this feed after reconciliation.

Use `/apps/explore` for crawlable category, publisher-authorized, recently updated and playable-demo collections. Playable collection entries require current access, review and publisher Arcade opt-in. A missing demo does not imply the app is unavailable.
