---
id: get-post-oidc-user-info-sandbox
title: "UserInfo Endpoint"
description: "OpenID Connect UserInfo endpoint that returns claims about the authenticated end-user. Requires a valid access token obtained from the token endpoint to be provided in the `Authorization` header. The endpoint accepts GET and POST. Error answers of the provider have an empty body, and the `WWW-Authenticate` header holds the reason."
sidebar_label: "UserInfo Endpoint"
hide_title: true
hide_table_of_contents: true
api: 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
sidebar_class_name: "post api-method"
info_path: docs/extensions-api/igrant-io-api-documentation
custom_edit_url: null
---

> **Build this with an AI coding agent.** Install the iGrant.io Agent Skills, then ask your agent to build the integration:
>
> ```bash
> npx skills add L3-iGrant/skills
> ```


import ApiTabs from "@theme/ApiTabs";
import DiscriminatorTabs from "@theme/DiscriminatorTabs";
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes";
import MimeTabs from "@theme/MimeTabs";
import ParamsItem from "@theme/ParamsItem";
import ResponseSamples from "@theme/ResponseSamples";
import SchemaItem from "@theme/SchemaItem";
import SchemaTabs from "@theme/SchemaTabs";
import Markdown from "@theme/Markdown";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";

<h1 className={"openapi__heading"}>UserInfo Endpoint</h1>

<MethodEndpoint method={"post"} path={"/v3/service/extension/oidc/{organisationId}/{sandboxOrgId}/userinfo"}></MethodEndpoint>



OpenID Connect UserInfo endpoint that returns claims about the authenticated end-user. Requires a valid access token obtained from the token endpoint to be provided in the `Authorization` header. The endpoint accepts GET and POST. Error answers of the provider have an empty body, and the `WWW-Authenticate` header holds the reason.


## Request

