curl --request GET --fail-with-body --max-time 30 \
"${AMLOK_API_BASE_URL}/v1/changes?limit=100&cursor=changes_after_checkpoint_example&resource_types=bank_transaction%2Clien" \
--header "Authorization: Bearer ${AMLOK_API_KEY}" \
--header "Accept: application/json"import os
import requests
base_url = os.environ["AMLOK_API_BASE_URL"].rstrip("/")
headers = {'Accept': 'application/json'}
headers["Authorization"] = "Bearer " + os.environ["AMLOK_API_KEY"]
response = requests.request(
"GET", base_url + "/v1/changes?limit=100&cursor=changes_after_checkpoint_example&resource_types=bank_transaction%2Clien",
headers=headers, timeout=30, allow_redirects=False,
)
response.raise_for_status()
print(response.json())
const baseUrl = process.env.AMLOK_API_BASE_URL;
const apiKey = process.env.AMLOK_API_KEY;
if (!baseUrl || !apiKey) throw new Error("Configure AMLOK_API_BASE_URL and AMLOK_API_KEY");
const headers = {
"Accept": "application/json"
};
headers.Authorization = `Bearer ${apiKey}`;
const response = await fetch(baseUrl.replace(/\/$/, "") + "/v1/changes?limit=100&cursor=changes_after_checkpoint_example&resource_types=bank_transaction%2Clien", {
method: "GET", headers,
redirect: "error", signal: AbortSignal.timeout(30000),
});
if (!response.ok) throw new Error(`AMLOK returned HTTP ${response.status}`);
console.log(await response.json());{
"data": [
{
"resource_type": "bank_transaction",
"resource_id": "btx_example",
"resource_version": 2,
"action": "updated",
"changed_at": "2026-10-23T14:00:00Z",
"sequence": 42
}
],
"page": {
"next_cursor": null,
"has_more": false,
"limit": 100
},
"meta": {
"request_id": "req_example",
"schema_version": "1.4.2",
"generated_at": "2026-10-23T14:00:00Z",
"data_status": "complete"
},
"resume_cursor": "changes_after_sequence_42",
"cursor_expires_at": "2026-11-01T14:00:00Z"
}Read change feed
Read created, updated and deleted normalized-resource changes in ascending sequence order. A cursor from a synchronization checkpoint is required on the first request; thereafter use the returned resume_cursor. Never reuse a collection cursor. Persist the returned resume_cursor only after durably applying every event in the page, deduplicating by resource type, ID and version. A terminal or empty page still returns a resume_cursor; poll it later to receive new changes. Each successful poll returns cursor_expires_at. A cursor expired beyond that time returns 410 cursor_expired and requires a new checkpoint plus a fresh bootstrap. Filters and workspace binding cannot change mid-stream. Deleted resources emit tombstones. Billing resources use billing snapshots and billing events, not this normalized-data feed.
curl --request GET --fail-with-body --max-time 30 \
"${AMLOK_API_BASE_URL}/v1/changes?limit=100&cursor=changes_after_checkpoint_example&resource_types=bank_transaction%2Clien" \
--header "Authorization: Bearer ${AMLOK_API_KEY}" \
--header "Accept: application/json"import os
import requests
base_url = os.environ["AMLOK_API_BASE_URL"].rstrip("/")
headers = {'Accept': 'application/json'}
headers["Authorization"] = "Bearer " + os.environ["AMLOK_API_KEY"]
response = requests.request(
"GET", base_url + "/v1/changes?limit=100&cursor=changes_after_checkpoint_example&resource_types=bank_transaction%2Clien",
headers=headers, timeout=30, allow_redirects=False,
)
response.raise_for_status()
print(response.json())
const baseUrl = process.env.AMLOK_API_BASE_URL;
const apiKey = process.env.AMLOK_API_KEY;
if (!baseUrl || !apiKey) throw new Error("Configure AMLOK_API_BASE_URL and AMLOK_API_KEY");
const headers = {
"Accept": "application/json"
};
headers.Authorization = `Bearer ${apiKey}`;
const response = await fetch(baseUrl.replace(/\/$/, "") + "/v1/changes?limit=100&cursor=changes_after_checkpoint_example&resource_types=bank_transaction%2Clien", {
method: "GET", headers,
redirect: "error", signal: AbortSignal.timeout(30000),
});
if (!response.ok) throw new Error(`AMLOK returned HTTP ${response.status}`);
console.log(await response.json());{
"data": [
{
"resource_type": "bank_transaction",
"resource_id": "btx_example",
"resource_version": 2,
"action": "updated",
"changed_at": "2026-10-23T14:00:00Z",
"sequence": 42
}
],
"page": {
"next_cursor": null,
"has_more": false,
"limit": 100
},
"meta": {
"request_id": "req_example",
"schema_version": "1.4.2",
"generated_at": "2026-10-23T14:00:00Z",
"data_status": "complete"
},
"resume_cursor": "changes_after_sequence_42",
"cursor_expires_at": "2026-11-01T14:00:00Z"
}platform:read
Read created, updated and deleted normalized-resource changes in ascending sequence order. A cursor from a synchronization checkpoint is required on the first request; thereafter use the returned resume_cursor. Never reuse a collection cursor. Persist the returned resume_cursor only after durably applying every event in the page, deduplicating by resource type, ID and version. A terminal or empty page still returns a resume_cursor; poll it later to receive new changes. Each successful poll returns cursor_expires_at. A cursor expired beyond that time returns 410 cursor_expired and requires a new checkpoint plus a fresh bootstrap. Filters and workspace binding cannot change mid-stream. Deleted resources emit tombstones. Billing resources use billing snapshots and billing events, not this normalized-data feed.
Product scope · Processing lifecycle · ErrorsAuthorizations
Server-to-server API key bound to exactly one workspace, institution tenant and environment. No caller-supplied workspace override is accepted. Do not use in public browser code.
Headers
Optional caller correlation ID; the response includes AMLOK request_id.
Query Parameters
Page size. Default 100, maximum 200.
1 <= x <= 200Opaque AMLOK cursor. Preserve the original filters.
Optional comma-separated types. When omitted, inherit the checkpoint types; if supplied, must match them exactly.
Response
Read authorized normalized resource changes.
Ordered authorized normalized changes.
Show child attributes
Show child attributes
Tenant-scoped continuation information.
Show child attributes
Show child attributes
Response context and completeness.
Show child attributes
Show child attributes
Durable position after every change in this response; returned even for an empty page. Persist atomically with processed changes.
1