deletedRecords
Retrieves the identifiers of records that have been deleted since the supplied cursor, so a downstream cache can evict them. Answers "which ids of these types went away", not "what did they contain" — the records themselves are gone.
Entity types the caller does not have permission to read are dropped from the request rather than rejected, so a partially-permitted caller still gets the types it can see.
deletedRecords(
entityTypes: [DeletedRecordType!]!
eventIds: [ID!]! =
limit: PaginationLimit! = 1000
sinceCursor: String
): DeletedRecordResult!
Arguments
deletedRecords.entityTypes ● [DeletedRecordType!]! non-null enum
deletedRecords.eventIds ● [ID!]! non-null scalar
Restricts the scan to these events. Required for every type except EVENT, which has no
parent event to scope by.
deletedRecords.limit ● PaginationLimit! non-null scalar
Applied per entity type, so a call for N types can return up to N × limit records.
deletedRecords.sinceCursor ● String scalar
An opaque cursor — callers must never parse or construct it, only store the currentCursor
of the previous successful call and hand it back. Deliberately not named sinceTimestamp:
the opacity is what lets the resolver change where deletes are read from (a soft-delete
column scan today, tombstone rows later, or a split across both) with no SDL change and no
coordinated consumer release.
Omitting it means the caller has no cursor, which returns fullReloadRequired: true and
empty records. This fails closed on purpose: the alternative, scanning back to the
retention floor, hides a 30-day read behind a null.
A returned cursor is only meaningful for a subsequent call carrying the same entityTypes
and the same eventIds. It holds per-type resume state, so store one cursor per set of
entity types; and its watermark attests only to the events the call that produced it was
scoped to, so adding an event to that set leaves every delete for the new event from before
the widening sitting behind the watermark, never to be offered. Widening eventIds
therefore needs a full reload for the events added. Optional.
Type
DeletedRecordResult object
One cycle's worth of deletions, plus the cursor state the caller needs to run the next cycle. A transport envelope rather than a stored entity, so it carries no id and no audit fields.