---
id: onboard-read-organisation-features
title: "Read organisation features"
description: "Returns the features of the organisation of the API key or token. A platform admin of the installation sets them; the organisation cannot change them. By default the API rejects each route of a product feature that is off, also for an API key, with `403`: `{'errorCode': 403, 'errorDescription': 'The feature webhooks is not enabled for this organisation', 'errorKey': 'feature_disabled', 'feature': 'webhooks'}`. Read the features to find out which routes your organisation can use. A sandbox organisation has the features of its main organisation."
sidebar_label: "Read organisation features"
hide_title: true
hide_table_of_contents: true
api: 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
sidebar_class_name: "get api-method"
info_path: docs/openid4vc-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"}>Read organisation features</h1>

<MethodEndpoint method={"get"} path={"/v4/onboard/platform/organisation/features"}></MethodEndpoint>



Returns the features of the organisation of the API key or token. A platform admin of the installation sets them; the organisation cannot change them. By default the API rejects each route of a product feature that is off, also for an API key, with `403`: `{"errorCode": 403, "errorDescription": "The feature webhooks is not enabled for this organisation", "errorKey": "feature_disabled", "feature": "webhooks"}`. Read the features to find out which routes your organisation can use. A sandbox organisation has the features of its main organisation.

<div><div><ApiTabs label={undefined} id={undefined}><TabItem label={"200"} value={"200"}><div>

The features of the 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={true} className={"schemaItem"}><details style={{}} className={"openapi-markdown__details"}><summary style={{}}><span className={"openapi-schema__container"}><strong className={"openapi-schema__property"}>configuredFeatures</strong><span className={"openapi-schema__name"}> object</span><span className={"openapi-schema__divider"}></span><span className={"openapi-schema__required"}>required</span></span></summary><div style={{"marginLeft":"1rem"}}><div style={{"marginTop":".5rem","marginBottom":".5rem"}}>

The features of the organisation: 13 product features and 1 preview (`apiKeyScopesUi`). The dashboard shows or hides its pages with them, and by default the API rejects each route of a product feature that is off with `403` and the `errorKey` `feature_disabled`. A sandbox organisation has the features of its main organisation. Only a platform admin of the installation can change them.

