Skip to content
TDACorpIDENTITYSign in

Retention and deletion

How long TDACorp Identity keeps each kind of data, which background job deletes it and how often it runs, what survives erasure, and how to export your data. Every period below was read from the code or configuration that enforces it.

Last reviewed October 5, 2026
On this page

Status

Last reviewed 5 October 2026. TDACorp Identity is pre-production. Periods are quoted from constants and configuration in the repository. Where a period is a default that a setting can change, the table says so. Where a period is not enforced by code, the table says that too.

How deletion runs

Retention is carried out by background workers, not by database timers. Two things decide when a worker runs.

MechanismDetail
Daily scheduled jobOne Vercel cron, 0 4 * * *, calls the internal tick route. On the Hobby plan a cron may fire any time in the hour from 04:00 to 04:59 UTC
Opportunistic ticksAn ordinary request can also trigger a due-tick, at most once every 30 seconds per instance, with a short time budget
External pingerAn optional pinger calling the same route more often. It is chosen by the owner and is not configured in this repository
Due-tick ruleA worker runs when its own interval has elapsed and a tick arrives

Because of this, a job with a short interval is still only as prompt as the next tick, and on the current hosting plan background work can run up to about a day late. Each pass is bounded and idempotent: most deletes are bounded (at most 500 rows per statement and 20 batches per pass), and some, such as session retention, audit compaction and orphan accounts, have their own per-pass caps, so a backlog drains over successive passes.

Workers that delete or expire data

WorkerDefault intervalEnabled in the production configurationWhat it does
housekeeping1 hourYes ([workers.housekeeping] enabled = true)Deletes expired, spent or abandoned short-lived rows. Runs session, token-family and (when flagged) audit retention
deactivation_sweep1 hourYes (the default is on)Erases personal data 30 days after deactivation and revokes the bindings kept for those 30 days
data_export5 minutesYes (the default is on)Builds exports and deletes expired export files
email_drain15 secondsYes (the default is on)Sends queued email and deletes finished queue rows after 7 days
ops_monitor24 hours in productionYesRaises operational alerts. It deletes nothing
audit_anchor24 hoursNo. Off by default, needs a publish targetAnchors the audit chain. Anchors are currently published by an operator command

Retention schedule

Accounts, sessions and credentials

DataRetentionEnforced byNotes
Active account recordsFor as long as the account existsNo timerNo automatic deletion timer applies to an active account's own records
Live sessionEnds after 12 hours idle or 14 days in totalSession lookupThe cookie lives at most as long as the absolute limit. A "keep me signed in" option exists behind a flag that is not enabled in production
Ended session: network addressNulled once the session is older than 90 dayshousekeeping, setting [retention] session_ip_daysDefault 90 days, counted from when the session was created. Administrators can see the address and it is included in your own data export
Ended session: rowDeleted once it ended more than 90 days agohousekeeping, setting [retention] session_delete_daysDefault 90, minimum 31. The database also refuses to delete a session that ended less than 30 days ago or still holds a network address. A session still referenced by a token family or similar record is kept
OAuth refresh tokens and token familiesDeleted once the family ended more than 90 days agohousekeeping, using session_delete_daysThe database enforces a floor of 14 days after the family ended. A live family is never deleted. Rows hold ids and scopes, not names
Relying-party sessionsDeleted once ended, on the same 90-day cutoffhousekeepingLinkage records of ids and timestamps
Device recordsKept while the account exists. The name is cleared at erasureErasureRemoving a device from your account removes it from the list
Credentials: password hash, passkeys, authenticator secret, recovery code hashesWhile the account exists. Deleted at erasureErasureA removed credential is removed when you remove it
Personal access tokensWhile the account exists, or until revoked. Deleted at erasureErasureStored only as hashes
Connected-app consents and membershipsWhile the account existsNoneWithdrawing consent revokes access immediately

Sign-in, registration and recovery records

