sub) change because they are team-scoped. Users who chose “Hide My Email” also receive new private relay email addresses under the new team. Without migrating these identifiers in Privy, affected users will lose access to their existing accounts.
What changes during an Apple team transfer
| What changes | Impact on Privy |
|---|---|
Every user gets a new team-scoped sub (subject identifier) | Privy matches users by subject — logins will fail if subjects aren’t updated |
”Hide My Email” users get a new @privaterelay.appleid.com address | Email-based fallback matching fails, causing duplicate accounts |
| Both teams’ credentials remain valid during the 60-day window | No immediate login disruption, but credentials must be updated before the window closes |
Before the transfer (Team A)
Step 1: Export your Apple users from Privy
Use the Privy API to fetch all users for your app, then filter for users withapple_oauth linked accounts. For each matching user, extract their Privy ID, Apple subject, and email.
For each Apple OAuth account, you will need:
- Privy ID (
privy_id) - Apple subject (the current
substored in Privy) - Email (the email currently stored for the Apple OAuth account)
sub in step 3 to generate transfer identifiers via Apple’s API.
Step 2: Disable Apple login (strongly recommended)
Temporarily remove Apple as a login method in the Privy dashboard configuration.There is a race condition between when the app transfer completes (Apple starts issuing new
sub
values) and when Privy’s subject migration is run. If a user signs in during this window, their
new sub won’t match any stored subject, and if they used “Hide My Email,” their new relay email
won’t match either so we don’t do any automatic account merging. This results in a duplicate
account being created.- Your users have wallets, balances, or other critical state tied to their accounts
- A significant portion of your users use “Hide My Email” (private relay)
Step 3: Generate transfer identifiers
Using Team A’s credentials, generate atransfer_sub for each user. Follow Apple’s guide: Transferring your apps and users to another team.
Obtain an access token for Team A:
transfer_sub alongside each user’s privy_id and old sub.
Step 4: Initiate the app transfer
Transfer the app in App Store Connect. Once Team B accepts, Apple begins issuing Team B-scoped identifiers.After the transfer (Team B)
Step 5: Exchange transfer identifiers for new identifiers
Using Team B’s credentials, exchange eachtransfer_sub for the new team-scoped sub and (if applicable) the new private relay email. Follow Apple’s guide: Bringing new apps and users into your team.
Obtain an access token for Team B:
sub— the new Team B-scoped user identifier (present for all users)email— the new private relay email (only present for users who used “Hide My Email”)is_private_email— indicates this is a relay address
sub and email (when present) alongside each user’s privy_id.
Step 6: Build the migration CSV
Prepare a CSV with the following columns:| Column | Required | Description |
|---|---|---|
privy_id | Yes | The user’s Privy ID (e.g., did:privy:abc123) |
old_apple_sub | Yes | The current Apple subject stored in Privy (Team A’s sub) |
email | No | The email currently stored in Privy for this Apple account, used for verification |
new_apple_sub | Yes | The new Apple subject from step 5 (Team B’s sub) |
new_email | No | The new private relay email from step 5 (include when is_private_email was true) |
new_email blank. Real email addresses are not team-scoped and don’t change during migration — Apple’s exchange response won’t include an email field for these users.
Step 7: Submit the migration to Privy
Provide the CSV to Privy support to run the Apple subject migration. This updates each user’s stored subject and, where provided, their stored email to the new Team B values. We’ll reach out once the migration is complete on our end.Step 8: Update Apple OAuth credentials in Privy
This step can be done while waiting for the subject migration in step 7 to complete — they are independent. Update the app’s Apple OAuth configuration with Team B’s credentials:- Key ID — the Key ID for Team B’s Sign in with Apple private key
- Private key — Team B’s
.p8private key file - Team ID — Team B’s 10-character Team ID
- Client ID — this is typically the bundle ID and stays the same after transfer
Both teams’ credentials remain valid during the 60-day migration window, so this step doesn’t need
to happen before the subject migration. However, it must be completed before the 60-day window
closes or Apple login will stop working.
Step 9: Re-enable Apple login and verify
Once the subject migration (step 7) and credential update (step 8) are both complete, re-enable Apple as a login method in the Privy dashboard. Then verify the migration by testing with a small number of users:- Have a user sign in with Apple through the app
- Verify they land on their existing account — same Privy ID, same linked accounts, same wallets and data
- If possible, also test with:
- A user who used “Hide My Email” (private relay) — these are most likely to be affected
- A user who shared their real email address
- A brand new user signing up for the first time post-transfer

