User impersonation lets a trusted operator temporarily act as another user in the same Appwrite project, without sharing credentials. The operator signs in as themselves first, then sets a single impersonation target on the client. Appwrite resolves that target and executes requests using their permissions.
This is especially useful when you need to:
- Reproduce a bug that only appears for a specific user
- Verify permissions and feature access from the user's point of view
- Help customer support teams troubleshoot account issues
- Review onboarding or upgrade flows exactly as an end user sees them
How it works
Impersonation follows four steps:
- Enable the
impersonatorcapability for a trusted operator. - Have that operator sign in normally using any supported Appwrite Auth flow.
- Set exactly one impersonation target on the Appwrite client.
- Appwrite resolves the target user and evaluates the request as that user.
User authentication is required
Impersonation only works on requests that are already authenticated as a user with impersonation enabled. In server-side flows, an API key alone is not enough. You must also set a valid operator session on the client.
When impersonation is active, the returned user model includes impersonatorUserId. Your app can use this to show a visible banner or disable risky actions while someone is acting on behalf of another user.
Enable impersonation for an operator
You can grant a user the impersonator capability in two ways:
- In the Appwrite Console under Auth > Users, open the user's profile and toggle on the impersonator capability
- Via the Users API, by setting the
impersonatorfield totrueon the user
Only grant this capability to internal users (support agents, QA engineers, or operations staff) who need to see the app exactly as a specific end user would.
Recommended setup
Create a dedicated internal operator account for each team member instead of sharing one support account.
This makes it easier to review internal audit activity and control access over time.
When a user is marked as an impersonator, Appwrite also grants them the users.read scope.
This allows trusted operators to list users in the project, which is especially useful when building internal admin-style tools that let support or QA teams search for a user and choose who to impersonate next.
Initialize an impersonated client
After the operator signs in, initialize the Appwrite client as usual and set exactly one impersonation target. Only one target can be active per request; using more than one is not supported.
SDK support
Make sure you are using an Appwrite SDK version that supports impersonation. In client SDKs, the operator's session is persisted automatically after login, so enabling impersonation is just a matter of setting the right option on the client before making requests.
By user ID
Impersonating by user ID is the most precise option. Use it when your internal tools already store the Appwrite user ID or when an operator selected a user from your support dashboard.
By email
Impersonating by email is useful in admin panels and support workflows where operators search for users by email address first.
By phone
Impersonating by phone is helpful for support flows where the phone number is the primary identifier or when your app is centered around SMS-based authentication.
Choosing the right identifier
All three options result in the same impersonated session. The difference is which identifier your operator workflow has available:
- Use user ID when you already have the canonical Appwrite ID
- Use email when support teams search by email address
- Use phone when your app is centered around phone login or phone-based onboarding
Only set one impersonation value at a time. If you need to switch targets, create a fresh client or replace the previous impersonation value before continuing.
Build safe support tooling
Impersonation is most useful when you wrap it in explicit operator UX:
- Use the automatically granted
users.readscope to build a user picker or searchable support view - Show a clear banner while impersonation is active
- Display both the operator identity and the effective user identity
- Require an explicit action to start impersonation
- Let operators stop impersonating with one click
- Limit impersonation features to internal tools and trusted roles
Security and visibility
Keep impersonation limited to trusted operators and internal tools.
Important behavior to know:
- Impersonation must start from a real user session, not an API key by itself.
- Users with impersonation enabled are automatically granted the
users.readscope. - The target user's permissions are used for the impersonated request.
- The user model includes
impersonator, which indicates whether that user can impersonate others, andimpersonatorUserId, which is present only during an active impersonation session and identifies the operator performing the impersonation. - Internal audit logs attribute the action to the original impersonator and include the impersonated target in internal audit payload data.
If you build an internal admin panel, use impersonatorUserId to make the impersonated state obvious at all times.