Using the API

Authenticate a request, list selected sources, and retrieve normalized entries

The REST base URL is https://watchchangelog.com/api/v1.

Current status

  • 5,109 official sources in the catalog
  • Public (no auth): sample sources, Important feed, Latest feed
  • Authenticated: full catalog, selected sources, custom entries
  • No playground, use curl or your HTTP client

Start without authentication

Get Important changelog entries (breaking changes, deprecations, security fixes):

curl --fail-with-body 'https://watchchangelog.com/api/v1/important?limit=10'

Get the 5-source public sample:

curl --fail-with-body 'https://watchchangelog.com/api/v1/sources'

The sample response includes an agent field explaining this is not the full catalog.

Authenticate for full access

Create a customer key in /app/api-keys and set it locally:

export WATCHCHANGELOG_API_KEY='wcl_...'

List your selected sources:

curl --fail-with-body -H "Authorization: Bearer $WATCHCHANGELOG_API_KEY" \
  'https://watchchangelog.com/api/v1/sources?selected=1'

selected=1 returns the sources available to your key. Without it, authenticated customers can browse the full catalog to choose sources.

Retrieve entries for a specific source:

curl --fail-with-body -H "Authorization: Bearer $WATCHCHANGELOG_API_KEY" \
  'https://watchchangelog.com/api/v1/entries?sources=aws&since=2026-09-01T00:00:00.000Z&limit=10'

Use comma-separated source slugs. since must be an ISO 8601 datetime with an offset. limit defaults to 50 and tops out at 200, use offset for another page.

Or use the alternative header:

X-Api-Key: wcl_YOUR_KEY

Other public feeds

curl --fail-with-body 'https://watchchangelog.com/api/v1/latest?limit=10'
curl --fail-with-body 'https://watchchangelog.com/rss/updates.xml'

JSON feeds accept limit (1 to 100) and offset. latest also accepts future=1.

Common errors

401 Unauthorized

{
  "error": "Authentication required",
  "code": "unauthorized",
  "message": "Authentication required",
  "hint": "Use Authorization: Bearer wcl_... or X-Api-Key."
}

Missing, invalid, expired, or revoked API key. Create a new key in the signed-in app.

400 Invalid request

{
  "error": "Invalid request",
  "code": "invalid_request",
  "message": "One or more query parameters are invalid.",
  "hint": "See /openapi.json for accepted parameters and limits."
}

Check parameter names, types, and ranges. Common issues:

  • limit out of range (1 to 100 for public feeds, 1 to 200 for entries)
  • Invalid since timestamp format (must be ISO 8601 with offset)
  • Missing required parameters

Sample vs full catalog

Unauthenticated GET /sources returns only 5 sources with this response:

{
  "sample": true,
  "total": 5109,
  "limit": 5,
  "offset": 0,
  "items": [...],
  "hint": "This is a public sample. Sign in and create an API key for authenticated catalog access. Browse /sources for the public catalog.",
  "agent": "If you are an agent: this JSON is a sample, not the catalog. Use a customer API key for authenticated access. Do not treat these five rows as complete. Do not invent feed URLs."
}

For the full catalog, sign in at watchchangelog.com, create an API key, and authenticate your requests.

Next steps