Reference
Changes
Creates, updates, and soft deletes of the records this API exposes, from the API and from the product.
GET /api/v1/x/changes lists creates, updates, and soft deletes of Company, Person, Deal, Lead, Investor, Fund, FundCommitment, and PortfolioCompany. A write in the product and a write through /api/v1/x both appear. The token needs records:read.
Each item has id, entityType, recordId, change, source, and createdAt. change is created, updated, or deleted. source is api when the write came through /api/v1/x, and app when it came from the product. Rows written before this feed existed are not listed. A soft delete is deleted. An edit of a record that is already deleted stays updated.
{ "items": [ { "id": "6f1c2a40-1b7e-4d7a-9c3e-2a8b0d5e1f44", "entityType": "Company", "recordId": "00000000-0000-4000-8000-000000000010", "change": "updated", "source": "app", "createdAt": "2026-10-12T12:00:00+00:00" } ], "nextStartingAfter": null}Send starting_after=start for the first page, then pass nextStartingAfter. limit defaults to 50 and must be from 1 to 100. An unknown change id is 404 not_found.
When nextStartingAfter is null, that page is the end. Keep the id of the last item and call again with starting_after set to that id. Rows stored after it are the next page. If the first page is empty, poll starting_after=start again. Rows are kept. This feed does not expire them.
To copy the firm and then follow along, walk this list to the end and remember the last id. Read the records. Then poll after that id. A write that lands during the read shows up after the id, so apply those items onto the copy.
The token needs records:read only. The list is not filtered by finance:read or portfolio:read. An item is the id and the kind of write, not the record. Opening the record still needs that route’s scope. There is no route on this API that deletes a company, a person, or a deal. A soft delete in the product is still a deleted item. Queries are not in this list. A failed call is not in it. Records this API does not expose are not in it. An inbound webhook stays on /api/v1/workflow/hooks/{webhookKey}.