DataRetentionEnforced byNotes
Login transaction and its cookie10 minutes. The row is deleted an hour after it expireshousekeepingExpiry grace is 3600 seconds
Magic link for sign-inValid for 15 minutes by default. An expired link that was never used is deleted; a used link's row stays until the email address row is deletedhousekeeping
Email verification linkValid for 24 hourshousekeeping
Unverified email addressDeleted 24 hours after the claim was madehousekeeping
Abandoned self-registrationThe unverified account with no credential is removed after 48 hourshousekeepingKept if anything still references it
Primary-email revert linkValid for 24 hoursLink expirySent to the old address when the primary email changes
Recovery linkValid for 15 minutes. The recovery hold lasts 24 hoursLink expiry
Unopened or abandoned recovery requestDeleted once expired. A request that neither completed nor was cancelled within 7 days is deletedhousekeepingA held request is never auto-completed
Completed or cancelled recovery requestDeleted 14 days after the outcomehousekeepingThe outcome stays in the audit log
Recovery device cookie30 daysCookie Max-AgeSee cookies
Passkey challengesDeleted once expiredhousekeepingSingle use and short lived
Authorization codes and pushed authorization requestsDeleted an hour after they expirehousekeeping
Step-up proofs10-minute window by default. Rows deleted an hour after expiryhousekeeping
Replay-protection recordsDeleted an hour after the replay window closeshousekeeping
Rate-limit countersDeleted after 7 days idlehousekeepingAn idle counter has refilled to capacity, so deleting it changes no decision
Sign-in alert records7 days. Deleted when used or expiredSign-in alert deliveryHolds a label, country, network address and method

Email, exports and delivery records

DataRetentionEnforced byNotes
Email queueA finished (sent, suppressed or failed) row is deleted 7 days after it was created. A pending row waits for deliveryemail_drainThe recipient address and body are stored sealed, with a hash of the address for de-duplication
Email send budget countersSend countersNot pruned by the paths read for this pageCounts only, no addresses
Personal-data export fileDownloadable for up to 7 days (604,800 seconds, the default and the maximum), then deleteddata_exportThe export is stored in the primary database as a sealed blob: each file is encrypted with AES-256-GCM under its own random key, which the key provider wraps. The signature is over the plaintext, so a downloaded file still verifies
Export request recordKeptNoneIt holds no personal data of its own, and the audit log names it
Settled outbox and delivery attemptsDelivered rows are deleted 30 days after deliveryhousekeepingKept for operator inspection. Rows for Shared Signals deliveries are kept while a delivery references them
Orphan webhook delivery attemptsDeleted 30 days after creationhousekeeping
Client error reportsOnly stored when the hosted error-report setting is on. It is not set in the production configurationThe error-report writerRows idle for 30 days are deleted when the next report is written, and the table is capped at 2,000 rows

Audit log

DataRetentionEnforced byNotes
Audit eventsDefault 2920 days (8 years). The setting allows 365 to 3650 days, with an internal floor of 2920 days for TDACorp's own organizationDatabase guards plus the audit_retention_prune flagPruning is off, so audit records are currently retained indefinitely
Audit compactionOnly when the prune flag is on, and only rows older than the cutoff and strictly below the newest signed anchorhousekeepingA tombstone and an audit.compacted row record each compaction. At most 10,000 rows per pass. The database enforces a 365-day floor
Audit anchorsNever updatedGrants and a compaction functionNo update is granted. When audit pruning is on (it is off by default), anchors at or below a compaction boundary are deleted after a copy is kept in the compaction record; the newest anchor is always kept

Deactivation and erasure

DataRetentionEnforced byNotes
Deactivated account30 days, then eraseddeactivation_sweepThe clock starts at the latest deactivation audit event. A deactivated account with no dated event is reported and never erased
Bindings and grants of a deactivated accountKept 30 days, then revokeddeactivation_sweep
Erased accountTerminal stateErasureSee below for what survives

Backups and logs

