All of Privy’s login methods result in a unified JSON representation of your user.
To get the current user, inspect the user
object returned by the usePrivy
hook:
const { user } = usePrivy();
For unauthenticated users, the user
object will be null
.
For authenticated users, you can use the following fields:
Hide User
The Privy-issued DID for the user. If you need to store additional information about a user, you can use this DID to reference them.
The datetime of when the user was created, in ISO 8601 format.
The list of accounts associated with this user. Each account contains additional metadata that may be helpful for advanced use cases.
Show Properties
Show Wallet
Denotes that this is a wallet account
The server wallet ID of the wallet. Null if the wallet is not delegated. Only applies to embedded wallets (walletClientType === ‘privy’)
The wallet address
Chain type of the wallet address
The wallet client used for this wallet during the most recent verification. If the value is ‘privy’, then this is a privy embedded wallet
The connector type used for this wallet during the most recent verification
If this is a ‘privy’ embedded wallet, stores the recovery method
Whether the wallet is imported. Only applies to embedded wallets (walletClientType === ‘privy’)
Whether the wallet is delegated. Only applies to embedded wallets (walletClientType === ‘privy’)
HD index for the wallet. Only applies to embedded wallets (walletClientType === ‘privy’)
Show SmartWallet
Show Email
Show Phone
Show Google
Show Twitter
Denotes that this is a Twitter account
The ‘sub’ claim from the Twitter-issued JWT for this account
The username associated with the Twitter account
The name associated with the Twitter account
The profile picture URL associated with the Twitter account
Show Discord
Show Github
Denotes that this is a Github account
The ‘sub’ claim from the Github-issued JWT for this account
The username associated with the Github account
The name associated with the Github account
The email associated with the Github account
Show Spotify
Show Instagram
Show Tiktok
Show LinkedIn
Denotes that this is a LinkedIn account
The ‘sub’ claim from the LinkedIn-issued JWT for this account
The name associated with the LinkedIn account
The email associated with the LinkedIn account
The vanityName/profile URL associated with the LinkedIn account
Show Apple
Show CustomJwt
Show Farcaster
Denotes that this is a Farcaster account
The Farcaster on-chain FID
The Farcaster ethereum address that owns the FID
The Farcaster protocol username
The Farcaster protocol display name
The Farcaster protocol bio
The Farcaster protocol profile picture
The Farcaster protocol profile url
The public key of the signer, if set. This is not guaranteed to be valid, as the user can revoke the key at any time
Show Passkey
Denotes that this is a Passkey account
The passkey credential ID
Whether or not this passkey can be used for MFA
The type of authenticator holding the passkey
Metadata about the device that registered the passkey
Metadata about the OS that registered the passkey
Metadata about the browser that registered the passkey
Show Telegram
Denotes that this is a Telegram account
The user ID that owns this Telegram account
The first name of the user
The last name of the user
The username associated with the Telegram account
The url of the user’s profile picture
Show CrossApp
Denotes that this is a cross-app account
The user’s embedded wallet address(es) from the provider app
The user’s smart wallet address(es) from the provider app
Metadata about the provider app
The subject identifier for this cross-app account
The list of MFA Methods associated with this user.
Whether or not the user has explicitly accepted the Terms and Conditions and/or Privacy Policy
Whether or not the user is a guest
Show Optional fields
The user’s email address, if they have linked one. It cannot be linked to another user.
Show Properties
The email address.
The user’s phone number, if they have linked one. It cannot be linked to another user.
Show Properties
The phone number.
The user’s first verified wallet, if they have linked at least one wallet. It cannot be linked to another user.
The user’s Twitter account, if they have linked one. It cannot be linked to another user.
The user’s Github account, if they have linked one. It cannot be linked to another user.
The user’s Tiktok account, if they have linked one. It cannot be linked to another user.
The user’s LinkedIn account, if they have linked one. It cannot be linked to another user.
The user’s Farcaster account, if they have linked one. It cannot be linked to another user.
Show Properties
The Farcaster on-chain FID
The Farcaster ethereum address that owns the FID
The Farcaster protocol username
The Farcaster protocol display name
The Farcaster protocol bio
The Farcaster protocol profile picture
The Farcaster protocol profile url
The public key of the signer, if set. This is not guaranteed to be valid, as the user can revoke the key at any time
The user’s Telegram account, if they have linked one. It cannot be linked to another user.
Custom metadata field for a given user account
You can set custom metadata for a user via Privy’s backend server SDK and/or API endpoints.
If a user has not linked an account of a given type, the corresponding field on the user
object will be undefined.
Users can have multiple passkeys linked to their account. To find all linked
passkeys, use the linkedAccounts
list and filter by passkey
account type.
Below is an example of how you might use the user
object in a minimal user profile:
import { usePrivy } from "@privy-io/react-auth";
function User() {
const { ready, authenticated, user } = usePrivy();
// Show nothing if user is not authenticated or data is still loading
if (!(ready && authenticated) || !user) {
return null;
}
return (
<div>
<p>User {user.id} has linked the following accounts:</p>
<ul>
<li>Apple: {user.apple ? user.apple.email : "None"}</li>
<li>Discord: {user.discord ? user.discord.username : "None"}</li>
<li>Email: {user.email ? user.email.address : "None"}</li>
<li>Farcaster: {user.farcaster ? user.farcaster.username : "None"}</li>
<li>GitHub: {user.github ? user.github.username : "None"}</li>
<li>Google: {user.google ? user.google.email : "None"}</li>
<li>Instagram: {user.instagram ? user.instagram.username : "None"}</li>
<li>LinkedIn: {user.linkedin ? user.linkedin.email : "None"}</li>
<li>Phone: {user.phone ? user.phone.number : "None"}</li>
<li>Spotify: {user.spotify ? user.spotify.email : "None"}</li>
<li>Telegram: {user.telegram ? user.telegram.username : "None"}</li>
<li>TikTok: {user.tiktok ? user.tiktok.username : "None"}</li>
<li>Twitter: {user.twitter ? user.twitter.username : "None"}</li>
<li>Wallet: {user.wallet ? user.wallet.address : "None"}</li>
</ul>
</div>
);
}
user
objectIn order to update a user
object after any type of backend update, (i.e. unlinking an account or setting custom metadata) you can ensure the user object in the application is up-to-date by invoking the refreshUser
method from the useUser
hook:
import { useUser } from "@privy-io/react-auth";
const { user, refreshUser } = useUser();
const updateMetadata = async (value: string) => {
// Make API request to update custom metadata for a user from the backend
const response = await updateUserMetadata({ value });
await refreshUser();
// `user` object should be updated
console.log(user);
};