> ## Documentation Index
> Fetch the complete documentation index at: https://docs.agg.market/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> To integrate AGG, start with Quickstart: REST (https://docs.agg.market/quickstart/rest), then Order lifecycle & statuses (https://docs.agg.market/concepts/order-lifecycle).
> Track every trade until it reaches a terminal status. Before retrying a failed or timed-out call, read Errors, retries & idempotency (https://docs.agg.market/concepts/errors).
> The API reference is generated from https://docs.agg.market/openapi/openapi.json.

# List catalog changes

> Events and markets that were created, changed or deleted after `since`, oldest first, one item per entity with its current state (including cross-venue matching). This is the catch-up half of the catalog feed: subscribe to the WebSocket `catalog` channel first, then page this endpoint from your last `changedAt` (minus about a minute of overlap) until `hasMore` is false, and apply each item only when its (version, changedAt) is newer than what you hold. The SDK's `watchCatalog` does all of this. Positions older than 24 hours return 410 `resync_required`: re-list with GET /venue-events and GET /venue-markets, then resume from the time you started that re-list.

## Integration guide

* **Before you call:** [Understand events, markets, and outcomes](https://docs.agg.market/concepts/markets.md).
* **Workflow:** [Keep a local catalog in sync](https://docs.agg.market/recipes/catalog-sync.md).
* **Next:** [Subscribe to live orderbook updates](https://docs.agg.market/recipes/websocket-orderbook.md).


## OpenAPI

````yaml /openapi/openapi.json get /catalog/changes
openapi: 3.0.2
info:
  title: AGG API
  version: 1.0.0
  description: >-
    Prediction market aggregator REST API — authentication, users, venue events,
    venue markets, orderbooks, charts, and execution workflows.
servers:
  - url: https://api.agg.market
    description: Production
security: []
tags:
  - name: Authentication
    description: Sign users in and manage their session tokens.
  - name: Markets
    description: Find events, markets and outcomes to trade.
  - name: Market Data
    description: Live orderbooks, prices, charts and scores for those markets.
  - name: Trading
    description: Quote, place, sign, track and cancel orders.
  - name: Portfolio
    description: A user's orders, positions, balances and activity.
  - name: Funding
    description: Deposit addresses, withdrawals, balance refills and fiat on-ramp.
  - name: Users
    description: The signed-in user's profile, linked accounts, KYC and venue keys.
  - name: Hosted Venue Accounts
    description: Provision, fund and withdraw from venue accounts hosted for the user.
  - name: Webhooks
    description: Configure and operate webhook delivery to your server.
  - name: Partner Admin
    description: Server-side reads across your app's users, orders and analytics.
  - name: Paper Trading
    description: Simulated accounts and orders for testing without real funds.
  - name: News
    description: News feeds linked to markets.
  - name: Correlated Markets
    description: Markets related to a given market and the effect of its resolution.
paths:
  /catalog/changes:
    get:
      tags:
        - Markets
      summary: List catalog changes
      description: >-
        Events and markets that were created, changed or deleted after `since`,
        oldest first, one item per entity with its current state (including
        cross-venue matching). This is the catch-up half of the catalog feed:
        subscribe to the WebSocket `catalog` channel first, then page this
        endpoint from your last `changedAt` (minus about a minute of overlap)
        until `hasMore` is false, and apply each item only when its (version,
        changedAt) is newer than what you hold. The SDK's `watchCatalog` does
        all of this. Positions older than 24 hours return 410 `resync_required`:
        re-list with GET /venue-events and GET /venue-markets, then resume from
        the time you started that re-list.
      operationId: getCatalogChanges
      parameters:
        - name: since
          in: query
          required: false
          description: >-
            Start of the walk (ISO). Required unless `cursor` is sent. At most
            24 hours ago — older positions get 410 and a full resync via the
            list endpoints.
          schema:
            format: date-time
            description: >-
              Start of the walk (ISO). Required unless `cursor` is sent. At most
              24 hours ago — older positions get 410 and a full resync via the
              list endpoints.
            type: string
        - name: cursor
          in: query
          required: false
          description: '`nextCursor` from the previous page. Takes precedence over `since`.'
          schema:
            description: >-
              `nextCursor` from the previous page. Takes precedence over
              `since`.
            type: string
        - name: limit
          in: query
          required: false
          schema:
            minimum: 1
            maximum: 500
            default: 200
            type: number
        - name: venues
          in: query
          required: false
          schema:
            anyOf:
              - type: array
                items:
                  $ref: '#/components/schemas/Venue'
              - $ref: '#/components/schemas/Venue'
        - name: entities
          in: query
          required: false
          schema:
            anyOf:
              - type: array
                items:
                  type: string
                  enum:
                    - event
                    - market
              - type: string
                enum:
                  - event
              - type: string
                enum:
                  - market
      responses:
        '200':
          description: '200'
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                  - nextCursor
                  - hasMore
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/CatalogChange'
                  nextCursor:
                    description: >-
                      Always set. Pass it back to continue — including after
                      `hasMore` is false, to poll from where you stopped.
                    type: string
                  hasMore:
                    description: >-
                      More changes are already available. A page can hold fewer
                      than `limit` items (or none) while this is true.
                    type: boolean
        '400':
          description: '400'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '401':
          description: '401'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
        '410':
          description: '410'
          content:
            application/json:
              schema:
                type: object
                required:
                  - message
                  - code
                properties:
                  message:
                    type: string
                  code:
                    type: string
                    enum:
                      - resync_required
        '429':
          description: '429'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitError'
          headers:
            Retry-After:
              schema:
                pattern: ^[1-9][0-9]*$
                description: Seconds to wait before another request; do not retry earlier.
                type: string
            Cache-Control:
              schema:
                type: string
                enum:
                  - private, no-store
        '503':
          description: '503'
          content:
            application/json:
              schema:
                anyOf:
                  - type: object
                    required:
                      - statusCode
                      - code
                      - message
                      - retryAfter
                    properties:
                      statusCode:
                        type: number
                        enum:
                          - 503
                      code:
                        type: string
                        enum:
                          - rate_limit_unavailable
                      message:
                        type: string
                      retryAfter:
                        minimum: 1
                        description: Retry delay in seconds.
                        type: integer
                  - $ref: '#/components/schemas/ErrorMessage'
          headers:
            Retry-After:
              schema:
                pattern: ^[1-9][0-9]*$
                description: Seconds to wait before another request; do not retry earlier.
                type: string
            Cache-Control:
              schema:
                type: string
                enum:
                  - private, no-store
      security:
        - appId: []
components:
  schemas:
    Venue:
      type: string
      enum:
        - kalshi
        - polymarket
        - limitless
        - predict
        - pred
        - tiprun
        - myriad
        - hyperliquid
        - novig
        - prophetx
        - betdex
    CatalogChange:
      description: >-
        One catalog entity's current state. Apply when (version, changedAt) is
        newer than what you hold for (entity, id).
      type: object
      required:
        - entity
        - id
        - op
        - version
        - changedAt
        - venue
      properties:
        entity:
          type: string
          enum:
            - event
            - market
        id:
          type: string
        op:
          description: >-
            `created` when the entity was created after the request's `since`
            (or the live window); `deleted` carries no snapshot.
          type: string
          enum:
            - created
            - updated
            - deleted
        version:
          description: >-
            Structural version of the entity; increases on every structural
            write.
          type: number
        changedAt:
          format: date-time
          description: When the latest structural change touching this entity was recorded.
          type: string
        venue:
          description: Null only on deletes.
          type: string
          nullable: true
        event:
          $ref: '#/components/schemas/CatalogEventSnapshot'
        market:
          $ref: '#/components/schemas/CatalogMarketSnapshot'
    ErrorMessage:
      type: object
      required:
        - message
      properties:
        message:
          type: string
    RateLimitError:
      type: object
      required:
        - message
      properties:
        message:
          type: string
        statusCode:
          type: number
          enum:
            - 429
        code:
          type: string
          enum:
            - rate_limited
        retryAfter:
          minimum: 1
          description: Retry delay in seconds.
          type: integer
    CatalogEventSnapshot:
      type: object
      required:
        - id
        - venue
        - externalIdentifier
        - title
        - slug
        - status
        - startDate
        - endDate
        - createdAt
        - categories
        - matched
        - clusterAnchorId
        - clusterVenues
      properties:
        id:
          type: string
        venue:
          type: string
        externalIdentifier:
          type: string
        title:
          type: string
        slug:
          type: string
          nullable: true
        status:
          type: string
        startDate:
          format: date-time
          type: string
        endDate:
          format: date-time
          type: string
          nullable: true
        createdAt:
          format: date-time
          type: string
        categories:
          type: array
          items:
            type: object
            required:
              - id
              - name
            properties:
              id:
                type: string
              name:
                type: string
        matched:
          description: Matched or verified to at least one other venue.
          type: boolean
        clusterAnchorId:
          description: >-
            The matched cluster's anchor id — the row list endpoints fold
            members into. Equals `id` for the anchor, null when unmatched.
            Anchors can change; key storage on `id`.
          type: string
          nullable: true
        clusterVenues:
          description: >-
            Venues in the matched cluster, the anchor's venue first; just this
            venue when unmatched.
          type: array
          items:
            type: string
    CatalogMarketSnapshot:
      type: object
      required:
        - id
        - venueEventId
        - venue
        - externalIdentifier
        - question
        - shortTitle
        - status
        - startDate
        - endDate
        - createdAt
        - outcomes
        - categories
        - matched
        - clusterAnchorId
        - clusterVenues
      properties:
        id:
          type: string
        venueEventId:
          type: string
        venue:
          type: string
        externalIdentifier:
          type: string
        question:
          type: string
        shortTitle:
          type: string
          nullable: true
        status:
          type: string
        startDate:
          format: date-time
          type: string
        endDate:
          format: date-time
          type: string
          nullable: true
        createdAt:
          format: date-time
          type: string
        outcomes:
          type: array
          items:
            type: object
            required:
              - id
              - label
              - title
            properties:
              id:
                description: >-
                  venueMarketOutcomeId — subscribe to `orderbook`/`trades` with
                  it.
                type: string
              label:
                type: string
              title:
                type: string
                nullable: true
        categories:
          description: The parent event's categories.
          type: array
          items:
            type: object
            required:
              - id
              - name
            properties:
              id:
                type: string
              name:
                type: string
        matched:
          description: Matched or verified to at least one other venue.
          type: boolean
        clusterAnchorId:
          description: >-
            The matched cluster's anchor id — the row list endpoints fold
            members into. Equals `id` for the anchor, null when unmatched.
            Anchors can change; key storage on `id`.
          type: string
          nullable: true
        clusterVenues:
          description: >-
            Venues in the matched cluster, the anchor's venue first; just this
            venue when unmatched.
          type: array
          items:
            type: string
  securitySchemes:
    appId:
      type: apiKey
      in: header
      name: x-app-id
      description: >-
        Your application ID. Required on app-tier and user-tier routes. Omitted
        on routes that authenticate with x-app-api-key only.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.