DataRetentionEnforced byNotes
Database history windowSix hours was measured for the earlier platform's projects. The window for this platform's database is recorded as unverified until measuredNeon planNot controlled by this platform's code
Nightly encrypted dumpNot yet running. Retention is a lifecycle rule on the storage bucket, to be set by the owner at 30 to 90 daysOwner configuration, not codeNo number is stated here because none is set
Monthly restore drillRestores the newest dump to a scratch databaseWorkflowNot yet run
Request log (platform host logs)One JSON line per request. The hosting plan retains runtime logs for 1 hourHosting planThe line carries an HMAC of the caller address, never the address
Request log (telemetry vendor)Only if the optional collector is configured. The vendor's own retention appliesVendor settingNo collector is configured in the deployment documents
Heartbeat and worker recordsUpdated in placeNoneHold worker names and times, no personal data
ICT log retention for CERT-InNot addressedNoneThe deployment plan lists this as not covered

What happens at erasure

Deleting an account deactivates it at once. Every session, token and personal access token is revoked and the person cannot sign in again. Thirty days later the sweep erases the account.

DataAt erasure
Profile (display name, locale, time zone)Deleted
Email addressesDeleted
Credentials: password, passkeys, authenticator secret, recovery codes, federated links, personal access tokensDeleted. A pending authenticator enrolment is deleted too
Profile pictureDeleted
Notification preferences and security-event read markersDeleted
Sign-in alert records and session context (label, country, city)Deleted
Stored export filesDeleted, whatever their 7-day expiry
Device recordsThe name is cleared. The row stays so past sessions keep resolving
Break-glass credential recordsRedacted: the label is cleared and the credential is marked revoked
Audit eventsKept. They hold the account identifier, event kinds and times, with hashes and 2-character masks instead of addresses
Linkage-only records: token families, relying-party sessionsKept, as ids, scopes and timestamps, until their own retention deletes them
SessionsThe network address is nulled by the session retention above; the user-agent hash is removed only when the session row itself is deleted, which happens only once it has no remaining references
Invitation recordsThe address an invitation was sent to is kept, because the record cannot be edited after the fact
The account itselfMoves to erased, which is terminal. The subject identifier is retained

Note

Whether to change what survives erasure is an open owner decision. The audit log is designed to reference identifiers and hashes rather than names or email addresses, but every event kind has not been audited for that.

Export your data

ItemDetail
WherePrivacy and data, in your account
RequirementSigned in, with a second-factor sign-in or step-up in the last 30 minutes
FormatA signed JSON document, plus a CSV form
ContentsProfile, emails, credential metadata (kind, status, label, timestamps), sessions, consents, memberships and your own audit events. Event payloads and other people's actions on your account are not included
ExcludedPassword hashes, authenticator secrets, recovery code hashes, passkey public keys, token hashes and session secrets
LimitsEach list is capped, and the file says which lists were cut
AvailabilityYou are emailed when it is ready. You can download it for 7 days, after which it is deleted
If you cannot sign inEmail security@tdacorp.in. No response time is promised

What this page does not claim

Not claimedDetail
Deletion at an exact momentJobs run when a tick arrives. Erasure happens at least 30 days after deactivation, and can run up to about a day late
Total erasureAudit references, linkage records, invitation addresses and some session fields survive, as listed
Deletion from backupsA backup is not edited. No backup retention period is set in code, and the nightly dump workflow has not yet run
Automatic audit pruningIt is off. Audit records are retained indefinitely at present
Strength of export file encryption beyond what the key provider givesExport files are sealed per file, but the pre-production key provider is a software one, so the database plus its master key could open them
A legal hold or statutory retention processNone is documented
Retention in other systemsVendors keep logs and records under their own terms. See the subprocessor register
That a setting cannot change a periodSeveral periods are defaults controlled by configuration and are quoted as such
That the privacy policy and this page agree on every detailThe privacy policy states that session records survive erasure. The code also contains the session retention above. See the open owner decision on privacy