# Replace example resource IDs and ownerId with values from your workspace.
: "${POWERDIALER_API_KEY:?Set POWERDIALER_API_KEY to your scoped API key}"
curl --request GET \
--url 'https://api.migration.powerdialer.ai/api/public/v2/changes?limit=50' \
--header "Authorization: Bearer $POWERDIALER_API_KEY"{
"data": [
{
"sequence": "42",
"id": "00000000-0000-4000-8000-000000000002",
"orgId": "org_example",
"ownerId": "user_example",
"type": "call.completed",
"resourceType": "calls",
"resourceId": "call_example_789",
"data": {
"id": "call_example_789"
},
"createdAt": "2026-10-08T12:00:00.000Z"
}
],
"nextCursor": "42",
"hasMore": false
}{
"error": {
"code": "invalid_api_key",
"message": "API key is invalid, expired or revoked",
"requestId": "00000000-0000-4000-8000-000000000004"
}
}Read resource changes
Recover missed notifications or keep a local resource inventory current. Requires changes:read plus each resource’s read scope: contacts:read, lists:read or calls:read. Events remain limited to the key’s workspace and permitted owners. They contain references and deletion/access-revocation notices, not complete resource snapshots.
Start with after=0, then persist each returned nextCursor only after processing or durably queuing its page. Publication cursors are decimal strings; never convert them to JavaScript numbers. Late-committing changes receive later cursors. hasMore:false means no further currently published visible events; continue polling because more can appear. Empty pages retain the previous cursor.
400 invalid_request requires a valid decimal cursor and page size. An empty feed may reflect missing resource scopes. Capture gaps before the first key or while no active key exists require full resource enumeration; they cannot be replayed. No idempotency key is needed for this read.
See change-feed recovery.
# Replace example resource IDs and ownerId with values from your workspace.
: "${POWERDIALER_API_KEY:?Set POWERDIALER_API_KEY to your scoped API key}"
curl --request GET \
--url 'https://api.migration.powerdialer.ai/api/public/v2/changes?limit=50' \
--header "Authorization: Bearer $POWERDIALER_API_KEY"{
"data": [
{
"sequence": "42",
"id": "00000000-0000-4000-8000-000000000002",
"orgId": "org_example",
"ownerId": "user_example",
"type": "call.completed",
"resourceType": "calls",
"resourceId": "call_example_789",
"data": {
"id": "call_example_789"
},
"createdAt": "2026-10-08T12:00:00.000Z"
}
],
"nextCursor": "42",
"hasMore": false
}{
"error": {
"code": "invalid_api_key",
"message": "API key is invalid, expired or revoked",
"requestId": "00000000-0000-4000-8000-000000000004"
}
}Authorizations
Issued in Developers. Workspace/owner/scopes come from credential, never acting-user headers. API keys cannot manage API credentials.
Query Parameters
Last durably processed publication cursor as a decimal string. Use 0 to start; pass nextCursor unchanged on subsequent reads. Never convert this cursor to a JavaScript number.
^[0-9]{1,18}$Maximum items to return in one page, from 1 to 200. Defaults to 50. Smaller pages reduce response size; this is not a total-result limit.
1 <= x <= 200Response
Published visible changes, a string cursor and whether another currently published page exists.
Visible events in publication order. Requires changes:read and the corresponding resource read permission.
Show child attributes
Show child attributes
Save this string after processing the page and send it as after on the next request. An empty page preserves your input cursor.
More currently published visible events exist. False does not exclude pending events that publish later; continue periodic polling.