<details style={{"marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collapsed={false} open={true}><summary style={{}}><h3 className={"openapi-markdown__details-summary-header-params"}>Path Parameters</h3></summary><div><ul><ParamsItem className={"paramsItem"} param={{"description":"The ID of the organisation","in":"path","name":"organisationId","required":true,"schema":{"type":"string"}}}></ParamsItem><ParamsItem className={"paramsItem"} param={{"description":"Unique identifier of the sandbox organisation.","in":"path","name":"sandboxOrgId","required":true,"schema":{"type":"string"}}}></ParamsItem></ul></div></details><div><div><ApiTabs label={undefined} id={undefined}><TabItem label={"200"} value={"200"}><div>

User information

</div><details style={{"textAlign":"left","marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collaposed={true} open={false}><summary style={{}}><strong>Response Headers</strong></summary><ul style={{"marginLeft":"1rem"}}></ul></details><div><MimeTabs className={"openapi-tabs__mime"} schemaType={"response"}><TabItem label={"application/json"} value={"application/json"}><SchemaTabs className={"openapi-tabs__schema"}><TabItem label={"Schema"} value={"Schema"}><details style={{}} className={"openapi-markdown__details response"} data-collapsed={false} open={true}><summary style={{}} className={"openapi-markdown__details-summary-response"}><strong>Schema</strong></summary><div style={{"textAlign":"left","marginLeft":"1rem"}}></div><ul style={{"marginLeft":"1rem"}}><SchemaItem collapsible={false} name={"sub"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"Unique identifier for the user, resolved with the identity matching attributes or the callback of the client","example":"jane.doe@example.com"}}></SchemaItem><SchemaItem collapsible={true} className={"schemaItem"}><details style={{}} className={"openapi-markdown__details"}><summary style={{}}><span className={"openapi-schema__container"}><strong className={"openapi-schema__property"}>presentation</strong><span className={"openapi-schema__name"}> object</span></span></summary><div style={{"marginLeft":"1rem"}}><div style={{"marginTop":".5rem","marginBottom":".5rem"}}>

The presented credentials. This is an object, not an array. Each key is the index of a presentation as a string, starting at `"0"`. Each value holds the claims of that presentation, and its content depends on the credential format.


</div><SchemaItem collapsible={true} className={"schemaItem"}><details style={{}} className={"openapi-markdown__details"}><summary style={{}}><span className={"openapi-schema__container"}><strong className={"openapi-schema__property"}>property name*</strong><span className={"openapi-schema__name"}> object</span></span></summary><div style={{"marginLeft":"1rem"}}><SchemaItem name={"property name*"} required={false} schemaName={"any"} qualifierMessage={undefined} schema={{"type":"object","additionalProperties":true}} collapsible={false} discriminator={false}></SchemaItem></div></details></SchemaItem></div></details></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"sub\": \"jane.doe@example.com\",\n  \"presentation\": {\n    \"0\": {\n      \"vct\": \"urn:eudi:pid:1\",\n      \"email\": \"jane.doe@example.com\"\n    }\n  }\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"400"} value={"400"}><div>

Bad request. The provider answers with an empty body and the `WWW-Authenticate` header when a request parameter occurs more than once. The answer has `errorCode` and `errorDescription` when the organisation is not found.

</div><details style={{"textAlign":"left","marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collaposed={true} open={false}><summary style={{}}><strong>Response Headers</strong></summary><ul style={{"marginLeft":"1rem"}}><li className={"schemaItem"}><summary style={{}}><strong>WWW-Authenticate</strong><span style={{"opacity":"0.6"}}> string</span></summary><div><div style={{"marginTop":".5rem","marginBottom":".5rem"}}>

The Bearer challenge. It holds `error` and `error_description` when the provider gives a reason.

</div></div></li></ul></details><div><MimeTabs className={"openapi-tabs__mime"} schemaType={"response"}><TabItem label={"application/json"} value={"application/json"}><SchemaTabs className={"openapi-tabs__schema"}><TabItem label={"Schema"} value={"Schema"}><details style={{}} className={"openapi-markdown__details response"} data-collapsed={false} open={true}><summary style={{}} className={"openapi-markdown__details-summary-response"}><strong>Schema</strong></summary><div style={{"textAlign":"left","marginLeft":"1rem"}}></div><ul style={{"marginLeft":"1rem"}}><SchemaItem collapsible={false} name={"errorCode"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","example":400}}></SchemaItem><SchemaItem collapsible={false} name={"errorDescription"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"Bad input parameter"}}></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"errorCode\": 400,\n  \"errorDescription\": \"Bad input parameter\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"401"} value={"401"}><div>

Unauthorized. The access token is missing, not valid or expired. The body is empty.

</div><details style={{"textAlign":"left","marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collaposed={true} open={false}><summary style={{}}><strong>Response Headers</strong></summary><ul style={{"marginLeft":"1rem"}}><li className={"schemaItem"}><summary style={{}}><strong>WWW-Authenticate</strong><span style={{"opacity":"0.6"}}> string</span></summary><div><div style={{"marginTop":".5rem","marginBottom":".5rem"}}>

The Bearer challenge. It holds `error` and `error_description` when the provider gives a reason.

</div></div></li></ul></details><div></div></TabItem><TabItem label={"403"} value={"403"}><div>

Forbidden. The access token does not have the scope `openid`. The body is empty.

</div><details style={{"textAlign":"left","marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collaposed={true} open={false}><summary style={{}}><strong>Response Headers</strong></summary><ul style={{"marginLeft":"1rem"}}><li className={"schemaItem"}><summary style={{}}><strong>WWW-Authenticate</strong><span style={{"opacity":"0.6"}}> string</span></summary><div><div style={{"marginTop":".5rem","marginBottom":".5rem"}}>

The Bearer challenge. It holds `error` and `error_description` when the provider gives a reason.

</div></div></li></ul></details><div></div></TabItem><TabItem label={"404"} value={"404"}><div>

Not found. The Passwordless Login extension has never been enabled for the sandbox organisation.

</div><details style={{"textAlign":"left","marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collaposed={true} open={false}><summary style={{}}><strong>Response Headers</strong></summary><ul style={{"marginLeft":"1rem"}}></ul></details><div><MimeTabs className={"openapi-tabs__mime"} schemaType={"response"}><TabItem label={"application/json"} value={"application/json"}><SchemaTabs className={"openapi-tabs__schema"}><TabItem label={"Schema"} value={"Schema"}><details style={{}} className={"openapi-markdown__details response"} data-collapsed={false} open={true}><summary style={{}} className={"openapi-markdown__details-summary-response"}><strong>Schema</strong></summary><div style={{"textAlign":"left","marginLeft":"1rem"}}></div><ul style={{"marginLeft":"1rem"}}><SchemaItem collapsible={false} name={"error"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"The error code, for example `invalid_request`, `not_found` or `server_error`"}}></SchemaItem><SchemaItem collapsible={false} name={"error_description"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"The reason for the error"}}></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"error\": \"string\",\n  \"error_description\": \"string\"\n}"} language={"json"}></ResponseSamples></TabItem><TabItem label={"Example"} value={"Example"}><ResponseSamples responseExample={"{\n  \"error\": \"not_found\",\n  \"error_description\": \"Not found\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"500"} value={"500"}><div>

Internal server error. The answer has `errorCode` and `errorDescription` when it cannot reach the provider.

</div><details style={{"textAlign":"left","marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collaposed={true} open={false}><summary style={{}}><strong>Response Headers</strong></summary><ul style={{"marginLeft":"1rem"}}></ul></details><div><MimeTabs className={"openapi-tabs__mime"} schemaType={"response"}><TabItem label={"application/json"} value={"application/json"}><SchemaTabs className={"openapi-tabs__schema"}><TabItem label={"Schema"} value={"Schema"}><details style={{}} className={"openapi-markdown__details response"} data-collapsed={false} open={true}><summary style={{}} className={"openapi-markdown__details-summary-response"}><strong>Schema</strong></summary><div style={{"textAlign":"left","marginLeft":"1rem"}}></div><ul style={{"marginLeft":"1rem"}}><div><span className={"badge badge--info"}>oneOf</span><SchemaTabs><TabItem label={"Provider error"} value={"0-item-properties"}><SchemaItem collapsible={false} name={"error"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"The error code, for example `invalid_request`, `not_found` or `server_error`"}}></SchemaItem><SchemaItem collapsible={false} name={"error_description"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"The reason for the error"}}></SchemaItem></TabItem><TabItem label={"API error"} value={"1-item-properties"}><SchemaItem collapsible={false} name={"errorCode"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","example":400}}></SchemaItem><SchemaItem collapsible={false} name={"errorDescription"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"Bad input parameter"}}></SchemaItem></TabItem></SchemaTabs></div></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"error\": \"server_error\",\n  \"error_description\": \"Internal server error\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem></ApiTabs></div></div>
      