Users overview
The users resource has exactly one endpoint, and it answers one question: who am I to this API right now?
GET /api/v2/users/me/ echoes the calling principal back at you — the kind of credential you presented, the identity it resolves to, and, for OAuth tokens, the scopes it was actually granted. It is the natural first call after wiring up credentials, and the first thing to run when a request is failing and you are not sure why.
The current user object
Attributes
idstring (uuid)The user this credential acts as. This is the same id you see as
member_idon the member rosters,created_by_idon objects you create, andactor_idin audit logs — so it is how you confirm that the trail you are looking at is yours.display_namestringThe user's display name.
emailstring (email)The user's email address. Useful for confirming you are on the account you meant to be on, especially across staging and production keys.
principal_kindstringWhat kind of credential is calling. One of:
oauth— an OAuth access token issued to an applicationapi_key— a personal API key sent inX-Api-Keyother— anything else the server recognizes as authenticated
scopesarray of stringThe scopes this credential carries. For an OAuth token these are the fine-grained scopes the user consented to, for example
projects.work_items:read. Compare this list against the scope named on the endpoint you are calling before you conclude that a403is a role problem.
{
"id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
"display_name": "Priya Raghavan",
"email": "priya@example.com",
"principal_kind": "oauth",
"scopes": ["projects.work_items:read", "projects.work_items:write", "projects.states:read", "workspaces.members:read"]
}Endpoints
| Method | Path | Description |
|---|---|---|
GET | /api/v2/users/me/ | Return the calling principal |
The path has no workspace slug: it describes the credential, not a workspace. There is no /users/{id}/ in v2 — to look other people up, read a workspace or project roster with ?expand=member.
Debugging auth with it
This endpoint declares no fine-grained scope requirement — an API key reaches it unconditionally, and an OAuth token needs only a read scope. That makes it a clean way to split failures apart:
| Symptom | What GET /users/me/ tells you |
|---|---|
Every call returns 401 | If this returns 401 too, the credential itself is wrong — bad key, wrong header, expired token. |
One call returns 403, others work | Compare scopes against the scope that endpoint documents. A missing scope is the usual cause. |
| Writes land under an unexpected author | Check id and email — you are probably holding a different account's key than you think. |
| Not sure whether an integration is OAuth or a key | Read principal_kind. |
A 409 is not an auth failure
If scopes contains the write scope for the endpoint and the call still fails with 409 work_item_types_managed_at_workspace or work_item_types_managed_at_project, the credential is fine. The workspace manages work item types on the other surface, and the same request succeeds there. See Work item type modes.
Scopes are a ceiling, not a grant
A token can only do what its scopes allow and what the underlying user's role allows. A broad scope on a member-level account is still limited by that member's role, so an empty-handed 403 with the right scope listed here points at the role, not the token.
Changed from v1
- The response is now about the principal, not just the person.
principal_kindandscopesare new, and they are what make the endpoint useful for debugging OAuth apps. first_name,last_name,avatar, andavatar_urlare no longer returned.display_nameandemailremain.
See Migrating from v1 for the full list.
Related
- Get current user
- Authentication — how to present an API key or OAuth token
- Members overview — resolve other people from a roster

