Skip to content
TDACorpIDENTITYSign in

Subprocessors

Every third party TDACorp Identity sends data to or stores data with in order to run, and every outside service the code can call. The register is read off the configuration and code that actually calls each one, not off a vendor contract list kept somewhere else.

Last reviewed October 5, 2026
On this page

Status

Last reviewed 5 October 2026. TDACorp Identity is pre-production. Each row below was re-checked against the code and deployment documents on that date. No outside party has audited this register.

How to read this register

Each outside service the platform can reach is placed in exactly one class.

ClassMeaningListed in the register below
SubprocessorA vendor that stores or handles personal data on the platform's behalf in order to run itYes
Optional subprocessorA vendor that handles data only when the operator turns a setting onYes, marked optional
Written but not yet runningA vendor named in a workflow or checklist that has not yet been runYes, marked as such
User-initiated federationA sign-in provider the person chooses to use, which receives their authentication requestSeparate table
Sent no personal dataAn outside call that carries no information identifying a personSeparate table
Not usedA service that is not called by anything deployedSeparate table

Subprocessor register

NamePurposeData sent or storedLocation as documentedSinceLink
VercelHosting and application infrastructure. Runs the Next.js web app and the identityd function, the scheduled job, and DNS for tdacorp.inEvery request to the platform passes through it. Runtime logs hold one JSON line per request. Environment secrets are held as sensitive variablesThe platform's configuration sets no function region, so the host's default applies. The Vercel project settings report the function region as iad1 (US East, N. Virginia), with no failover, read on 2026-10-10Not documentedvercel.com
NeonPrimary database (Postgres 18)Every persistent record the platform keeps: accounts, credentials (as hashes or sealed), sessions, profile pictures, the audit log, queued emails (sealed), and personal-data exports while they existNeon has no Indian region. The project is in AWS US East 1 (N. Virginia), read from the Neon console project list on 2026-10-10. The owner waived India placement for pre-production on 2026-09-30Waiver dated 2026-09-30. Provisioning date not documentedneon.com
ResendTransactional and security email, through its REST API at api.resend.comThe recipient address and the text of each message: verification and sign-in links and codes, recovery messages, and the security alerts described on the security practices page. The send is made from the address in the [email].from setting of the configuration the deployment runsNot declared by this platform's configurationNot documentedresend.com
Grafana Cloud (optional)Receives metrics, traces and the request log over OTLP/HTTP, only when OTEL_EXPORTER_OTLP_ENDPOINT is setRequest log lines: route pattern, method, status, duration, tenant id, client id, an HMAC of the caller address, error class, outcome, request id, trace id and deploy id. Never raw addresses, emails, tokens or secrets. Every attribute passes an allow-listThe documented example endpoint host contains ap-south-1. That is a hostname, not a statement of where data is processedThe deployment plan states no collector is configured. Nothing has been shipped to a real collectorgrafana.com

Written but not yet running

These are named in repository workflows and the owner's setup checklist. The deployment documents state they are written and have not yet been run. They are listed so the register is complete the day they start.

NamePurposeData sent or storedLocation as documentedLink
GitHub (Actions and repository hosting)Runs continuous integration, the migrate-then-deploy pipeline and the nightly backup and monthly restore-drill workflowsThe deploy pipeline holds the owner database URL as an Actions secret. The backup workflow reads the whole database to dump it, so personal data passes through the runner while the dump is made and before it is encryptedNot declaredgithub.com
Cloudflare R2Private object storage for age-encrypted nightly dumpsAn encrypted database dump. The dump holds sealed keys and data-key-wrapped data, never the key-encryption key. The private decryption key is kept offlineNot declared. The platform specification calls for backups in a second Indian region. No region is recorded for the bucketcloudflare.com
A healthcheck service and an external pingerDead-man's-switch pings and an optional external trigger for the scheduler. The owner chooses the services. The documentation names cron-job.org or a scheduled GitHub Action as examplesA ping to a secret URL, or a request bearing a bearer secret. No personal data is in eitherNot declaredNot configured in this repository

User-initiated federation

NamePurposeData sentData receivedStatus
Google (OpenID Connect)Sign in or link an account with Google, if the person chooses itThe person's browser is redirected to Google with a state value, nonce and PKCE challenge. The server exchanges the code with GoogleSubject identifier, verified email, display name and other profile claims from Google. When an account is created through the provider, the server also fetches the picture from the URL the provider gives and stores it as the profile pictureBuilt, with the code paths for login, linking and step-up. The trust pages state that sign-in with Google or GitHub is not offered today. An operator must register a provider before it is active
GitHub (OAuth)Sign in or link an account with GitHub, if the person chooses itAs above, with GitHub's authorize and token endpointsUser and email lists from the GitHub APISame as above

When a person chooses one of these, that provider is acting on the person's own instruction and under its own terms. It becomes a subprocessor-like recipient of the authentication request only for the person who made that choice. This register will be updated the day a provider is registered for production.

Outside calls that send no personal data

NamePurposeWhat leaves the systemWhy it is not personal data
Have I Been Pwned range API (api.pwnedpasswords.com)Check a password against a breach corpus when it is registered, set, changed or recovered, and in the background after each successful password sign-inThe first five hexadecimal characters of a SHA-1 hash of the password, with a padded response requestNever the password, never the full hash, nothing that identifies the account. The prefix is never logged.
Registered clients' endpoints (webhooks, back-channel logout, Shared Signals receivers)Deliver events to a product the account holder signed in toEvent payloads to a URL the product registered. Payloads follow the audit rule of identifiers and hashes, never raw emailsThese go to the product's own receivers, not to a TDACorp vendor. The product is responsible for them
Metadata and key documents of a configured federation issuerFetch discovery and keys for Google or GitHubA plain HTTPS fetch of public documentsNo person data is sent

