/me — Who Am I
A single endpoint that returns the authenticated principal's profile, regardless of whether the caller is a human user or an AI agent. Use it from frontends, mobile apps, and AI tools that just need "tell me about the holder of this token."
GET /orgs/{orgId}/api/v1/me
Authentication
Either an OAuth access token or an organization-scoped API key:
| Method | Header |
|---|---|
| Bearer token | Authorization: Bearer eyJ... |
| API key | Authorization: ApiKey lmk_... or X-API-Key: lmk_... |
Response shape
The subject_type field tells you whether to use the user or agent shape.
subject_type = "user"
{
"subject_type": "user",
"id": "01JF3KABCDE...",
"email": "jane@acme.com",
"email_verified": true,
"name": "Jane Doe",
"given_name": "Jane",
"family_name": "Doe",
"middle_name": null,
"nickname": null,
"preferred_username": "jane.doe",
"picture": "https://example.com/avatar.png",
"locale": "en",
"zoneinfo": "America/New_York",
"phone_number": null,
"mfa_enabled": true,
"roles": ["admin"],
"groups": [
{"id": "01JG...", "name": "engineering"}
],
"tenant": {
"id": "01JE...",
"slug": "acme-corp",
"name": "Acme Corp"
},
"last_login_at": "2026-04-10T09:15:00+00:00",
"created_at": "2026-01-15T10:30:00+00:00",
"updated_at": "2026-03-01T08:00:00+00:00"
}
subject_type = "agent"
{
"subject_type": "agent",
"id": "42",
"agent_id": "agt_01HF...",
"name": "Invoice Analyzer",
"identity_type": "workload",
"capabilities": ["invoices.read"],
"scopes": ["read"],
"status": "active",
"tenant": {
"id": "01JE...",
"slug": "acme-corp",
"name": "Acme Corp"
}
}
For richer agent details (workload identity claims, JWKS URI, budget) use GET /orgs/{orgId}/api/v1/agents/me instead.
Examples
- curl
- Node
- Python
- Go
curl "https://app.lumoauth.dev/orgs/acme-corp/api/v1/me" \
-H "Authorization: Bearer $ACCESS_TOKEN"
const resp = await fetch("https://app.lumoauth.dev/orgs/acme-corp/api/v1/me", {
headers: { "Authorization": `Bearer ${accessToken}` }
});
const me = await resp.json();
console.log(me.subject_type); // "user" or "agent"
import requests
resp = requests.get(
"https://app.lumoauth.dev/orgs/acme-corp/api/v1/me",
headers={"Authorization": f"Bearer {access_token}"},
)
me = resp.json()
print(me["subject_type"]) # "user" or "agent"
req, _ := http.NewRequest("GET", "https://app.lumoauth.dev/orgs/acme-corp/api/v1/me", nil)
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil { return err }
defer resp.Body.Close()
var me struct {
SubjectType string `json:"subject_type"`
}
json.NewDecoder(resp.Body).Decode(&me)
fmt.Println(me.SubjectType) // "user" or "agent"
Errors
| Status | Reason |
|---|---|
| 401 | No token / invalid token |
| 404 | Organization orgId does not exist |