> This page is optimized for agents. Use the linked Markdown pages and llms.txt indexes for related API content.

# Catalog changes since a release

> Catalog releases published after `after`, oldest first, each with the club ids it added, updated or removed per club resource. Lists only the club resources the key can access; requires any club resource entitlement. Store the Golfapi-Catalog-Release header from any catalog response, call this with it, and refetch the listed ids. A release the change history does not cover returns 400 naming the oldest release it can answer from; rescan the catalog then.

- Product: Changes
- Section: changes
- Snapshot: Current
- Method: `GET`
- Path: `/changes`
- Availability: generally-available

## Query parameters

### `after`

Type: `string`  
Required: yes  

A Golfapi-Catalog-Release value you stored.

### `limit`

Type: `number`  
Required: no  
Default: `10`  

Releases per page.

### `cursor`

Type: `string`  
Required: no  

Opaque pagination token from page.next. Send it unchanged on the same resource, with the same filters, served version and key access. Page size may change between requests. On a cursor 400, restart the scan.

## Execute with curl

```bash
curl -H "Authorization: Bearer $GOLFDEV_API_KEY" "https://api.golfapi.dev/changes"
```

## Execute with JavaScript

```javascript
const response = await fetch(`https://api.golfapi.dev/changes`, {
  headers: { Authorization: `Bearer ${process.env.GOLFDEV_API_KEY}` },
});
const body = await response.json();
```

## Execute with Python

```python
import os
import requests