Not used

This table lists services the code does not call. It is verified against source rather than assumed.

ServiceStatusEvidence
Analytics or advertising toolsNot usedNo analytics or third-party script is loaded. The pages are served with a content security policy that allows only this site's own scripts and styles
A cloud key-management serviceNot usedPre-production key management is a software provider. The cloud KMS arm is not implemented
Vercel Blob, UploadThing or any storage vendorNot usedProfile pictures and exports are database rows
Redis or another cache vendorNot usedNo separate cache service is called
Any AWS serviceNot usedNo AWS service is called by anything deployed
Third-party fonts or imagesNot usedThe pages load no third-party scripts, fonts or images
Error-tracking vendorNot usedThe client-error intake, when enabled, stores into the platform database

Data flow by feature

FeatureVercelNeonResendGrafana Cloud (optional)Anyone else
Sign-in with passwordRequest handledCredential hash read, session written, audit eventSign-in alert email if the browser is newRequest log lineHave I Been Pwned: a padded 5-character prefix request when a password is set, and again in the background after each successful sign-in
Sign-in with passkeyRequest handledPublic key read, challenge stored, session writtenAlert if new browserRequest log lineNone
Magic link or email codeRequest handledLink or code stored hashedThe message with the link or codeRequest log lineNone
RegistrationRequest handledAccount and unverified email createdVerification emailRequest log lineHave I Been Pwned when a password is set
Account recoveryRequest handledRecovery request storedRecovery, hold and cancel emailsRequest log lineHave I Been Pwned when a new password is set
Federated sign-in (if registered)Request handledState and identity linkNone unless an alert is dueRequest log lineGoogle or GitHub, chosen by the person
Session and device pagesRequest handledSessions and devices read or revokedAlert emails on device trust changesRequest log lineNone
Personal-data exportRequest handled, file served as a downloadExport built, signed and stored for 7 daysThe export-ready email, and the alert for the export requestRequest log lineNone
Account deletion and erasureRequest handled, then scheduled jobDeactivate, then erase after 30 daysDeactivation noticeRequest log lineNone
Connected apps and OAuth tokensRequest handledConsent, token familiesA notice email to the account owner when a refresh token is reused, and when a back-channel logout or webhook is disabledRequest log lineThe product's own endpoints for logout and webhooks
Admin consoleSeparate hosted appReads and writes via identitydRole-change and access noticesRequest log lineNone
Operations alertsScheduled jobReads recent audit rows and worker stateAlert email to the operator addressAlert counterHealthcheck service, if configured
Backups (written, not run)NoneRead by the dump loginNoneNoneGitHub Actions runner, then Cloudflare R2

What is not shared

DataNot shared with any vendor
PasswordsOnly a salted Argon2id hash is stored. The password itself reaches only the platform. Only a 5-character prefix of its SHA-1 digest goes to the breach corpus
Authenticator secrets, recovery codes, signing keysSealed or hashed in the database. Not sent to any vendor in readable form
Session secrets and tokensStored as digests. Not placed in logs or telemetry
Raw network addresses in telemetryThe request log carries an HMAC of the address, never the address itself
Email addresses in telemetryNot emitted. The telemetry allow-list has no free-text field
Advertising or analytics identifiersNone exist
Biometric dataA passkey's biometric check happens on the person's device
Data sold to or shared with data brokersNone. There is no such feature

Change notification

QuestionAnswer as documented
How is this list kept current?It is read off the configuration and code and re-checked when the trust copy is reviewed. The date at the top is the last review date
What triggers an update?Adding or removing a vendor. The page states that it will change when any listed-as-absent service is added
Is advance notice promised?No. The repository defines no notice period and no mailing list for subprocessor changes
Where is the change visible?On this page, with a new review date
Is there a history of changes?The page's own history is held in the repository's version control. No separate changelog is published

Note

Pending decision by the owner: whether to commit to advance notice, and to which channel, before a subprocessor is added.

How to object

There is no formal objection procedure. If you object to a subprocessor on this list, email security@tdacorp.in with the vendor and your reason. We will read it and reply, but no response time is promised, and the repository defines no process under which a customer can require a vendor change. For a product built on this platform, the arrangement is a conversation with TDACorp. See the data processing addendum.

What this page does not claim

Not claimedDetail
A certified or audited registerNo outside party has audited it
A region for every vendorVercel and Neon are named in the register above. The primary database is not in India during pre-production, by owner waiver. No region is declared for the other vendors
That optional or not-yet-run vendors are liveGrafana Cloud, the backup workflows, Cloudflare R2 and the healthcheck service are marked as optional or not yet run. The deployment plan states no collector is configured
That the federation providers are offered todayThe code exists. The trust pages state that sign-in with Google or GitHub is not offered
Coverage of other TDACorp productsThis list is scoped to the identity platform itself. Other products have their own subprocessors
Staff and mailbox systemsThe register covers systems that process account data. The systems behind the operator mailboxes that receive security@tdacorp.in mail are not documented in this repository
A notice period or an objection rightNeither is defined
Dates a vendor was engagedNot documented, so none is given