# Organization websites 10 management API operations. - [POST /v1/institutions/{institution_id}/websites/plan](/docs/api/operations/preview_plan_v1_institutions__institution_id__websites_plan_post): Preview Plan - [GET /v1/institutions/{institution_id}/websites](/docs/api/operations/listing_v1_institutions__institution_id__websites_get): Listing - [POST /v1/institutions/{institution_id}/websites](/docs/api/operations/create_v1_institutions__institution_id__websites_post): Create - [GET /v1/institutions/{institution_id}/websites/{project_id}](/docs/api/operations/detail_v1_institutions__institution_id__websites__project_id__get): Detail - [POST /v1/institutions/{institution_id}/websites/{project_id}/resubmit](/docs/api/operations/resubmit_v1_institutions__institution_id__websites__project_id__resubmit_post): Resubmit - [POST /v1/institutions/{institution_id}/websites/{project_id}/withdraw](/docs/api/operations/withdraw_v1_institutions__institution_id__websites__project_id__withdraw_post): Withdraw - [POST /v1/institutions/{institution_id}/websites/{project_id}/request-changes](/docs/api/operations/request_changes_v1_institutions__institution_id__websites__project_id__request_changes_post): Request Changes - [POST /v1/institutions/{institution_id}/websites/{project_id}/reject](/docs/api/operations/reject_v1_institutions__institution_id__websites__project_id__reject_post): Reject - [POST /v1/institutions/{institution_id}/websites/{project_id}/approve](/docs/api/operations/approve_v1_institutions__institution_id__websites__project_id__approve_post): Approve - [GET /v1/projects/{project_id}/website-configuration](/docs/api/operations/approved_website_configuration_v1_projects__project_id__website_configuration_get): Approved Website Configuration ## POST /v1/institutions/{institution_id}/websites/plan Preview Plan Preview Plan Authentication: bearer access token with audience `taifa-management`. Endpoint roles and eligibility are reviewed separately from the OpenAPI bearer scheme. No operation-specific scopes are declared in the OpenAPI document. Bearer authentication and endpoint authorization requirements still apply. ### Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `institution_id` | path | string | Yes | | ### Request body #### application/json Required; Fields | Field | Variant | Type | Required | Description | | --- | --- | --- | --- | --- | | `name` | | string | Yes | Validation: min length 2; max length 200 | | `website` | | string | Yes | Validation: min length 8; max length 2048 | | `connector_kind` | | string | No | Validation: pattern ^(taifa_connector\|standard_oidc)$ | | `connector_product` | | string \| null | No | | | `preview_digest` | | string \| null | No | | | `owner_person_id` | | string | Yes | Validation: min length 1 | | `environment` | | string | Yes | Validation: pattern ^(staging\|production)$ | | `redirect_uris` | | string[] | No | Validation: max items 16 | | `post_logout_redirect_uris` | | string[] | No | Validation: max items 16 | | `backchannel_logout_uri` | | string \| null | No | | | `requested_scopes` | | string[] | Yes | Validation: min items 1; max items 3 | | `reason` | | string | Yes | Validation: min length 8; max length 500 | ### Responses #### 200 Successful Response No fields declared in the current specification. #### 422 Validation Error | Field | Variant | Type | Required | Description | | --- | --- | --- | --- | --- | | `detail` | | ValidationError[] | No | | ### Request examples Illustrative only. Replace placeholders and keep management tokens on the server. #### cURL ```sh curl -X POST 'https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/plan' \ -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ -H 'Content-Type: application/json' \ --data '{ "name": "REPLACE_WITH_NAME", "website": "REPLACE_WITH_WEBSITE", "owner_person_id": "REPLACE_WITH_OWNER_PERSON_ID", "environment": "REPLACE_WITH_ENVIRONMENT", "requested_scopes": [], "reason": "REPLACE_WITH_REASON" }' ``` #### TypeScript (Node.js/server-side) ```typescript const response = await fetch('https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/plan', { method: 'POST', headers: { Authorization: `Bearer ${process.env.TAIFA_MANAGEMENT_TOKEN}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ "name": "REPLACE_WITH_NAME", "website": "REPLACE_WITH_WEBSITE", "owner_person_id": "REPLACE_WITH_OWNER_PERSON_ID", "environment": "REPLACE_WITH_ENVIRONMENT", "requested_scopes": [], "reason": "REPLACE_WITH_REASON" }) }); const result = await response.json(); ``` #### Python ```python import os import json import requests response = requests.request( 'POST', 'https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/plan', headers={'Authorization': 'Bearer ' + os.environ['TAIFA_MANAGEMENT_TOKEN']}, json=json.loads('{"name":"REPLACE_WITH_NAME","website":"REPLACE_WITH_WEBSITE","owner_person_id":"REPLACE_WITH_OWNER_PERSON_ID","environment":"REPLACE_WITH_ENVIRONMENT","requested_scopes":[],"reason":"REPLACE_WITH_REASON"}') ) response.raise_for_status() ``` ### Response example No response example in the current specification. [Request and response examples](/docs/api/operations/preview_plan_v1_institutions__institution_id__websites_plan_post) ## GET /v1/institutions/{institution_id}/websites Listing Listing Authentication: bearer access token with audience `taifa-management`. Endpoint roles and eligibility are reviewed separately from the OpenAPI bearer scheme. No operation-specific scopes are declared in the OpenAPI document. Bearer authentication and endpoint authorization requirements still apply. ### Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `institution_id` | path | string | Yes | | | `cursor` | query | string \| null | No | | | `limit` | query | integer | No | Validation: minimum 1; maximum 100 | ### Request body This operation has no request body. ### Responses #### 200 Successful Response No fields declared in the current specification. #### 422 Validation Error | Field | Variant | Type | Required | Description | | --- | --- | --- | --- | --- | | `detail` | | ValidationError[] | No | | ### Request examples Illustrative only. Replace placeholders and keep management tokens on the server. #### cURL ```sh curl -X GET 'https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites' \ -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' ``` #### TypeScript (Node.js/server-side) ```typescript const response = await fetch('https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites', { method: 'GET', headers: { Authorization: `Bearer ${process.env.TAIFA_MANAGEMENT_TOKEN}` } }); const result = await response.json(); ``` #### Python ```python import os import requests response = requests.request( 'GET', 'https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites', headers={'Authorization': 'Bearer ' + os.environ['TAIFA_MANAGEMENT_TOKEN']} ) response.raise_for_status() ``` ### Response example No response example in the current specification. [Request and response examples](/docs/api/operations/listing_v1_institutions__institution_id__websites_get) ## POST /v1/institutions/{institution_id}/websites Create Create Authentication: bearer access token with audience `taifa-management`. Endpoint roles and eligibility are reviewed separately from the OpenAPI bearer scheme. No operation-specific scopes are declared in the OpenAPI document. Bearer authentication and endpoint authorization requirements still apply. ### Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `institution_id` | path | string | Yes | | | `idempotency-key` | header | string | Yes | | ### Request body #### application/json Required; Fields | Field | Variant | Type | Required | Description | | --- | --- | --- | --- | --- | | `name` | | string | Yes | Validation: min length 2; max length 200 | | `website` | | string | Yes | Validation: min length 8; max length 2048 | | `connector_kind` | | string | No | Validation: pattern ^(taifa_connector\|standard_oidc)$ | | `connector_product` | | string \| null | No | | | `preview_digest` | | string \| null | No | | | `owner_person_id` | | string | Yes | Validation: min length 1 | | `environment` | | string | Yes | Validation: pattern ^(staging\|production)$ | | `redirect_uris` | | string[] | No | Validation: max items 16 | | `post_logout_redirect_uris` | | string[] | No | Validation: max items 16 | | `backchannel_logout_uri` | | string \| null | No | | | `requested_scopes` | | string[] | Yes | Validation: min items 1; max items 3 | | `reason` | | string | Yes | Validation: min length 8; max length 500 | ### Responses #### 201 Successful Response No fields declared in the current specification. #### 422 Validation Error | Field | Variant | Type | Required | Description | | --- | --- | --- | --- | --- | | `detail` | | ValidationError[] | No | | ### Request examples Illustrative only. Replace placeholders and keep management tokens on the server. #### cURL ```sh curl -X POST 'https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites' \ -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ -H 'idempotency-key: REPLACE_WITH_IDEMPOTENCY_KEY' \ -H 'Content-Type: application/json' \ --data '{ "name": "REPLACE_WITH_NAME", "website": "REPLACE_WITH_WEBSITE", "owner_person_id": "REPLACE_WITH_OWNER_PERSON_ID", "environment": "REPLACE_WITH_ENVIRONMENT", "requested_scopes": [], "reason": "REPLACE_WITH_REASON" }' ``` #### TypeScript (Node.js/server-side) ```typescript const response = await fetch('https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites', { method: 'POST', headers: { Authorization: `Bearer ${process.env.TAIFA_MANAGEMENT_TOKEN}`, 'idempotency-key': 'REPLACE_WITH_IDEMPOTENCY_KEY', 'Content-Type': 'application/json' }, body: JSON.stringify({ "name": "REPLACE_WITH_NAME", "website": "REPLACE_WITH_WEBSITE", "owner_person_id": "REPLACE_WITH_OWNER_PERSON_ID", "environment": "REPLACE_WITH_ENVIRONMENT", "requested_scopes": [], "reason": "REPLACE_WITH_REASON" }) }); const result = await response.json(); ``` #### Python ```python import os import json import requests response = requests.request( 'POST', 'https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites', headers={'Authorization': 'Bearer ' + os.environ['TAIFA_MANAGEMENT_TOKEN'], 'idempotency-key': 'REPLACE_WITH_IDEMPOTENCY_KEY'}, json=json.loads('{"name":"REPLACE_WITH_NAME","website":"REPLACE_WITH_WEBSITE","owner_person_id":"REPLACE_WITH_OWNER_PERSON_ID","environment":"REPLACE_WITH_ENVIRONMENT","requested_scopes":[],"reason":"REPLACE_WITH_REASON"}') ) response.raise_for_status() ``` ### Response example No response example in the current specification. [Request and response examples](/docs/api/operations/create_v1_institutions__institution_id__websites_post) ## GET /v1/institutions/{institution_id}/websites/{project_id} Detail Detail Authentication: bearer access token with audience `taifa-management`. Endpoint roles and eligibility are reviewed separately from the OpenAPI bearer scheme. No operation-specific scopes are declared in the OpenAPI document. Bearer authentication and endpoint authorization requirements still apply. ### Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `institution_id` | path | string | Yes | | | `project_id` | path | string | Yes | | ### Request body This operation has no request body. ### Responses #### 200 Successful Response No fields declared in the current specification. #### 422 Validation Error | Field | Variant | Type | Required | Description | | --- | --- | --- | --- | --- | | `detail` | | ValidationError[] | No | | ### Request examples Illustrative only. Replace placeholders and keep management tokens on the server. #### cURL ```sh curl -X GET 'https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/REPLACE_WITH_PROJECT_ID' \ -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' ``` #### TypeScript (Node.js/server-side) ```typescript const response = await fetch('https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/REPLACE_WITH_PROJECT_ID', { method: 'GET', headers: { Authorization: `Bearer ${process.env.TAIFA_MANAGEMENT_TOKEN}` } }); const result = await response.json(); ``` #### Python ```python import os import requests response = requests.request( 'GET', 'https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/REPLACE_WITH_PROJECT_ID', headers={'Authorization': 'Bearer ' + os.environ['TAIFA_MANAGEMENT_TOKEN']} ) response.raise_for_status() ``` ### Response example No response example in the current specification. [Request and response examples](/docs/api/operations/detail_v1_institutions__institution_id__websites__project_id__get) ## POST /v1/institutions/{institution_id}/websites/{project_id}/resubmit Resubmit Resubmit Authentication: bearer access token with audience `taifa-management`. Endpoint roles and eligibility are reviewed separately from the OpenAPI bearer scheme. No operation-specific scopes are declared in the OpenAPI document. Bearer authentication and endpoint authorization requirements still apply. ### Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `institution_id` | path | string | Yes | | | `project_id` | path | string | Yes | | | `idempotency-key` | header | string | Yes | | ### Request body #### application/json Required; identity__organization_websites__Resubmit | Field | Variant | Type | Required | Description | | --- | --- | --- | --- | --- | | `name` | | string | Yes | Validation: min length 2; max length 200 | | `website` | | string | Yes | Validation: min length 8; max length 2048 | | `connector_kind` | | string | No | Validation: pattern ^(taifa_connector\|standard_oidc)$ | | `connector_product` | | string \| null | No | | | `preview_digest` | | string \| null | No | | | `owner_person_id` | | string | Yes | Validation: min length 1 | | `environment` | | string | Yes | Validation: pattern ^(staging\|production)$ | | `redirect_uris` | | string[] | No | Validation: max items 16 | | `post_logout_redirect_uris` | | string[] | No | Validation: max items 16 | | `backchannel_logout_uri` | | string \| null | No | | | `requested_scopes` | | string[] | Yes | Validation: min items 1; max items 3 | | `reason` | | string | Yes | Validation: min length 8; max length 500 | | `expected_version` | | integer | Yes | Validation: minimum 1 | ### Responses #### 200 Successful Response No fields declared in the current specification. #### 422 Validation Error | Field | Variant | Type | Required | Description | | --- | --- | --- | --- | --- | | `detail` | | ValidationError[] | No | | ### Request examples Illustrative only. Replace placeholders and keep management tokens on the server. #### cURL ```sh curl -X POST 'https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/REPLACE_WITH_PROJECT_ID/resubmit' \ -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ -H 'idempotency-key: REPLACE_WITH_IDEMPOTENCY_KEY' \ -H 'Content-Type: application/json' \ --data '{ "name": "REPLACE_WITH_NAME", "website": "REPLACE_WITH_WEBSITE", "owner_person_id": "REPLACE_WITH_OWNER_PERSON_ID", "environment": "REPLACE_WITH_ENVIRONMENT", "requested_scopes": [], "reason": "REPLACE_WITH_REASON", "expected_version": 0 }' ``` #### TypeScript (Node.js/server-side) ```typescript const response = await fetch('https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/REPLACE_WITH_PROJECT_ID/resubmit', { method: 'POST', headers: { Authorization: `Bearer ${process.env.TAIFA_MANAGEMENT_TOKEN}`, 'idempotency-key': 'REPLACE_WITH_IDEMPOTENCY_KEY', 'Content-Type': 'application/json' }, body: JSON.stringify({ "name": "REPLACE_WITH_NAME", "website": "REPLACE_WITH_WEBSITE", "owner_person_id": "REPLACE_WITH_OWNER_PERSON_ID", "environment": "REPLACE_WITH_ENVIRONMENT", "requested_scopes": [], "reason": "REPLACE_WITH_REASON", "expected_version": 0 }) }); const result = await response.json(); ``` #### Python ```python import os import json import requests response = requests.request( 'POST', 'https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/REPLACE_WITH_PROJECT_ID/resubmit', headers={'Authorization': 'Bearer ' + os.environ['TAIFA_MANAGEMENT_TOKEN'], 'idempotency-key': 'REPLACE_WITH_IDEMPOTENCY_KEY'}, json=json.loads('{"name":"REPLACE_WITH_NAME","website":"REPLACE_WITH_WEBSITE","owner_person_id":"REPLACE_WITH_OWNER_PERSON_ID","environment":"REPLACE_WITH_ENVIRONMENT","requested_scopes":[],"reason":"REPLACE_WITH_REASON","expected_version":0}') ) response.raise_for_status() ``` ### Response example No response example in the current specification. [Request and response examples](/docs/api/operations/resubmit_v1_institutions__institution_id__websites__project_id__resubmit_post) ## POST /v1/institutions/{institution_id}/websites/{project_id}/withdraw Withdraw Withdraw Authentication: bearer access token with audience `taifa-management`. Endpoint roles and eligibility are reviewed separately from the OpenAPI bearer scheme. No operation-specific scopes are declared in the OpenAPI document. Bearer authentication and endpoint authorization requirements still apply. ### Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `institution_id` | path | string | Yes | | | `project_id` | path | string | Yes | | | `idempotency-key` | header | string | Yes | | ### Request body #### application/json Required; Transition | Field | Variant | Type | Required | Description | | --- | --- | --- | --- | --- | | `expected_version` | | integer | Yes | Validation: minimum 1 | | `reason` | | string | Yes | Validation: min length 8; max length 500 | ### Responses #### 200 Successful Response No fields declared in the current specification. #### 422 Validation Error | Field | Variant | Type | Required | Description | | --- | --- | --- | --- | --- | | `detail` | | ValidationError[] | No | | ### Request examples Illustrative only. Replace placeholders and keep management tokens on the server. #### cURL ```sh curl -X POST 'https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/REPLACE_WITH_PROJECT_ID/withdraw' \ -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ -H 'idempotency-key: REPLACE_WITH_IDEMPOTENCY_KEY' \ -H 'Content-Type: application/json' \ --data '{ "expected_version": 0, "reason": "REPLACE_WITH_REASON" }' ``` #### TypeScript (Node.js/server-side) ```typescript const response = await fetch('https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/REPLACE_WITH_PROJECT_ID/withdraw', { method: 'POST', headers: { Authorization: `Bearer ${process.env.TAIFA_MANAGEMENT_TOKEN}`, 'idempotency-key': 'REPLACE_WITH_IDEMPOTENCY_KEY', 'Content-Type': 'application/json' }, body: JSON.stringify({ "expected_version": 0, "reason": "REPLACE_WITH_REASON" }) }); const result = await response.json(); ``` #### Python ```python import os import json import requests response = requests.request( 'POST', 'https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/REPLACE_WITH_PROJECT_ID/withdraw', headers={'Authorization': 'Bearer ' + os.environ['TAIFA_MANAGEMENT_TOKEN'], 'idempotency-key': 'REPLACE_WITH_IDEMPOTENCY_KEY'}, json=json.loads('{"expected_version":0,"reason":"REPLACE_WITH_REASON"}') ) response.raise_for_status() ``` ### Response example No response example in the current specification. [Request and response examples](/docs/api/operations/withdraw_v1_institutions__institution_id__websites__project_id__withdraw_post) ## POST /v1/institutions/{institution_id}/websites/{project_id}/request-changes Request Changes Request Changes Authentication: bearer access token with audience `taifa-management`. Endpoint roles and eligibility are reviewed separately from the OpenAPI bearer scheme. No operation-specific scopes are declared in the OpenAPI document. Bearer authentication and endpoint authorization requirements still apply. ### Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `institution_id` | path | string | Yes | | | `project_id` | path | string | Yes | | | `idempotency-key` | header | string | Yes | | ### Request body #### application/json Required; Decision | Field | Variant | Type | Required | Description | | --- | --- | --- | --- | --- | | `expected_version` | | integer | Yes | Validation: minimum 1 | | `reason` | | string | Yes | Validation: min length 8; max length 500 | | `decision_reason` | | string | Yes | Validation: min length 8; max length 500 | ### Responses #### 200 Successful Response No fields declared in the current specification. #### 422 Validation Error | Field | Variant | Type | Required | Description | | --- | --- | --- | --- | --- | | `detail` | | ValidationError[] | No | | ### Request examples Illustrative only. Replace placeholders and keep management tokens on the server. #### cURL ```sh curl -X POST 'https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/REPLACE_WITH_PROJECT_ID/request-changes' \ -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ -H 'idempotency-key: REPLACE_WITH_IDEMPOTENCY_KEY' \ -H 'Content-Type: application/json' \ --data '{ "expected_version": 0, "reason": "REPLACE_WITH_REASON", "decision_reason": "REPLACE_WITH_DECISION_REASON" }' ``` #### TypeScript (Node.js/server-side) ```typescript const response = await fetch('https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/REPLACE_WITH_PROJECT_ID/request-changes', { method: 'POST', headers: { Authorization: `Bearer ${process.env.TAIFA_MANAGEMENT_TOKEN}`, 'idempotency-key': 'REPLACE_WITH_IDEMPOTENCY_KEY', 'Content-Type': 'application/json' }, body: JSON.stringify({ "expected_version": 0, "reason": "REPLACE_WITH_REASON", "decision_reason": "REPLACE_WITH_DECISION_REASON" }) }); const result = await response.json(); ``` #### Python ```python import os import json import requests response = requests.request( 'POST', 'https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/REPLACE_WITH_PROJECT_ID/request-changes', headers={'Authorization': 'Bearer ' + os.environ['TAIFA_MANAGEMENT_TOKEN'], 'idempotency-key': 'REPLACE_WITH_IDEMPOTENCY_KEY'}, json=json.loads('{"expected_version":0,"reason":"REPLACE_WITH_REASON","decision_reason":"REPLACE_WITH_DECISION_REASON"}') ) response.raise_for_status() ``` ### Response example No response example in the current specification. [Request and response examples](/docs/api/operations/request_changes_v1_institutions__institution_id__websites__project_id__request_changes_post) ## POST /v1/institutions/{institution_id}/websites/{project_id}/reject Reject Reject Authentication: bearer access token with audience `taifa-management`. Endpoint roles and eligibility are reviewed separately from the OpenAPI bearer scheme. No operation-specific scopes are declared in the OpenAPI document. Bearer authentication and endpoint authorization requirements still apply. ### Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `institution_id` | path | string | Yes | | | `project_id` | path | string | Yes | | | `idempotency-key` | header | string | Yes | | ### Request body #### application/json Required; Decision | Field | Variant | Type | Required | Description | | --- | --- | --- | --- | --- | | `expected_version` | | integer | Yes | Validation: minimum 1 | | `reason` | | string | Yes | Validation: min length 8; max length 500 | | `decision_reason` | | string | Yes | Validation: min length 8; max length 500 | ### Responses #### 200 Successful Response No fields declared in the current specification. #### 422 Validation Error | Field | Variant | Type | Required | Description | | --- | --- | --- | --- | --- | | `detail` | | ValidationError[] | No | | ### Request examples Illustrative only. Replace placeholders and keep management tokens on the server. #### cURL ```sh curl -X POST 'https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/REPLACE_WITH_PROJECT_ID/reject' \ -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ -H 'idempotency-key: REPLACE_WITH_IDEMPOTENCY_KEY' \ -H 'Content-Type: application/json' \ --data '{ "expected_version": 0, "reason": "REPLACE_WITH_REASON", "decision_reason": "REPLACE_WITH_DECISION_REASON" }' ``` #### TypeScript (Node.js/server-side) ```typescript const response = await fetch('https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/REPLACE_WITH_PROJECT_ID/reject', { method: 'POST', headers: { Authorization: `Bearer ${process.env.TAIFA_MANAGEMENT_TOKEN}`, 'idempotency-key': 'REPLACE_WITH_IDEMPOTENCY_KEY', 'Content-Type': 'application/json' }, body: JSON.stringify({ "expected_version": 0, "reason": "REPLACE_WITH_REASON", "decision_reason": "REPLACE_WITH_DECISION_REASON" }) }); const result = await response.json(); ``` #### Python ```python import os import json import requests response = requests.request( 'POST', 'https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/REPLACE_WITH_PROJECT_ID/reject', headers={'Authorization': 'Bearer ' + os.environ['TAIFA_MANAGEMENT_TOKEN'], 'idempotency-key': 'REPLACE_WITH_IDEMPOTENCY_KEY'}, json=json.loads('{"expected_version":0,"reason":"REPLACE_WITH_REASON","decision_reason":"REPLACE_WITH_DECISION_REASON"}') ) response.raise_for_status() ``` ### Response example No response example in the current specification. [Request and response examples](/docs/api/operations/reject_v1_institutions__institution_id__websites__project_id__reject_post) ## POST /v1/institutions/{institution_id}/websites/{project_id}/approve Approve Approve Authentication: bearer access token with audience `taifa-management`. Endpoint roles and eligibility are reviewed separately from the OpenAPI bearer scheme. No operation-specific scopes are declared in the OpenAPI document. Bearer authentication and endpoint authorization requirements still apply. ### Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `institution_id` | path | string | Yes | | | `project_id` | path | string | Yes | | | `idempotency-key` | header | string | Yes | | ### Request body #### application/json Required; Transition | Field | Variant | Type | Required | Description | | --- | --- | --- | --- | --- | | `expected_version` | | integer | Yes | Validation: minimum 1 | | `reason` | | string | Yes | Validation: min length 8; max length 500 | ### Responses #### 200 Successful Response No fields declared in the current specification. #### 422 Validation Error | Field | Variant | Type | Required | Description | | --- | --- | --- | --- | --- | | `detail` | | ValidationError[] | No | | ### Request examples Illustrative only. Replace placeholders and keep management tokens on the server. #### cURL ```sh curl -X POST 'https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/REPLACE_WITH_PROJECT_ID/approve' \ -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ -H 'idempotency-key: REPLACE_WITH_IDEMPOTENCY_KEY' \ -H 'Content-Type: application/json' \ --data '{ "expected_version": 0, "reason": "REPLACE_WITH_REASON" }' ``` #### TypeScript (Node.js/server-side) ```typescript const response = await fetch('https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/REPLACE_WITH_PROJECT_ID/approve', { method: 'POST', headers: { Authorization: `Bearer ${process.env.TAIFA_MANAGEMENT_TOKEN}`, 'idempotency-key': 'REPLACE_WITH_IDEMPOTENCY_KEY', 'Content-Type': 'application/json' }, body: JSON.stringify({ "expected_version": 0, "reason": "REPLACE_WITH_REASON" }) }); const result = await response.json(); ``` #### Python ```python import os import json import requests response = requests.request( 'POST', 'https://YOUR_IDENTITY_HOST/v1/institutions/REPLACE_WITH_INSTITUTION_ID/websites/REPLACE_WITH_PROJECT_ID/approve', headers={'Authorization': 'Bearer ' + os.environ['TAIFA_MANAGEMENT_TOKEN'], 'idempotency-key': 'REPLACE_WITH_IDEMPOTENCY_KEY'}, json=json.loads('{"expected_version":0,"reason":"REPLACE_WITH_REASON"}') ) response.raise_for_status() ``` ### Response example No response example in the current specification. [Request and response examples](/docs/api/operations/approve_v1_institutions__institution_id__websites__project_id__approve_post) ## GET /v1/projects/{project_id}/website-configuration Approved Website Configuration Current owners and owning Admins can read the exact approved client inputs. Authentication: bearer access token with audience `taifa-management`. Endpoint roles and eligibility are reviewed separately from the OpenAPI bearer scheme. No operation-specific scopes are declared in the OpenAPI document. Bearer authentication and endpoint authorization requirements still apply. ### Parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `project_id` | path | string | Yes | | ### Request body This operation has no request body. ### Responses #### 200 Successful Response | Field | Variant | Type | Required | Description | | --- | --- | --- | --- | --- | | `project_id` | | string | Yes | | | `institution_id` | | string | Yes | | | `proposal_id` | | string | Yes | | | `version` | | integer | Yes | | | `name` | | string | Yes | | | `website` | | string | Yes | | | `owner_person_id` | | string | Yes | | | `environment` | | string | Yes | | | `redirect_uris` | | string[] | Yes | | | `post_logout_redirect_uris` | | string[] | Yes | | | `backchannel_logout_uri` | | string \| null | Yes | | | `requested_scopes` | | string[] | Yes | | | `connector_kind` | | string \| null | No | | | `site_origin` | | string \| null | No | | | `client_slug` | | string \| null | No | | | `client_plan` | | object \| null | No | | | `plan_version` | | integer \| null | No | | | `plan_digest` | | string \| null | No | | #### 422 Validation Error | Field | Variant | Type | Required | Description | | --- | --- | --- | --- | --- | | `detail` | | ValidationError[] | No | | ### Request examples Illustrative only. Replace placeholders and keep management tokens on the server. #### cURL ```sh curl -X GET 'https://YOUR_IDENTITY_HOST/v1/projects/REPLACE_WITH_PROJECT_ID/website-configuration' \ -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' ``` #### TypeScript (Node.js/server-side) ```typescript const response = await fetch('https://YOUR_IDENTITY_HOST/v1/projects/REPLACE_WITH_PROJECT_ID/website-configuration', { method: 'GET', headers: { Authorization: `Bearer ${process.env.TAIFA_MANAGEMENT_TOKEN}` } }); const result = await response.json(); ``` #### Python ```python import os import requests response = requests.request( 'GET', 'https://YOUR_IDENTITY_HOST/v1/projects/REPLACE_WITH_PROJECT_ID/website-configuration', headers={'Authorization': 'Bearer ' + os.environ['TAIFA_MANAGEMENT_TOKEN']} ) response.raise_for_status() ``` ### Response example No response example in the current specification. [Request and response examples](/docs/api/operations/approved_website_configuration_v1_projects__project_id__website_configuration_get)