response = requests.get(
    f"https://api.golfapi.dev/changes",
    headers={"Authorization": f"Bearer {os.environ['GOLFDEV_API_KEY']}"},
    timeout=10,
)
response.raise_for_status()
body = response.json()
```

## Responses

### Response `200`

Category: success  

Releases after the given one.

#### `application/json`

##### Generated example

```json
{
  "after": "after",
  "data": [
    {
      "release": "release",
      "published_at": "published_at",
      "changes": {}
    }
  ],
  "page": {
    "limit": 0,
    "has_more": true,
    "next": "next"
  }
}
```

##### Schema

###### ChangeList

Type: `ChangeList`  

###### `after`

Type: `string`  
Required: yes  

###### `data`

Type: `CatalogRelease[]`  
Required: yes  

###### CatalogRelease

Type: `CatalogRelease`  

###### `release`

Type: `string`  
Required: yes  

###### `published_at`

Type: `string`  
Format: `date-time`  
Required: yes  

###### `changes`

Type: `object`  
Required: yes  

Keyed by club resource. A resource with no change is absent.

###### `page`

Type: `object`  
Required: yes  

###### `limit`

Type: `number`  
Required: yes  

###### `has_more`

Type: `boolean`  
Required: yes  

###### `next`

Type: `string`  
Required: no  

Pass as cursor, with the same after, for the next page.

### Response `400`

Category: client-error  

Invalid recognized input or projected field.

#### `application/json`

##### Generated example

```json
{
  "error": {
    "type": "invalid_request",
    "message": "message",
    "status": 400,
    "request_id": "request_id",
    "param": "param"
  }
}
```

##### Schema

###### Error

Type: `Error`  

###### `error`

Type: `object`  
Required: yes  

###### `type`

Type: `string`  
Required: yes  
Allowed values: `invalid_request`, `invalid_auth`, `forbidden`, `not_found`, `rate_limited`, `method_not_allowed`, `server_error`, `service_unavailable`, `account_inactive`, `quota_exceeded`  

###### `message`

Type: `string`  
Required: yes  

###### `status`

Type: `number`  
Required: yes  
Allowed values: `400`, `401`, `403`, `404`, `405`, `429`, `500`, `503`  

###### `request_id`

Type: `string`  
Required: yes  

###### `param`

Type: `string`  
Required: no  

### Response `401`

Category: client-error  

Missing, malformed, unknown, or revoked key.

#### `application/json`

##### Generated example

```json
{
  "error": {
    "type": "invalid_request",
    "message": "message",
    "status": 400,
    "request_id": "request_id",
    "param": "param"
  }
}
```

##### Schema

###### Error

Type: `Error`  

###### `error`

Type: `object`  
Required: yes  

###### `type`

Type: `string`  
Required: yes  
Allowed values: `invalid_request`, `invalid_auth`, `forbidden`, `not_found`, `rate_limited`, `method_not_allowed`, `server_error`, `service_unavailable`, `account_inactive`, `quota_exceeded`  

###### `message`

Type: `string`  
Required: yes  

###### `status`

Type: `number`  
Required: yes  
Allowed values: `400`, `401`, `403`, `404`, `405`, `429`, `500`, `503`  

###### `request_id`

Type: `string`  
Required: yes  

###### `param`

Type: `string`  
Required: no  

### Response `403`

Category: client-error  

Resource/capability not granted.

#### `application/json`

##### Generated example

```json
{
  "error": {
    "type": "invalid_request",
    "message": "message",
    "status": 400,
    "request_id": "request_id",
    "param": "param"
  }
}
```

##### Schema

###### Error

Type: `Error`  

###### `error`

Type: `object`  
Required: yes  

###### `type`

Type: `string`  
Required: yes  
Allowed values: `invalid_request`, `invalid_auth`, `forbidden`, `not_found`, `rate_limited`, `method_not_allowed`, `server_error`, `service_unavailable`, `account_inactive`, `quota_exceeded`  

###### `message`

Type: `string`  
Required: yes  

###### `status`

Type: `number`  
Required: yes  
Allowed values: `400`, `401`, `403`, `404`, `405`, `429`, `500`, `503`  

###### `request_id`

Type: `string`  
Required: yes  

###### `param`

Type: `string`  
Required: no  

### Response `405`

Category: client-error  

A routed path reached by a method other than GET or OPTIONS.

#### `application/json`

##### Generated example

```json
{
  "error": {
    "type": "invalid_request",
    "message": "message",
    "status": 400,
    "request_id": "request_id",
    "param": "param"
  }
}
```

##### Schema

###### Error

Type: `Error`  

###### `error`

Type: `object`  
Required: yes  

###### `type`

Type: `string`  
Required: yes  
Allowed values: `invalid_request`, `invalid_auth`, `forbidden`, `not_found`, `rate_limited`, `method_not_allowed`, `server_error`, `service_unavailable`, `account_inactive`, `quota_exceeded`  

###### `message`

Type: `string`  
Required: yes  

###### `status`

Type: `number`  
Required: yes  
Allowed values: `400`, `401`, `403`, `404`, `405`, `429`, `500`, `503`  

###### `request_id`

Type: `string`  
Required: yes  

###### `param`

Type: `string`  
Required: no  

### Response `429`

Category: client-error  

Rate limit reached. 60 requests per 60-second wall-clock window by default; RateLimit-Limit carries this key's actual cap. Honor Retry-After, which equals RateLimit-Reset.

#### `application/json`

##### Generated example

```json
{
  "error": {
    "type": "invalid_request",
    "message": "message",
    "status": 400,
    "request_id": "request_id",
    "param": "param"
  }
}
```

##### Schema

###### Error

Type: `Error`  

###### `error`

Type: `object`  
Required: yes  

###### `type`

Type: `string`  
Required: yes  
Allowed values: `invalid_request`, `invalid_auth`, `forbidden`, `not_found`, `rate_limited`, `method_not_allowed`, `server_error`, `service_unavailable`, `account_inactive`, `quota_exceeded`  

###### `message`

Type: `string`  
Required: yes  

###### `status`

Type: `number`  
Required: yes  
Allowed values: `400`, `401`, `403`, `404`, `405`, `429`, `500`, `503`  

###### `request_id`

Type: `string`  
Required: yes  

###### `param`

Type: `string`  
Required: no  

### Response `500`

Category: server-error  

Server fault.

#### `application/json`

##### Generated example

```json
{
  "error": {
    "type": "invalid_request",
    "message": "message",
    "status": 400,
    "request_id": "request_id",
    "param": "param"
  }
}
```

##### Schema

###### Error

Type: `Error`  

###### `error`

Type: `object`  
Required: yes  

###### `type`

Type: `string`  
Required: yes  
Allowed values: `invalid_request`, `invalid_auth`, `forbidden`, `not_found`, `rate_limited`, `method_not_allowed`, `server_error`, `service_unavailable`, `account_inactive`, `quota_exceeded`  

###### `message`

Type: `string`  
Required: yes  

###### `status`

Type: `number`  
Required: yes  
Allowed values: `400`, `401`, `403`, `404`, `405`, `429`, `500`, `503`  

###### `request_id`

Type: `string`  
Required: yes  

###### `param`

Type: `string`  
Required: no  

### Response `503`

Category: server-error  

Required representation or schema unavailable; honor Retry-After.

#### `application/json`

##### Generated example

```json
{
  "error": {
    "type": "invalid_request",
    "message": "message",
    "status": 400,
    "request_id": "request_id",
    "param": "param"
  }
}
```

##### Schema

###### Error

Type: `Error`  

###### `error`

Type: `object`  
Required: yes  

###### `type`

Type: `string`  
Required: yes  
Allowed values: `invalid_request`, `invalid_auth`, `forbidden`, `not_found`, `rate_limited`, `method_not_allowed`, `server_error`, `service_unavailable`, `account_inactive`, `quota_exceeded`  

###### `message`

Type: `string`  
Required: yes  

###### `status`

Type: `number`  
Required: yes  
Allowed values: `400`, `401`, `403`, `404`, `405`, `429`, `500`, `503`  

###### `request_id`

Type: `string`  
Required: yes  

###### `param`

Type: `string`  
Required: no  

## Related representations

- [Human documentation](/api/changes/methods/list/)
- [curl Markdown](/api/changes/curl/methods/list.md)
- [JavaScript Markdown](/api/changes/javascript/methods/list.md)
- [Python Markdown](/api/changes/python/methods/list.md)
- [product llms.txt](/api/changes/llms.txt)
