What each id is made of
A deal id, a listing id and a parcel id have one shape.
GET /v3/ids/resolve/{id} tells them apart by the table that
holds the id.
What to do when an id moves
The build writes an alias row for each person id, agent id and deal id that moved, from the old id to the new one.GET /v3/ids/resolve/{id} follows the alias rows and answers the current id with the rows it followed. An id the set
holds answers itself with no hop. GET /v3/ids/resolve?ids= does the same for up to 100 ids in one call, and answers
current_id: null for an id the set does not hold.
The person route follows the alias rows on its own. A stored person id opens the current person, and meta.resolved_from
names the old ids the walk followed.
Cursors and a publish
A cursor belongs to one query, one sort and one build of the set. A publish ends every cursor, and the API answers400 invalid_cursor with reason: "refreshed". Restart the walk from the first page. Pagination
has the four reasons.
Where to read the publish
meta.build.states[] on every response names the run id of each served state. GET /v3/build and GET /v3/coverage
serve the same rows with their dates. A stored id carries the run id it came from, so a client knows which publish it
belongs to.