---
title: "Read active eligibility publication changes"
method: GET
path: "/v1/eligibility/changes"
tags: ["Data & Analytics"]
---

# Read active eligibility publication changes

`GET /v1/eligibility/changes`

## Request

- Base URL: `https://api.rateapi.dev`
- URL: `https://api.rateapi.dev/v1/eligibility/changes`
- Auth: API key in header `X-API-Key`

A bounded, cursor-paginated active-publication incremental feed for cache invalidation. Each row names the immutable publication id, ruleset hash, activation time, institution, prior publication when present, and created/confirmed/retained rule counts. This is not a historical audit trail: publications superseded between polls are outside its scope. It does not expose person facts or imply a change in any person's eligibility.

**Authentication required**: Pass your API key in the `X-API-Key` header.

## Query parameters

- `since` string, date-time, required
- `cursor` string
- `limit` integer

## Response `200`

Ordered active-publication changes after the requested boundary.

- object
  - `since` string, date-time, required: Echo of the exclusive activation-time boundary used for this traversal.
  - `changes` object[], required: Active publication replacements ordered by activation time and immutable publication id.
  - `returned` integer, required: Number of change rows in this response page.
  - `has_more` boolean, required: Whether another page exists after the final returned change.
  - `next_cursor` string, nullable: Opaque cursor for the next page, or null when this page is complete.
  - `ordering` unknown[], required: Stable tuple ordering used by cursor pagination.
    - unknown
  - `semantics` string, required: Active-publication replacement semantics; the feed is not a historical person verdict.
  - `disclosure` string, required: Required explanation of the feed's scope and safe use.

## Other responses

- `400`: The request was malformed — a missing required field, an unparseable body, or a parameter outside its allowed range. The `error` field names what was wrong; retrying the identical request will fail identically.
- `401`: No API key, or a key that is unknown or disabled. Send it in the `X-API-Key` header. Free keys are issued instantly by POST /keys with an email address. The response carries `WWW-Authenticate` pointing at this host's protected-resource metadata, and the `RateLimit-*` headers describing the Free-tier budget a key issued now would carry (scope `anonymous`) — a rejected request spends none of it, so `Remaining` equals `Limit`.
- `402`: The key is valid, but RateAPI Routes is available only on Enterprise. The response includes `required_plan`, `upgrade_url`, and a `Link` header with `rel="upgrade"`; the rejected request does not consume quota.
- `429`: Quota exhausted for the current window. `Retry-After` gives the seconds to wait; `upgradeInfo` explains how to lift the cap. Retrying before the reset will fail again and still counts as a request.

---

[API](https://skmtc.dev/rateapi/apis/rate-api.md) · [All operations](https://skmtc.dev/rateapi/apis/rate-api/llms.txt) · [OpenAPI document](https://skmtc.dev/rateapi/apis/rate-api/revisions/06a6db76995f?raw)
