Resolve a caller's attributes and groups
Answers "who is the principal behind this token" so a policy can decide on group membership and directory attributes rather than only on what the token happens to carry.
One endpoint over BOTH identity planes, resolved in order: a SlashID person by id, then an identity in the NHI graph by connection subject, then — only as a fallback — a UNIQUE email-claim match. An ambiguous email resolves to nothing, because an authorization decision must never rest on a guessed identity.
No x-rbac-enabled: the caller is a gate process, not a console session. Authenticated with the same org API key gate already holds, so enabling attribute conditions provisions no new credential.
A caller that matches nothing is a 200 with resolved: false, not a 404: "we looked and found nobody" is an answer, and gate caches it briefly so an unknown subject cannot hammer this endpoint. A 404 would be indistinguishable from the endpoint being unreachable, which is the case gate must handle differently.
Header Parameters
- SlashID-OrgID string required
The organization ID
Example: af5fbd30-7ce7-4548-8b30-4cd59cb2aba1
- application/json
Request Body required
- verified boolean
Default value:
falseWhether a plugin cryptographically VERIFIED the token these values came from. Resolution requires it: the subject on an unverified token is a value the caller chose, so resolving attributes for it would let them select whose permissions they receive. Gate already refuses to call this endpoint without verification; this field is what lets the endpoint refuse too, rather than trusting its caller to have checked. Absent counts as false.
- issuer string
The token's
iss. Part of the identity, not decoration: two IdPs can each mint a token whose subject is "alice", and they are different people. - subject string required
The token's
sub. Gate only sends this for a token whose signature a plugin VERIFIED — an unverifiedsubis a value the caller chose. claims object
The remaining decoded claims, used only for the email fallback when neither the person id nor a connection subject matches.
- 200
- 400
- 401
- 403
The lookup completed. Read result.resolved — 200 covers both "found" and "matched nobody".
- application/json
- Schema
- Example (from schema)
Schema
meta object
pagination object
limit integeroffset integertotal_count int64cursor_pagination object
Cursors are opaque. Follow the tokens the server returns; never construct, parse or modify one.
limit integernext_cursor stringOpaque token addressing the next page. Absent on the last page.
prev_cursor stringOpaque token addressing the previous page. Absent on the first page.
last_cursor stringOpaque token addressing the final page directly, so a client can jump to the end without a total count.
total_count int64Total number of matching items. Returned on the FIRST page only; clients cache it for the remainder of the walk.
errors object[]
httpcode integermessage stringcode stringMachine-readable reason, present only for errors that define one. Values today:
unserved_org_region(the organization is homed in a region this deployment does not serve),wrong_region(the request must be sent to the organization's home region),region_route_missing(this instance has no route to the organization's home region).result object
What SlashID knows about a caller.
resolvedis a POSITIVE assertion, and a false answer carries no attributes and no groups — so a consumer cannot mistake "we could not look this caller up" for "this caller has nothing".resolved booleansource stringPossible values: [
im,graph]Which plane answered:
imfor a SlashID person,graphfor an identity in the NHI graph. Absent when unresolved.match_basis stringPossible values: [
person_id,connection_subject,email_claim]HOW the caller was matched, reported so an operator debugging a surprising decision can see whether the match was exact or a fallback. Absent when unresolved.
attributes object
The caller's attributes. Buckets the end user can write themselves are excluded: a policy keyed on a value its own subject can set is self-service privilege escalation.
groups string[]tags string[]The NAMES of the entity tags applied to the caller's identity in the NHI graph. Names rather than ids, because a policy naming a tag id is unreadable and a tag renamed keeps its id — the operator writes the name they see in the graph.
Only the
graphplane answers these; a SlashID person matched on theimplane carries none, and reports an empty list rather than omitting the key, for the same reasongroupsdoes.person_id stringPresent only when the caller matched a SlashID person.
cache_ttl_seconds integerHow long gate may reuse this answer. Zero means "no opinion" — gate substitutes its configured default rather than treating the answer as immediately stale.
{
"meta": {
"pagination": {
"limit": 0,
"offset": 0,
"total_count": 0
},
"cursor_pagination": {
"limit": 0,
"next_cursor": "string",
"prev_cursor": "string",
"last_cursor": "string",
"total_count": 0
}
},
"errors": [
{
"httpcode": 0,
"message": "string",
"code": "string"
}
],
"result": {
"resolved": true,
"source": "im",
"match_basis": "person_id",
"attributes": {},
"groups": [
"string"
],
"tags": [
"string"
],
"person_id": "string",
"cache_ttl_seconds": 0
}
}
Bad Request
- application/json
- Schema
- Example (from schema)
Schema
meta object
pagination object
limit integeroffset integertotal_count int64cursor_pagination object
Cursors are opaque. Follow the tokens the server returns; never construct, parse or modify one.
limit integernext_cursor stringOpaque token addressing the next page. Absent on the last page.
prev_cursor stringOpaque token addressing the previous page. Absent on the first page.
last_cursor stringOpaque token addressing the final page directly, so a client can jump to the end without a total count.
total_count int64Total number of matching items. Returned on the FIRST page only; clients cache it for the remainder of the walk.
errors object[]
httpcode integermessage stringcode stringMachine-readable reason, present only for errors that define one. Values today:
unserved_org_region(the organization is homed in a region this deployment does not serve),wrong_region(the request must be sent to the organization's home region),region_route_missing(this instance has no route to the organization's home region).
{
"meta": {
"pagination": {
"limit": 0,
"offset": 0,
"total_count": 0
},
"cursor_pagination": {
"limit": 0,
"next_cursor": "string",
"prev_cursor": "string",
"last_cursor": "string",
"total_count": 0
}
},
"errors": [
{
"httpcode": 0,
"message": "string",
"code": "string"
}
]
}
Unauthorized
- application/json
- Schema
- Example (from schema)
Schema
meta object
pagination object
limit integeroffset integertotal_count int64cursor_pagination object
Cursors are opaque. Follow the tokens the server returns; never construct, parse or modify one.
limit integernext_cursor stringOpaque token addressing the next page. Absent on the last page.
prev_cursor stringOpaque token addressing the previous page. Absent on the first page.
last_cursor stringOpaque token addressing the final page directly, so a client can jump to the end without a total count.
total_count int64Total number of matching items. Returned on the FIRST page only; clients cache it for the remainder of the walk.
errors object[]
httpcode integermessage stringcode stringMachine-readable reason, present only for errors that define one. Values today:
unserved_org_region(the organization is homed in a region this deployment does not serve),wrong_region(the request must be sent to the organization's home region),region_route_missing(this instance has no route to the organization's home region).
{
"meta": {
"pagination": {
"limit": 0,
"offset": 0,
"total_count": 0
},
"cursor_pagination": {
"limit": 0,
"next_cursor": "string",
"prev_cursor": "string",
"last_cursor": "string",
"total_count": 0
}
},
"errors": [
{
"httpcode": 0,
"message": "string",
"code": "string"
}
]
}
Forbidden
- application/json
- Schema
- Example (from schema)
Schema
meta object
pagination object
limit integeroffset integertotal_count int64cursor_pagination object
Cursors are opaque. Follow the tokens the server returns; never construct, parse or modify one.
limit integernext_cursor stringOpaque token addressing the next page. Absent on the last page.
prev_cursor stringOpaque token addressing the previous page. Absent on the first page.
last_cursor stringOpaque token addressing the final page directly, so a client can jump to the end without a total count.
total_count int64Total number of matching items. Returned on the FIRST page only; clients cache it for the remainder of the walk.
errors object[]
httpcode integermessage stringcode stringMachine-readable reason, present only for errors that define one. Values today:
unserved_org_region(the organization is homed in a region this deployment does not serve),wrong_region(the request must be sent to the organization's home region),region_route_missing(this instance has no route to the organization's home region).
{
"meta": {
"pagination": {
"limit": 0,
"offset": 0,
"total_count": 0
},
"cursor_pagination": {
"limit": 0,
"next_cursor": "string",
"prev_cursor": "string",
"last_cursor": "string",
"total_count": 0
}
},
"errors": [
{
"httpcode": 0,
"message": "string",
"code": "string"
}
]
}