</div><SchemaItem collapsible={false} name={"gettingStarted"} required={true} schemaName={"boolean"} qualifierMessage={undefined} schema={{"type":"boolean","description":"The Getting Started page of the dashboard. No route depends on it.","example":true}}></SchemaItem><SchemaItem collapsible={false} name={"dataAgreements"} required={true} schemaName={"boolean"} qualifierMessage={undefined} schema={{"type":"boolean","description":"The data agreements and the global data policies. It gates the create, update and delete of a data agreement or a policy, and the read of one data agreement with its data attributes and revisions (`/v4/config/consent/data-agreement/...`). The lists, the reads of a policy and the service routes do not depend on it.","example":true}}></SchemaItem><SchemaItem collapsible={false} name={"dataDisclosureAgreements"} required={true} schemaName={"boolean"} qualifierMessage={undefined} schema={{"type":"boolean","description":"The data disclosure agreements and the data space (`/v4/config/consent/data-disclosure-agreement...`, `/v4/config/consent/data-space/...` and their service routes).","example":false}}></SchemaItem><SchemaItem collapsible={false} name={"managedData"} required={true} schemaName={"boolean"} qualifierMessage={undefined} schema={{"type":"boolean","description":"The Personal Data page of the dashboard. No route depends on it.","example":true}}></SchemaItem><SchemaItem collapsible={false} name={"issuerVerifier"} required={true} schemaName={"boolean"} qualifierMessage={undefined} schema={{"type":"boolean","description":"The issuer and verifier routes (`/v4/config/ows/issuer/...`, `/v4/config/ows/verifier/...`) and the extensions (`/v4/config/platform/extension...`).","example":true}}></SchemaItem><SchemaItem collapsible={false} name={"walletUnit"} required={true} schemaName={"boolean"} qualifierMessage={undefined} schema={{"type":"boolean","description":"The holder routes of the organisation wallet (`/v4/config/ows/holder/...`).","example":true}}></SchemaItem><SchemaItem collapsible={false} name={"consentManagement"} required={true} schemaName={"boolean"} qualifierMessage={undefined} schema={{"type":"boolean","description":"The individuals, the identity providers and the push notification configuration of the organisation, and the requests of individuals.","example":true}}></SchemaItem><SchemaItem collapsible={false} name={"privacyDashboard"} required={true} schemaName={"boolean"} qualifierMessage={undefined} schema={{"type":"boolean","description":"The privacy dashboard routes (`/v4/config/platform/privacy-dashboard...`).","example":true}}></SchemaItem><SchemaItem collapsible={false} name={"account"} required={true} schemaName={"boolean"} qualifierMessage={undefined} schema={{"type":"boolean","description":"The team of the organisation, the data verifier users and the API keys.","example":true}}></SchemaItem><SchemaItem collapsible={false} name={"actionLogs"} required={true} schemaName={"boolean"} qualifierMessage={undefined} schema={{"type":"boolean","description":"The activity logs (`GET /v4/audit/platform/admin/logs`).","example":true}}></SchemaItem><SchemaItem collapsible={false} name={"webhooks"} required={true} schemaName={"boolean"} qualifierMessage={undefined} schema={{"type":"boolean","description":"The webhooks, their event types and their deliveries (`/v4/config/platform/webhook...`).","example":true}}></SchemaItem><SchemaItem collapsible={false} name={"files"} required={true} schemaName={"boolean"} qualifierMessage={undefined} schema={{"type":"boolean","description":"No route depends on it.","example":false}}></SchemaItem><SchemaItem collapsible={false} name={"sandbox"} required={true} schemaName={"boolean"} qualifierMessage={undefined} schema={{"type":"boolean","description":"No route depends on it.","example":false}}></SchemaItem><SchemaItem collapsible={false} name={"apiKeyScopesUi"} required={true} schemaName={"boolean"} qualifierMessage={undefined} schema={{"type":"boolean","description":"A preview of the dashboard: when `true`, the dashboard shows the scope picker of the API keys. No route depends on it.","example":true}}></SchemaItem></div></details></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"configuredFeatures\": {\n    \"gettingStarted\": true,\n    \"dataAgreements\": true,\n    \"dataDisclosureAgreements\": false,\n    \"managedData\": true,\n    \"issuerVerifier\": true,\n    \"walletUnit\": true,\n    \"consentManagement\": true,\n    \"privacyDashboard\": true,\n    \"account\": true,\n    \"actionLogs\": true,\n    \"webhooks\": true,\n    \"files\": false,\n    \"sandbox\": false,\n    \"apiKeyScopesUi\": true\n  }\n}"} language={"json"}></ResponseSamples></TabItem><TabItem label={"Example"} value={"Example"}><ResponseSamples responseExample={"{\n  \"configuredFeatures\": {\n    \"gettingStarted\": true,\n    \"dataAgreements\": true,\n    \"dataDisclosureAgreements\": false,\n    \"managedData\": true,\n    \"issuerVerifier\": true,\n    \"walletUnit\": true,\n    \"consentManagement\": true,\n    \"privacyDashboard\": true,\n    \"account\": true,\n    \"actionLogs\": true,\n    \"webhooks\": true,\n    \"files\": false,\n    \"sandbox\": false,\n    \"apiKeyScopesUi\": true\n  }\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"401"} value={"401"}><div>

The `Authorization` header is missing, or the API key or token is not valid.

</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={"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><SchemaItem collapsible={false} name={"errorKey"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"A text code of the refusal that does not change when the text changes. Only some refusals have it, for example `organisation_suspended`, `feature_disabled` or `purpose_exists`."}}></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"errorCode\": 400,\n  \"errorDescription\": \"Bad input parameter\",\n  \"errorKey\": \"string\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"403"} value={"403"}><div>

The API key or token does not allow this call. An API key without the scope of the operation gets the older body `{"Code", "Message"}`. An `X-SandboxOrgId` header that names another sandbox organisation than the one of the API key gets `{"errorCode", "errorDescription"}`. When a platform admin has turned off the feature of the operation for the organisation, the answer has `errorKey` `feature_disabled` and the member `feature` (the name of the feature).

</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"}>anyOf</span><SchemaTabs><TabItem label={"MOD1"} value={"0-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><SchemaItem collapsible={false} name={"errorKey"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"A text code of the refusal that does not change when the text changes. Only some refusals have it, for example `organisation_suspended`, `feature_disabled` or `purpose_exists`."}}></SchemaItem></TabItem><TabItem label={"Older error body"} value={"1-item-properties"}><SchemaItem collapsible={false} name={"Code"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","description":"The HTTP status.","example":403}}></SchemaItem><SchemaItem collapsible={false} name={"Message"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"What went wrong.","example":"Unauthorized access;User doesn't have enough permissions;"}}></SchemaItem></TabItem></SchemaTabs></div></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{}"} language={"json"}></ResponseSamples></TabItem><TabItem label={"Example"} value={"Example"}><ResponseSamples responseExample={"{\n  \"Code\": 403,\n  \"Message\": \"Unauthorized access;User doesn't have enough permissions;\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"404"} value={"404"}><div>

The organisation cannot be read: `Failed to get organization by ID :<organisationId>`.

</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={"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><SchemaItem collapsible={false} name={"errorKey"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"A text code of the refusal that does not change when the text changes. Only some refusals have it, for example `organisation_suspended`, `feature_disabled` or `purpose_exists`."}}></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"errorCode\": 400,\n  \"errorDescription\": \"Bad input parameter\",\n  \"errorKey\": \"string\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem></ApiTabs></div></div>
      