> For the complete documentation index, see [llms.txt](https://docs.toolkit.equs.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.toolkit.equs.ai/api/control-api/tenant.md).

# Tenant

## Get My Claims Integration

> Retrieves the claims integration configuration for the calling Tenant

```json
{"openapi":"3.0.0","info":{"title":"EqusDTK Control API Documentation","version":"0.1.2"},"tags":[{"name":"Tenant","description":""}],"security":[{"tenant":[]}],"components":{"securitySchemes":{"tenant":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Tenant. Token of a Tenant machine client or of a Tenant portal user, carrying the `tenantId` claim. Authorize one bearer scheme at a time."}},"schemas":{"GetTenantClaimsIntegrationResponse":{"type":"object","properties":{"uuid":{"type":"string","description":"Claims integration unique ID"},"client":{"description":"OAuth client credentials used to authenticate the integration calls.","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationClientResponse"}]},"webhook":{"description":"Endpoints of the tenant's service notified about claim changes.","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationWebhookResponse"}]},"attributeProvider":{"description":"Endpoint of the tenant's service queried for claims during issuance.","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationAttributeProviderResponse"}]},"createdAt":{"format":"date-time","type":"string","description":"Date and time the claims integration was created."},"updatedAt":{"format":"date-time","type":"string","description":"Date and time the claims integration was last updated."}},"required":["uuid","client","createdAt","updatedAt"]},"ClaimsIntegrationClientResponse":{"type":"object","properties":{"tokenUrl":{"type":"string","description":"Token endpoint used to obtain an access token for the integration calls."},"clientId":{"type":"string","description":"Client unique ID"},"clientSecretSet":{"type":"boolean","description":"Whether a client secret is stored for this integration."}},"required":["tokenUrl","clientId","clientSecretSet"]},"ClaimsIntegrationWebhookResponse":{"type":"object","properties":{"issuedClaimsUrl":{"type":"string","description":"URL notified when new claims are issued."},"revokedClaimsUrl":{"type":"string","description":"URL notified when claims are revoked."}},"required":["issuedClaimsUrl","revokedClaimsUrl"]},"ClaimsIntegrationAttributeProviderResponse":{"type":"object","properties":{"endpointUrl":{"type":"string","description":"URL called during issuance to fetch the claims of a subject."}},"required":["endpointUrl"]}}},"paths":{"/api/v1/tenants/me/claims-integration":{"get":{"description":"Retrieves the claims integration configuration for the calling Tenant","operationId":"TenantController_getMyClaimsIntegration_api/v1","parameters":[],"responses":{"200":{"description":"When the Tenant claims integration is retrieved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTenantClaimsIntegrationResponse"}}}},"404":{"description":"- When Tenant identified by id does not exist.\n- When no claims integration is configured for this Tenant."}},"summary":"Get My Claims Integration","tags":["Tenant"]}}}}
```

## Upsert My Claims Integration

> Creates or replaces the claims integration for the calling Tenant — the claims webhooks and the Attribute Provider, under one OAuth2 client. Replaces rather than merges: an omitted leg is removed. One integration serves every issuer this Tenant owns.

```json
{"openapi":"3.0.0","info":{"title":"EqusDTK Control API Documentation","version":"0.1.2"},"tags":[{"name":"Tenant","description":""}],"security":[{"tenant":[]}],"components":{"securitySchemes":{"tenant":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Tenant. Token of a Tenant machine client or of a Tenant portal user, carrying the `tenantId` claim. Authorize one bearer scheme at a time."}},"schemas":{"UpdateTenantClaimsIntegrationRequest":{"type":"object","properties":{"client":{"description":"OAuth client credentials used to authenticate the integration calls.","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationClient"}]},"webhook":{"description":"Endpoints of the tenant's service notified about claim changes.","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationWebhook"}]},"attributeProvider":{"description":"Endpoint of the tenant's service queried for claims during issuance.","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationAttributeProvider"}]}},"required":["client"]},"ClaimsIntegrationClient":{"type":"object","properties":{"tokenUrl":{"type":"string","description":"Token endpoint used to obtain an access token for the integration calls."},"clientId":{"type":"string","description":"Client unique ID"},"clientSecret":{"type":"string","description":"OAuth client secret used to authenticate the integration calls.","writeOnly":true}},"required":["tokenUrl","clientId","clientSecret"]},"ClaimsIntegrationWebhook":{"type":"object","properties":{"issuedClaimsUrl":{"type":"string","description":"URL notified when new claims are issued."},"revokedClaimsUrl":{"type":"string","description":"URL notified when claims are revoked."}},"required":["issuedClaimsUrl","revokedClaimsUrl"]},"ClaimsIntegrationAttributeProvider":{"type":"object","properties":{"endpointUrl":{"type":"string","description":"URL called during issuance to fetch the claims of a subject."}},"required":["endpointUrl"]},"UpdateTenantClaimsIntegrationResponse":{"type":"object","properties":{"uuid":{"type":"string","description":"Claims integration unique ID"},"client":{"description":"OAuth client credentials used to authenticate the integration calls.","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationClientResponse"}]},"webhook":{"description":"Endpoints of the tenant's service notified about claim changes.","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationWebhookResponse"}]},"attributeProvider":{"description":"Endpoint of the tenant's service queried for claims during issuance.","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationAttributeProviderResponse"}]},"createdAt":{"format":"date-time","type":"string","description":"Date and time the claims integration was created."},"updatedAt":{"format":"date-time","type":"string","description":"Date and time the claims integration was last updated."}},"required":["uuid","client","createdAt","updatedAt"]},"ClaimsIntegrationClientResponse":{"type":"object","properties":{"tokenUrl":{"type":"string","description":"Token endpoint used to obtain an access token for the integration calls."},"clientId":{"type":"string","description":"Client unique ID"},"clientSecretSet":{"type":"boolean","description":"Whether a client secret is stored for this integration."}},"required":["tokenUrl","clientId","clientSecretSet"]},"ClaimsIntegrationWebhookResponse":{"type":"object","properties":{"issuedClaimsUrl":{"type":"string","description":"URL notified when new claims are issued."},"revokedClaimsUrl":{"type":"string","description":"URL notified when claims are revoked."}},"required":["issuedClaimsUrl","revokedClaimsUrl"]},"ClaimsIntegrationAttributeProviderResponse":{"type":"object","properties":{"endpointUrl":{"type":"string","description":"URL called during issuance to fetch the claims of a subject."}},"required":["endpointUrl"]}}},"paths":{"/api/v1/tenants/me/claims-integration":{"put":{"description":"Creates or replaces the claims integration for the calling Tenant — the claims webhooks and the Attribute Provider, under one OAuth2 client. Replaces rather than merges: an omitted leg is removed. One integration serves every issuer this Tenant owns.","operationId":"TenantController_upsertMyClaimsIntegration_api/v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTenantClaimsIntegrationRequest"}}}},"responses":{"200":{"description":"When the Tenant claims integration is created or replaced.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTenantClaimsIntegrationResponse"}}}},"400":{"description":"When neither webhook nor attributeProvider is provided, when the webhook leg is sent without the client block, or when the Attribute Provider URL is not a public https URL."},"404":{"description":"When Tenant identified by id does not exist."}},"summary":"Upsert My Claims Integration","tags":["Tenant"]}}}}
```

## Delete My Claims Integration

> Removes the claims integration configuration for the calling Tenant

```json
{"openapi":"3.0.0","info":{"title":"EqusDTK Control API Documentation","version":"0.1.2"},"tags":[{"name":"Tenant","description":""}],"security":[{"tenant":[]}],"components":{"securitySchemes":{"tenant":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Tenant. Token of a Tenant machine client or of a Tenant portal user, carrying the `tenantId` claim. Authorize one bearer scheme at a time."}}},"paths":{"/api/v1/tenants/me/claims-integration":{"delete":{"description":"Removes the claims integration configuration for the calling Tenant","operationId":"TenantController_deleteMyClaimsIntegration_api/v1","parameters":[],"responses":{"204":{"description":"When the Tenant claims integration is deleted."},"404":{"description":"- When Tenant identified by id does not exist.\n- When no claims integration is configured for this Tenant."}},"summary":"Delete My Claims Integration","tags":["Tenant"]}}}}
```

## Get My Allowed Origins

> Retrieves the origins the calling Tenant may embed UI components on, each with its review status

```json
{"openapi":"3.0.0","info":{"title":"EqusDTK Control API Documentation","version":"0.1.2"},"tags":[{"name":"Tenant","description":""}],"security":[{"tenant":[]}],"components":{"securitySchemes":{"tenant":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Tenant. Token of a Tenant machine client or of a Tenant portal user, carrying the `tenantId` claim. Authorize one bearer scheme at a time."}},"schemas":{"GetMyAllowedOriginsResponse":{"type":"object","properties":{"origins":{"description":"Origins the Tenant may embed UI components on, each with its review status.","type":"array","items":{"$ref":"#/components/schemas/AllowedOriginResponse"}}},"required":["origins"]},"AllowedOriginResponse":{"type":"object","properties":{"id":{"type":"string","description":"Allowed origin unique ID"},"origin":{"type":"string","description":"Origin embeddable UI components may be served to."},"status":{"type":"string","description":"Review status of the origin. Pending while the Service Provider reviews it, which includes adding it to the Content-Security-Policy configuration; active once approved, when it is served to embeddable components; rejected when refused.","enum":["pending","active","rejected"]}},"required":["id","origin","status"]}}},"paths":{"/api/v1/tenants/me/allowed-origins":{"get":{"description":"Retrieves the origins the calling Tenant may embed UI components on, each with its review status","operationId":"TenantController_getMyAllowedOrigins_api/v1","parameters":[],"responses":{"200":{"description":"When the allowed origins of the calling Tenant are retrieved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetMyAllowedOriginsResponse"}}}},"404":{"description":"When Tenant identified by id does not exist."}},"summary":"Get My Allowed Origins","tags":["Tenant"]}}}}
```

## Replace My Allowed Origins

> Omitted origins are removed, new ones are added as pending, and existing ones keep their status

```json
{"openapi":"3.0.0","info":{"title":"EqusDTK Control API Documentation","version":"0.1.2"},"tags":[{"name":"Tenant","description":""}],"security":[{"tenant":[]}],"components":{"securitySchemes":{"tenant":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Tenant. Token of a Tenant machine client or of a Tenant portal user, carrying the `tenantId` claim. Authorize one bearer scheme at a time."}},"schemas":{"UpdateMyAllowedOriginsRequest":{"type":"object","properties":{"origins":{"description":"The complete list of origins the Tenant wants. Omitted origins are removed and new ones are submitted for review; order carries no meaning.","type":"array","items":{"type":"string"}}},"required":["origins"]},"UpdateMyAllowedOriginsResponse":{"type":"object","properties":{"origins":{"description":"Origins the Tenant may embed UI components on, each with its review status.","type":"array","items":{"$ref":"#/components/schemas/AllowedOriginResponse"}}},"required":["origins"]},"AllowedOriginResponse":{"type":"object","properties":{"id":{"type":"string","description":"Allowed origin unique ID"},"origin":{"type":"string","description":"Origin embeddable UI components may be served to."},"status":{"type":"string","description":"Review status of the origin. Pending while the Service Provider reviews it, which includes adding it to the Content-Security-Policy configuration; active once approved, when it is served to embeddable components; rejected when refused.","enum":["pending","active","rejected"]}},"required":["id","origin","status"]}}},"paths":{"/api/v1/tenants/me/allowed-origins":{"put":{"description":"Omitted origins are removed, new ones are added as pending, and existing ones keep their status","operationId":"TenantController_replaceMyAllowedOrigins_api/v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMyAllowedOriginsRequest"}}}},"responses":{"200":{"description":"When the allowed origins of the calling Tenant are replaced.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMyAllowedOriginsResponse"}}}},"404":{"description":"When Tenant identified by id does not exist."},"409":{"description":"- When any allowed origin is still under review by the Service Provider. The whole list is frozen until every origin has been decided.\n- When the submitted list still contains an origin the Service Provider rejected. Drop it from the list to clear it; only the Service Provider can reinstate it. The response names the offending origins."}},"summary":"Replace My Allowed Origins","tags":["Tenant"]}}}}
```

## Get Tenants

> Get paginated Tenants

```json
{"openapi":"3.0.0","info":{"title":"EqusDTK Control API Documentation","version":"0.1.2"},"tags":[{"name":"Tenant","description":""}],"security":[{"sp":[]}],"components":{"securitySchemes":{"sp":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Service Provider. Token of the Service Provider client in the `agents` realm, with no `tenantId` claim. Authorize one bearer scheme at a time."}},"schemas":{"GetTenantsResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/GetTenantDataResponse"}},"pagination":{"$ref":"#/components/schemas/PaginationData"}},"required":["items","pagination"]},"GetTenantDataResponse":{"type":"object","properties":{"id":{"type":"string","description":"Tenant unique ID"},"name":{"type":"string","description":"Display name of the tenant."},"slug":{"type":"string","description":"URL-friendly alias of the tenant, generated from its name unless supplied."},"email":{"type":"string","description":"Email address of the operator who owns the tenant."},"environment":{"type":"string","description":"Environment the tenant operates in.","enum":["sandbox","production"]},"orgId":{"type":"string","description":"Keycloak organization unique ID"},"accessExpiresAt":{"type":"object","description":"Tenant's expiration date. Null when its access never expires.","nullable":true},"intermediateRetentionTTL":{"type":"object","description":"TTL for retention data in intermediate state."},"terminalRetentionTTL":{"type":"object","description":"TTL for retention data in terminal state."},"hardDeleteRetentionTTL":{"type":"object","description":"TTL for hard delete retention."},"brandingMetadata":{"description":"Tenant branding metadata used to customize Embedded UI components.","allOf":[{"$ref":"#/components/schemas/TenantBrandingMetadata"}]},"maxIssuers":{"type":"number","description":"Maximum number of Issuers the tenant may own."},"maxVerifiers":{"type":"number","description":"Maximum number of Verifiers the tenant may own."},"createdAt":{"format":"date-time","type":"string","description":"Date and time the tenant was created."}},"required":["id","name","slug","email","environment","orgId","maxIssuers","maxVerifiers","createdAt"]},"TenantBrandingMetadata":{"type":"object","properties":{"primaryColor":{"type":"string","maxLength":64,"description":"Primary brand color used for CTAs and key UI elements."},"primaryColorHover":{"type":"string","maxLength":64,"description":"Primary brand color applied on hover state."},"primaryColorPressed":{"type":"string","maxLength":64,"description":"Primary brand color applied on pressed/active state."},"primaryOpacity08":{"type":"string","maxLength":64,"description":"Primary brand color at 8% opacity, used for subtle backgrounds."},"primaryOpacity16":{"type":"string","maxLength":64,"description":"Primary brand color at 16% opacity, used for subtle backgrounds."},"primaryOpacity20":{"type":"string","maxLength":64,"description":"Primary brand color at 20% opacity, used for subtle backgrounds."},"primaryDisabled":{"type":"string","maxLength":64,"description":"Primary brand color applied to disabled UI elements."},"darkOpacity05":{"type":"string","maxLength":64,"description":"Dark overlay color at 5% opacity."},"darkOpacity08":{"type":"string","maxLength":64,"description":"Dark overlay color at 8% opacity."},"darkOpacity12":{"type":"string","maxLength":64,"description":"Dark overlay color at 12% opacity."},"darkDivider":{"type":"string","maxLength":64,"description":"Dark color used for borders and dividers."},"darkOutlineMedium":{"type":"string","maxLength":64,"description":"Dark medium-emphasis color used for outlines."},"darkOutlineHigh":{"type":"string","maxLength":64,"description":"Dark high-emphasis color used for outlines."},"onSurfaceDarkHighEmphasis":{"type":"string","maxLength":64,"description":"Dark high-emphasis text/icon color rendered on light surfaces."},"onSurfaceDarkMediumEmphasis":{"type":"string","maxLength":64,"description":"Dark medium-emphasis text/icon color rendered on light surfaces."},"onSurfaceDarkDisabled":{"type":"string","maxLength":64,"description":"Dark disabled text/icon color rendered on light surfaces."},"onSurfaceLightHighEmphasis":{"type":"string","maxLength":64,"description":"Light high-emphasis text/icon color rendered on dark surfaces."},"onSurfaceLightMediumEmphasis":{"type":"string","maxLength":64,"description":"Light medium-emphasis text/icon color rendered on dark surfaces."},"onSurfaceLightDisabled":{"type":"string","maxLength":64,"description":"Light disabled text/icon color rendered on dark surfaces."},"textOnSurface":{"type":"string","maxLength":64,"description":"Default text color rendered on top of a surface background."},"surfaceNull":{"type":"string","maxLength":64,"description":"Base surface color with no elevation applied."},"cardBg":{"type":"string","maxLength":64,"description":"Background color used for card components."},"cardStroke":{"type":"string","maxLength":64,"description":"Border/stroke color used around card components."},"surface1":{"type":"string","maxLength":64,"description":"Elevation level 1 surface color."},"surface2":{"type":"string","maxLength":64,"description":"Elevation level 2 surface color."},"surface3":{"type":"string","maxLength":64,"description":"Elevation level 3 surface color."},"surface4":{"type":"string","maxLength":64,"description":"Elevation level 4 surface color."},"surface5":{"type":"string","maxLength":64,"description":"Elevation level 5 surface color."},"surfaceGrey1":{"type":"string","maxLength":64,"description":"Grey surface tone, level 1."},"surfaceGrey2":{"type":"string","maxLength":64,"description":"Grey surface tone, level 2."},"surfaceGrey3":{"type":"string","maxLength":64,"description":"Grey surface tone, level 3."},"surfaceGrey4":{"type":"string","maxLength":64,"description":"Grey surface tone, level 4."},"surfaceGrey5":{"type":"string","maxLength":64,"description":"Grey surface tone, level 5."},"shutterDark70":{"type":"string","maxLength":64,"description":"Dark modal/overlay shutter color at 70% opacity."},"shutterDark30":{"type":"string","maxLength":64,"description":"Dark modal/overlay shutter color at 30% opacity."},"shutterLight32":{"type":"string","maxLength":64,"description":"Light modal/overlay shutter color at 32% opacity."},"shutterLight75":{"type":"string","maxLength":64,"description":"Light modal/overlay shutter color at 75% opacity."},"linkColor":{"type":"string","maxLength":64,"description":"Color applied to hyperlinks."},"widgetColor":{"type":"string","maxLength":64,"description":"Base color used for embedded widget backgrounds."},"widgetColorHover":{"type":"string","maxLength":64,"description":"Embedded widget accent color applied on hover state."},"widgetColorPressed":{"type":"string","maxLength":64,"description":"Embedded widget accent color applied on pressed state."},"notificationColor":{"type":"string","maxLength":64,"description":"Base color used to indicate error states."},"notificationHover":{"type":"string","maxLength":64,"description":"Notification color applied on hover state."},"notificationPressed":{"type":"string","maxLength":64,"description":"Notification color applied on pressed state."},"notificationOpacity08":{"type":"string","maxLength":64,"description":"Notification color at 8% opacity, used for subtle backgrounds."},"notificationOpacity12":{"type":"string","maxLength":64,"description":"Notification color at 12% opacity, used for subtle backgrounds."},"notificationOpacity16":{"type":"string","maxLength":64,"description":"Notification color at 16% opacity, used for subtle backgrounds."},"warningColor":{"type":"string","maxLength":64,"description":"Base color used to indicate warning states."},"warningOpacity07":{"type":"string","maxLength":64,"description":"Warning color at 7% opacity, used for subtle backgrounds."},"warningOpacity12":{"type":"string","maxLength":64,"description":"Warning color at 12% opacity, used for subtle backgrounds."},"warningOpacity16":{"type":"string","maxLength":64,"description":"Warning color at 16% opacity, used for subtle backgrounds."},"successColor":{"type":"string","maxLength":64,"description":"Base color used to indicate success states."},"successHover":{"type":"string","maxLength":64,"description":"Success color applied on hover state."},"successPressed":{"type":"string","maxLength":64,"description":"Success color applied on pressed state."},"successOpacity07":{"type":"string","maxLength":64,"description":"Success color at 7% opacity, used for subtle backgrounds."},"successOpacity12":{"type":"string","maxLength":64,"description":"Success color at 12% opacity, used for subtle backgrounds."},"successOpacity16":{"type":"string","maxLength":64,"description":"Success color at 16% opacity, used for subtle backgrounds."},"secondaryColor":{"type":"string","maxLength":64,"description":"Secondary brand color used for supporting UI elements."},"accentColor":{"type":"string","maxLength":64,"description":"Accent color used to highlight key interactive elements."},"fontFamily":{"type":"string","maxLength":100,"description":"Primary font family used across the tenant's branded UI."},"fontFamilyLight":{"type":"string","maxLength":100,"description":"Light-weight variant of the font family, used for secondary text."},"fontFamilyHeading":{"type":"string","maxLength":100,"description":"Font family used for headings."},"isDark":{"type":"boolean","description":"Indicates whether the tenant's branding uses a dark theme."}}},"PaginationData":{"type":"object","properties":{"page":{"type":"number"},"limit":{"type":"number"}},"required":["page","limit"]}}},"paths":{"/api/v1/tenants":{"get":{"description":"Get paginated Tenants","operationId":"TenantController_getTenants_api/v1","parameters":[{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"default":10,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Field to sort by","schema":{"default":"date","type":"string","enum":["date"]}},{"name":"order","required":false,"in":"query","description":"Sort direction","schema":{"default":"desc","type":"string","enum":["asc","desc"]}},{"name":"email","required":false,"in":"query","description":"Returns only the tenant owned by this email address.","schema":{"type":"string"}},{"name":"slug","required":false,"in":"query","description":"Returns only the tenant carrying this slug.","schema":{"type":"string"}}],"responses":{"200":{"description":"When Tenants are retrieved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTenantsResponse"}}}}},"summary":"Get Tenants","tags":["Tenant"]}}}}
```

## Create Tenant

> Creates a new Tenant with the provided id

```json
{"openapi":"3.0.0","info":{"title":"EqusDTK Control API Documentation","version":"0.1.2"},"tags":[{"name":"Tenant","description":""}],"security":[{"sp":[]}],"components":{"securitySchemes":{"sp":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Service Provider. Token of the Service Provider client in the `agents` realm, with no `tenantId` claim. Authorize one bearer scheme at a time."}},"schemas":{"CreateTenantRequest":{"type":"object","properties":{"name":{"type":"string","description":"Display name of the tenant."},"brandingMetadata":{"description":"Tenant branding metadata used to customize Embedded UI components.","allOf":[{"$ref":"#/components/schemas/TenantBrandingMetadata"}]},"accessExpiresAt":{"type":"object","description":"Tenant's expiration date. Send null so it never expires; omit to leave unchanged.","nullable":true},"maxIssuers":{"type":"number","description":"Maximum number of Issuers the tenant may own."},"maxVerifiers":{"type":"number","description":"Maximum number of Verifiers the tenant may own."},"id":{"type":"string","description":"Tenant unique ID. Supported non-UUID values."},"slug":{"type":"string","description":"URL-friendly alias of the tenant. Derived from the name when omitted, and immutable afterwards."},"email":{"type":"string","description":"Email address of this tenant organization. Unique across tenants."},"orgId":{"type":"string","description":"Keycloak organization unique ID. The tenant's operator organization must exist before the tenant is created."},"environment":{"type":"string","description":"Environment the tenant operates in. Defaults to production; sandbox tenants are for evaluation and testing.","enum":["sandbox","production"]},"claimsIntegration":{"description":"Webhook configuration used to notify the tenant's service of claim changes.","allOf":[{"$ref":"#/components/schemas/UpdateTenantClaimsIntegrationRequest"}]}},"required":["name","id","email","orgId"]},"TenantBrandingMetadata":{"type":"object","properties":{"primaryColor":{"type":"string","maxLength":64,"description":"Primary brand color used for CTAs and key UI elements."},"primaryColorHover":{"type":"string","maxLength":64,"description":"Primary brand color applied on hover state."},"primaryColorPressed":{"type":"string","maxLength":64,"description":"Primary brand color applied on pressed/active state."},"primaryOpacity08":{"type":"string","maxLength":64,"description":"Primary brand color at 8% opacity, used for subtle backgrounds."},"primaryOpacity16":{"type":"string","maxLength":64,"description":"Primary brand color at 16% opacity, used for subtle backgrounds."},"primaryOpacity20":{"type":"string","maxLength":64,"description":"Primary brand color at 20% opacity, used for subtle backgrounds."},"primaryDisabled":{"type":"string","maxLength":64,"description":"Primary brand color applied to disabled UI elements."},"darkOpacity05":{"type":"string","maxLength":64,"description":"Dark overlay color at 5% opacity."},"darkOpacity08":{"type":"string","maxLength":64,"description":"Dark overlay color at 8% opacity."},"darkOpacity12":{"type":"string","maxLength":64,"description":"Dark overlay color at 12% opacity."},"darkDivider":{"type":"string","maxLength":64,"description":"Dark color used for borders and dividers."},"darkOutlineMedium":{"type":"string","maxLength":64,"description":"Dark medium-emphasis color used for outlines."},"darkOutlineHigh":{"type":"string","maxLength":64,"description":"Dark high-emphasis color used for outlines."},"onSurfaceDarkHighEmphasis":{"type":"string","maxLength":64,"description":"Dark high-emphasis text/icon color rendered on light surfaces."},"onSurfaceDarkMediumEmphasis":{"type":"string","maxLength":64,"description":"Dark medium-emphasis text/icon color rendered on light surfaces."},"onSurfaceDarkDisabled":{"type":"string","maxLength":64,"description":"Dark disabled text/icon color rendered on light surfaces."},"onSurfaceLightHighEmphasis":{"type":"string","maxLength":64,"description":"Light high-emphasis text/icon color rendered on dark surfaces."},"onSurfaceLightMediumEmphasis":{"type":"string","maxLength":64,"description":"Light medium-emphasis text/icon color rendered on dark surfaces."},"onSurfaceLightDisabled":{"type":"string","maxLength":64,"description":"Light disabled text/icon color rendered on dark surfaces."},"textOnSurface":{"type":"string","maxLength":64,"description":"Default text color rendered on top of a surface background."},"surfaceNull":{"type":"string","maxLength":64,"description":"Base surface color with no elevation applied."},"cardBg":{"type":"string","maxLength":64,"description":"Background color used for card components."},"cardStroke":{"type":"string","maxLength":64,"description":"Border/stroke color used around card components."},"surface1":{"type":"string","maxLength":64,"description":"Elevation level 1 surface color."},"surface2":{"type":"string","maxLength":64,"description":"Elevation level 2 surface color."},"surface3":{"type":"string","maxLength":64,"description":"Elevation level 3 surface color."},"surface4":{"type":"string","maxLength":64,"description":"Elevation level 4 surface color."},"surface5":{"type":"string","maxLength":64,"description":"Elevation level 5 surface color."},"surfaceGrey1":{"type":"string","maxLength":64,"description":"Grey surface tone, level 1."},"surfaceGrey2":{"type":"string","maxLength":64,"description":"Grey surface tone, level 2."},"surfaceGrey3":{"type":"string","maxLength":64,"description":"Grey surface tone, level 3."},"surfaceGrey4":{"type":"string","maxLength":64,"description":"Grey surface tone, level 4."},"surfaceGrey5":{"type":"string","maxLength":64,"description":"Grey surface tone, level 5."},"shutterDark70":{"type":"string","maxLength":64,"description":"Dark modal/overlay shutter color at 70% opacity."},"shutterDark30":{"type":"string","maxLength":64,"description":"Dark modal/overlay shutter color at 30% opacity."},"shutterLight32":{"type":"string","maxLength":64,"description":"Light modal/overlay shutter color at 32% opacity."},"shutterLight75":{"type":"string","maxLength":64,"description":"Light modal/overlay shutter color at 75% opacity."},"linkColor":{"type":"string","maxLength":64,"description":"Color applied to hyperlinks."},"widgetColor":{"type":"string","maxLength":64,"description":"Base color used for embedded widget backgrounds."},"widgetColorHover":{"type":"string","maxLength":64,"description":"Embedded widget accent color applied on hover state."},"widgetColorPressed":{"type":"string","maxLength":64,"description":"Embedded widget accent color applied on pressed state."},"notificationColor":{"type":"string","maxLength":64,"description":"Base color used to indicate error states."},"notificationHover":{"type":"string","maxLength":64,"description":"Notification color applied on hover state."},"notificationPressed":{"type":"string","maxLength":64,"description":"Notification color applied on pressed state."},"notificationOpacity08":{"type":"string","maxLength":64,"description":"Notification color at 8% opacity, used for subtle backgrounds."},"notificationOpacity12":{"type":"string","maxLength":64,"description":"Notification color at 12% opacity, used for subtle backgrounds."},"notificationOpacity16":{"type":"string","maxLength":64,"description":"Notification color at 16% opacity, used for subtle backgrounds."},"warningColor":{"type":"string","maxLength":64,"description":"Base color used to indicate warning states."},"warningOpacity07":{"type":"string","maxLength":64,"description":"Warning color at 7% opacity, used for subtle backgrounds."},"warningOpacity12":{"type":"string","maxLength":64,"description":"Warning color at 12% opacity, used for subtle backgrounds."},"warningOpacity16":{"type":"string","maxLength":64,"description":"Warning color at 16% opacity, used for subtle backgrounds."},"successColor":{"type":"string","maxLength":64,"description":"Base color used to indicate success states."},"successHover":{"type":"string","maxLength":64,"description":"Success color applied on hover state."},"successPressed":{"type":"string","maxLength":64,"description":"Success color applied on pressed state."},"successOpacity07":{"type":"string","maxLength":64,"description":"Success color at 7% opacity, used for subtle backgrounds."},"successOpacity12":{"type":"string","maxLength":64,"description":"Success color at 12% opacity, used for subtle backgrounds."},"successOpacity16":{"type":"string","maxLength":64,"description":"Success color at 16% opacity, used for subtle backgrounds."},"secondaryColor":{"type":"string","maxLength":64,"description":"Secondary brand color used for supporting UI elements."},"accentColor":{"type":"string","maxLength":64,"description":"Accent color used to highlight key interactive elements."},"fontFamily":{"type":"string","maxLength":100,"description":"Primary font family used across the tenant's branded UI."},"fontFamilyLight":{"type":"string","maxLength":100,"description":"Light-weight variant of the font family, used for secondary text."},"fontFamilyHeading":{"type":"string","maxLength":100,"description":"Font family used for headings."},"isDark":{"type":"boolean","description":"Indicates whether the tenant's branding uses a dark theme."}}},"UpdateTenantClaimsIntegrationRequest":{"type":"object","properties":{"client":{"description":"OAuth client credentials used to authenticate the integration calls.","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationClient"}]},"webhook":{"description":"Endpoints of the tenant's service notified about claim changes.","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationWebhook"}]},"attributeProvider":{"description":"Endpoint of the tenant's service queried for claims during issuance.","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationAttributeProvider"}]}},"required":["client"]},"ClaimsIntegrationClient":{"type":"object","properties":{"tokenUrl":{"type":"string","description":"Token endpoint used to obtain an access token for the integration calls."},"clientId":{"type":"string","description":"Client unique ID"},"clientSecret":{"type":"string","description":"OAuth client secret used to authenticate the integration calls.","writeOnly":true}},"required":["tokenUrl","clientId","clientSecret"]},"ClaimsIntegrationWebhook":{"type":"object","properties":{"issuedClaimsUrl":{"type":"string","description":"URL notified when new claims are issued."},"revokedClaimsUrl":{"type":"string","description":"URL notified when claims are revoked."}},"required":["issuedClaimsUrl","revokedClaimsUrl"]},"ClaimsIntegrationAttributeProvider":{"type":"object","properties":{"endpointUrl":{"type":"string","description":"URL called during issuance to fetch the claims of a subject."}},"required":["endpointUrl"]},"CreateTenantResponse":{"type":"object","properties":{"id":{"type":"string","description":"Tenant unique ID"}},"required":["id"]}}},"paths":{"/api/v1/tenants":{"post":{"description":"Creates a new Tenant with the provided id","operationId":"TenantController_createTenant_api/v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTenantRequest"}}}},"responses":{"201":{"description":"When Tenant is created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTenantResponse"}}}},"400":{"description":"When maxIssuers or maxVerifiers is above the configured maximum."},"409":{"description":"When provided Tenant id, name or email already exists."}},"summary":"Create Tenant","tags":["Tenant"]}}}}
```

## Get Tenant

> Gets the tenant with the provided id

```json
{"openapi":"3.0.0","info":{"title":"EqusDTK Control API Documentation","version":"0.1.2"},"tags":[{"name":"Tenant","description":""}],"security":[{"sp":[]}],"components":{"securitySchemes":{"sp":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Service Provider. Token of the Service Provider client in the `agents` realm, with no `tenantId` claim. Authorize one bearer scheme at a time."}},"schemas":{"GetTenantResponse":{"type":"object","properties":{"id":{"type":"string","description":"Tenant unique ID"},"name":{"type":"string","description":"Display name of the tenant."},"slug":{"type":"string","description":"URL-friendly alias of the tenant, generated from its name unless supplied."},"email":{"type":"string","description":"Email address of the operator who owns the tenant."},"environment":{"type":"string","description":"Environment the tenant operates in.","enum":["sandbox","production"]},"orgId":{"type":"string","description":"Keycloak organization unique ID"},"accessExpiresAt":{"type":"object","description":"Tenant's expiration date. Null when its access never expires.","nullable":true},"intermediateRetentionTTL":{"type":"object","description":"TTL for retention data in intermediate state."},"terminalRetentionTTL":{"type":"object","description":"TTL for retention data in terminal state."},"hardDeleteRetentionTTL":{"type":"object","description":"TTL for hard delete retention."},"brandingMetadata":{"description":"Tenant branding metadata used to customize Embedded UI components.","allOf":[{"$ref":"#/components/schemas/TenantBrandingMetadata"}]},"maxIssuers":{"type":"number","description":"Maximum number of Issuers the tenant may own."},"maxVerifiers":{"type":"number","description":"Maximum number of Verifiers the tenant may own."},"createdAt":{"format":"date-time","type":"string","description":"Date and time the tenant was created."}},"required":["id","name","slug","email","environment","orgId","maxIssuers","maxVerifiers","createdAt"]},"TenantBrandingMetadata":{"type":"object","properties":{"primaryColor":{"type":"string","maxLength":64,"description":"Primary brand color used for CTAs and key UI elements."},"primaryColorHover":{"type":"string","maxLength":64,"description":"Primary brand color applied on hover state."},"primaryColorPressed":{"type":"string","maxLength":64,"description":"Primary brand color applied on pressed/active state."},"primaryOpacity08":{"type":"string","maxLength":64,"description":"Primary brand color at 8% opacity, used for subtle backgrounds."},"primaryOpacity16":{"type":"string","maxLength":64,"description":"Primary brand color at 16% opacity, used for subtle backgrounds."},"primaryOpacity20":{"type":"string","maxLength":64,"description":"Primary brand color at 20% opacity, used for subtle backgrounds."},"primaryDisabled":{"type":"string","maxLength":64,"description":"Primary brand color applied to disabled UI elements."},"darkOpacity05":{"type":"string","maxLength":64,"description":"Dark overlay color at 5% opacity."},"darkOpacity08":{"type":"string","maxLength":64,"description":"Dark overlay color at 8% opacity."},"darkOpacity12":{"type":"string","maxLength":64,"description":"Dark overlay color at 12% opacity."},"darkDivider":{"type":"string","maxLength":64,"description":"Dark color used for borders and dividers."},"darkOutlineMedium":{"type":"string","maxLength":64,"description":"Dark medium-emphasis color used for outlines."},"darkOutlineHigh":{"type":"string","maxLength":64,"description":"Dark high-emphasis color used for outlines."},"onSurfaceDarkHighEmphasis":{"type":"string","maxLength":64,"description":"Dark high-emphasis text/icon color rendered on light surfaces."},"onSurfaceDarkMediumEmphasis":{"type":"string","maxLength":64,"description":"Dark medium-emphasis text/icon color rendered on light surfaces."},"onSurfaceDarkDisabled":{"type":"string","maxLength":64,"description":"Dark disabled text/icon color rendered on light surfaces."},"onSurfaceLightHighEmphasis":{"type":"string","maxLength":64,"description":"Light high-emphasis text/icon color rendered on dark surfaces."},"onSurfaceLightMediumEmphasis":{"type":"string","maxLength":64,"description":"Light medium-emphasis text/icon color rendered on dark surfaces."},"onSurfaceLightDisabled":{"type":"string","maxLength":64,"description":"Light disabled text/icon color rendered on dark surfaces."},"textOnSurface":{"type":"string","maxLength":64,"description":"Default text color rendered on top of a surface background."},"surfaceNull":{"type":"string","maxLength":64,"description":"Base surface color with no elevation applied."},"cardBg":{"type":"string","maxLength":64,"description":"Background color used for card components."},"cardStroke":{"type":"string","maxLength":64,"description":"Border/stroke color used around card components."},"surface1":{"type":"string","maxLength":64,"description":"Elevation level 1 surface color."},"surface2":{"type":"string","maxLength":64,"description":"Elevation level 2 surface color."},"surface3":{"type":"string","maxLength":64,"description":"Elevation level 3 surface color."},"surface4":{"type":"string","maxLength":64,"description":"Elevation level 4 surface color."},"surface5":{"type":"string","maxLength":64,"description":"Elevation level 5 surface color."},"surfaceGrey1":{"type":"string","maxLength":64,"description":"Grey surface tone, level 1."},"surfaceGrey2":{"type":"string","maxLength":64,"description":"Grey surface tone, level 2."},"surfaceGrey3":{"type":"string","maxLength":64,"description":"Grey surface tone, level 3."},"surfaceGrey4":{"type":"string","maxLength":64,"description":"Grey surface tone, level 4."},"surfaceGrey5":{"type":"string","maxLength":64,"description":"Grey surface tone, level 5."},"shutterDark70":{"type":"string","maxLength":64,"description":"Dark modal/overlay shutter color at 70% opacity."},"shutterDark30":{"type":"string","maxLength":64,"description":"Dark modal/overlay shutter color at 30% opacity."},"shutterLight32":{"type":"string","maxLength":64,"description":"Light modal/overlay shutter color at 32% opacity."},"shutterLight75":{"type":"string","maxLength":64,"description":"Light modal/overlay shutter color at 75% opacity."},"linkColor":{"type":"string","maxLength":64,"description":"Color applied to hyperlinks."},"widgetColor":{"type":"string","maxLength":64,"description":"Base color used for embedded widget backgrounds."},"widgetColorHover":{"type":"string","maxLength":64,"description":"Embedded widget accent color applied on hover state."},"widgetColorPressed":{"type":"string","maxLength":64,"description":"Embedded widget accent color applied on pressed state."},"notificationColor":{"type":"string","maxLength":64,"description":"Base color used to indicate error states."},"notificationHover":{"type":"string","maxLength":64,"description":"Notification color applied on hover state."},"notificationPressed":{"type":"string","maxLength":64,"description":"Notification color applied on pressed state."},"notificationOpacity08":{"type":"string","maxLength":64,"description":"Notification color at 8% opacity, used for subtle backgrounds."},"notificationOpacity12":{"type":"string","maxLength":64,"description":"Notification color at 12% opacity, used for subtle backgrounds."},"notificationOpacity16":{"type":"string","maxLength":64,"description":"Notification color at 16% opacity, used for subtle backgrounds."},"warningColor":{"type":"string","maxLength":64,"description":"Base color used to indicate warning states."},"warningOpacity07":{"type":"string","maxLength":64,"description":"Warning color at 7% opacity, used for subtle backgrounds."},"warningOpacity12":{"type":"string","maxLength":64,"description":"Warning color at 12% opacity, used for subtle backgrounds."},"warningOpacity16":{"type":"string","maxLength":64,"description":"Warning color at 16% opacity, used for subtle backgrounds."},"successColor":{"type":"string","maxLength":64,"description":"Base color used to indicate success states."},"successHover":{"type":"string","maxLength":64,"description":"Success color applied on hover state."},"successPressed":{"type":"string","maxLength":64,"description":"Success color applied on pressed state."},"successOpacity07":{"type":"string","maxLength":64,"description":"Success color at 7% opacity, used for subtle backgrounds."},"successOpacity12":{"type":"string","maxLength":64,"description":"Success color at 12% opacity, used for subtle backgrounds."},"successOpacity16":{"type":"string","maxLength":64,"description":"Success color at 16% opacity, used for subtle backgrounds."},"secondaryColor":{"type":"string","maxLength":64,"description":"Secondary brand color used for supporting UI elements."},"accentColor":{"type":"string","maxLength":64,"description":"Accent color used to highlight key interactive elements."},"fontFamily":{"type":"string","maxLength":100,"description":"Primary font family used across the tenant's branded UI."},"fontFamilyLight":{"type":"string","maxLength":100,"description":"Light-weight variant of the font family, used for secondary text."},"fontFamilyHeading":{"type":"string","maxLength":100,"description":"Font family used for headings."},"isDark":{"type":"boolean","description":"Indicates whether the tenant's branding uses a dark theme."}}}}},"paths":{"/api/v1/tenants/{id}":{"get":{"description":"Gets the tenant with the provided id","operationId":"TenantController_getTenant_api/v1","parameters":[{"name":"id","required":true,"in":"path","description":"Tenant unique ID","schema":{"type":"string"}}],"responses":{"200":{"description":"When Tenant is retrieved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTenantResponse"}}}},"404":{"description":"When Tenant identified by id does not exist."}},"summary":"Get Tenant","tags":["Tenant"]}}}}
```

## Update tenant

> Updates the Tenant identified by id

```json
{"openapi":"3.0.0","info":{"title":"EqusDTK Control API Documentation","version":"0.1.2"},"tags":[{"name":"Tenant","description":""}],"security":[{"sp":[]}],"components":{"securitySchemes":{"sp":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Service Provider. Token of the Service Provider client in the `agents` realm, with no `tenantId` claim. Authorize one bearer scheme at a time."}},"schemas":{"UpdateTenantRequest":{"type":"object","properties":{"name":{"type":"string","description":"Display name of the tenant."},"brandingMetadata":{"description":"Tenant branding metadata used to customize Embedded UI components.","allOf":[{"$ref":"#/components/schemas/TenantBrandingMetadata"}]},"accessExpiresAt":{"type":"object","description":"Tenant's expiration date. Send null so it never expires; omit to leave unchanged.","nullable":true},"maxIssuers":{"type":"number","description":"Maximum number of Issuers the tenant may own."},"maxVerifiers":{"type":"number","description":"Maximum number of Verifiers the tenant may own."},"orgId":{"type":"string","description":"Keycloak organization unique ID. Can be used to back-fill the organization of a tenant registered before one existed; omit to leave it unchanged."},"email":{"type":"string","description":"Email address of this tenant organization. Unique across tenants. Omit to leave it unchanged."}},"required":["name"]},"TenantBrandingMetadata":{"type":"object","properties":{"primaryColor":{"type":"string","maxLength":64,"description":"Primary brand color used for CTAs and key UI elements."},"primaryColorHover":{"type":"string","maxLength":64,"description":"Primary brand color applied on hover state."},"primaryColorPressed":{"type":"string","maxLength":64,"description":"Primary brand color applied on pressed/active state."},"primaryOpacity08":{"type":"string","maxLength":64,"description":"Primary brand color at 8% opacity, used for subtle backgrounds."},"primaryOpacity16":{"type":"string","maxLength":64,"description":"Primary brand color at 16% opacity, used for subtle backgrounds."},"primaryOpacity20":{"type":"string","maxLength":64,"description":"Primary brand color at 20% opacity, used for subtle backgrounds."},"primaryDisabled":{"type":"string","maxLength":64,"description":"Primary brand color applied to disabled UI elements."},"darkOpacity05":{"type":"string","maxLength":64,"description":"Dark overlay color at 5% opacity."},"darkOpacity08":{"type":"string","maxLength":64,"description":"Dark overlay color at 8% opacity."},"darkOpacity12":{"type":"string","maxLength":64,"description":"Dark overlay color at 12% opacity."},"darkDivider":{"type":"string","maxLength":64,"description":"Dark color used for borders and dividers."},"darkOutlineMedium":{"type":"string","maxLength":64,"description":"Dark medium-emphasis color used for outlines."},"darkOutlineHigh":{"type":"string","maxLength":64,"description":"Dark high-emphasis color used for outlines."},"onSurfaceDarkHighEmphasis":{"type":"string","maxLength":64,"description":"Dark high-emphasis text/icon color rendered on light surfaces."},"onSurfaceDarkMediumEmphasis":{"type":"string","maxLength":64,"description":"Dark medium-emphasis text/icon color rendered on light surfaces."},"onSurfaceDarkDisabled":{"type":"string","maxLength":64,"description":"Dark disabled text/icon color rendered on light surfaces."},"onSurfaceLightHighEmphasis":{"type":"string","maxLength":64,"description":"Light high-emphasis text/icon color rendered on dark surfaces."},"onSurfaceLightMediumEmphasis":{"type":"string","maxLength":64,"description":"Light medium-emphasis text/icon color rendered on dark surfaces."},"onSurfaceLightDisabled":{"type":"string","maxLength":64,"description":"Light disabled text/icon color rendered on dark surfaces."},"textOnSurface":{"type":"string","maxLength":64,"description":"Default text color rendered on top of a surface background."},"surfaceNull":{"type":"string","maxLength":64,"description":"Base surface color with no elevation applied."},"cardBg":{"type":"string","maxLength":64,"description":"Background color used for card components."},"cardStroke":{"type":"string","maxLength":64,"description":"Border/stroke color used around card components."},"surface1":{"type":"string","maxLength":64,"description":"Elevation level 1 surface color."},"surface2":{"type":"string","maxLength":64,"description":"Elevation level 2 surface color."},"surface3":{"type":"string","maxLength":64,"description":"Elevation level 3 surface color."},"surface4":{"type":"string","maxLength":64,"description":"Elevation level 4 surface color."},"surface5":{"type":"string","maxLength":64,"description":"Elevation level 5 surface color."},"surfaceGrey1":{"type":"string","maxLength":64,"description":"Grey surface tone, level 1."},"surfaceGrey2":{"type":"string","maxLength":64,"description":"Grey surface tone, level 2."},"surfaceGrey3":{"type":"string","maxLength":64,"description":"Grey surface tone, level 3."},"surfaceGrey4":{"type":"string","maxLength":64,"description":"Grey surface tone, level 4."},"surfaceGrey5":{"type":"string","maxLength":64,"description":"Grey surface tone, level 5."},"shutterDark70":{"type":"string","maxLength":64,"description":"Dark modal/overlay shutter color at 70% opacity."},"shutterDark30":{"type":"string","maxLength":64,"description":"Dark modal/overlay shutter color at 30% opacity."},"shutterLight32":{"type":"string","maxLength":64,"description":"Light modal/overlay shutter color at 32% opacity."},"shutterLight75":{"type":"string","maxLength":64,"description":"Light modal/overlay shutter color at 75% opacity."},"linkColor":{"type":"string","maxLength":64,"description":"Color applied to hyperlinks."},"widgetColor":{"type":"string","maxLength":64,"description":"Base color used for embedded widget backgrounds."},"widgetColorHover":{"type":"string","maxLength":64,"description":"Embedded widget accent color applied on hover state."},"widgetColorPressed":{"type":"string","maxLength":64,"description":"Embedded widget accent color applied on pressed state."},"notificationColor":{"type":"string","maxLength":64,"description":"Base color used to indicate error states."},"notificationHover":{"type":"string","maxLength":64,"description":"Notification color applied on hover state."},"notificationPressed":{"type":"string","maxLength":64,"description":"Notification color applied on pressed state."},"notificationOpacity08":{"type":"string","maxLength":64,"description":"Notification color at 8% opacity, used for subtle backgrounds."},"notificationOpacity12":{"type":"string","maxLength":64,"description":"Notification color at 12% opacity, used for subtle backgrounds."},"notificationOpacity16":{"type":"string","maxLength":64,"description":"Notification color at 16% opacity, used for subtle backgrounds."},"warningColor":{"type":"string","maxLength":64,"description":"Base color used to indicate warning states."},"warningOpacity07":{"type":"string","maxLength":64,"description":"Warning color at 7% opacity, used for subtle backgrounds."},"warningOpacity12":{"type":"string","maxLength":64,"description":"Warning color at 12% opacity, used for subtle backgrounds."},"warningOpacity16":{"type":"string","maxLength":64,"description":"Warning color at 16% opacity, used for subtle backgrounds."},"successColor":{"type":"string","maxLength":64,"description":"Base color used to indicate success states."},"successHover":{"type":"string","maxLength":64,"description":"Success color applied on hover state."},"successPressed":{"type":"string","maxLength":64,"description":"Success color applied on pressed state."},"successOpacity07":{"type":"string","maxLength":64,"description":"Success color at 7% opacity, used for subtle backgrounds."},"successOpacity12":{"type":"string","maxLength":64,"description":"Success color at 12% opacity, used for subtle backgrounds."},"successOpacity16":{"type":"string","maxLength":64,"description":"Success color at 16% opacity, used for subtle backgrounds."},"secondaryColor":{"type":"string","maxLength":64,"description":"Secondary brand color used for supporting UI elements."},"accentColor":{"type":"string","maxLength":64,"description":"Accent color used to highlight key interactive elements."},"fontFamily":{"type":"string","maxLength":100,"description":"Primary font family used across the tenant's branded UI."},"fontFamilyLight":{"type":"string","maxLength":100,"description":"Light-weight variant of the font family, used for secondary text."},"fontFamilyHeading":{"type":"string","maxLength":100,"description":"Font family used for headings."},"isDark":{"type":"boolean","description":"Indicates whether the tenant's branding uses a dark theme."}}},"UpdateTenantResponse":{"type":"object","properties":{"id":{"type":"string","description":"Tenant unique ID"},"name":{"type":"string","description":"Display name of the tenant."},"slug":{"type":"string","description":"URL-friendly alias of the tenant, generated from its name unless supplied."},"email":{"type":"string","description":"Email address of the operator who owns the tenant."},"environment":{"type":"string","description":"Environment the tenant operates in.","enum":["sandbox","production"]},"orgId":{"type":"string","description":"Keycloak organization unique ID"},"accessExpiresAt":{"type":"object","description":"Tenant's expiration date. Null when its access never expires.","nullable":true},"intermediateRetentionTTL":{"type":"object","description":"TTL for retention data in intermediate state."},"terminalRetentionTTL":{"type":"object","description":"TTL for retention data in terminal state."},"hardDeleteRetentionTTL":{"type":"object","description":"TTL for hard delete retention."},"brandingMetadata":{"description":"Tenant branding metadata used to customize Embedded UI components.","allOf":[{"$ref":"#/components/schemas/TenantBrandingMetadata"}]},"maxIssuers":{"type":"number","description":"Maximum number of Issuers the tenant may own."},"maxVerifiers":{"type":"number","description":"Maximum number of Verifiers the tenant may own."},"createdAt":{"format":"date-time","type":"string","description":"Date and time the tenant was created."}},"required":["id","name","slug","email","environment","orgId","maxIssuers","maxVerifiers","createdAt"]}}},"paths":{"/api/v1/tenants/{id}":{"put":{"description":"Updates the Tenant identified by id","operationId":"TenantController_updateTenant_api/v1","parameters":[{"name":"id","required":true,"in":"path","description":"Tenant unique ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTenantRequest"}}}},"responses":{"200":{"description":"When Tenant is updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTenantResponse"}}}},"400":{"description":"When maxIssuers or maxVerifiers is above the configured maximum."},"404":{"description":"When Tenant identified by id does not exist."},"409":{"description":"When provided Tenant name or email already belongs to another Tenant."}},"summary":"Update tenant","tags":["Tenant"]}}}}
```

## Discontinue Tenant

> Discontinue the Tenant, deactivate Issuers and Verifiers

```json
{"openapi":"3.0.0","info":{"title":"EqusDTK Control API Documentation","version":"0.1.2"},"tags":[{"name":"Tenant","description":""}],"security":[{"sp":[]}],"components":{"securitySchemes":{"sp":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Service Provider. Token of the Service Provider client in the `agents` realm, with no `tenantId` claim. Authorize one bearer scheme at a time."}}},"paths":{"/api/v1/tenants/{id}":{"delete":{"description":"Discontinue the Tenant, deactivate Issuers and Verifiers","operationId":"TenantController_deleteTenant_api/v1","parameters":[{"name":"id","required":true,"in":"path","description":"Tenant unique ID","schema":{"type":"string"}}],"responses":{"200":{"description":"When Tenant is deleted."},"404":{"description":"When Tenant identified by id does not exist."}},"summary":"Discontinue Tenant","tags":["Tenant"]}}}}
```

## Get Tenant Claims Integration

> Retrieves the claims integration configuration for a Tenant

```json
{"openapi":"3.0.0","info":{"title":"EqusDTK Control API Documentation","version":"0.1.2"},"tags":[{"name":"Tenant","description":""}],"security":[{"sp":[]}],"components":{"securitySchemes":{"sp":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Service Provider. Token of the Service Provider client in the `agents` realm, with no `tenantId` claim. Authorize one bearer scheme at a time."}},"schemas":{"GetTenantClaimsIntegrationResponse":{"type":"object","properties":{"uuid":{"type":"string","description":"Claims integration unique ID"},"client":{"description":"OAuth client credentials used to authenticate the integration calls.","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationClientResponse"}]},"webhook":{"description":"Endpoints of the tenant's service notified about claim changes.","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationWebhookResponse"}]},"attributeProvider":{"description":"Endpoint of the tenant's service queried for claims during issuance.","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationAttributeProviderResponse"}]},"createdAt":{"format":"date-time","type":"string","description":"Date and time the claims integration was created."},"updatedAt":{"format":"date-time","type":"string","description":"Date and time the claims integration was last updated."}},"required":["uuid","client","createdAt","updatedAt"]},"ClaimsIntegrationClientResponse":{"type":"object","properties":{"tokenUrl":{"type":"string","description":"Token endpoint used to obtain an access token for the integration calls."},"clientId":{"type":"string","description":"Client unique ID"},"clientSecretSet":{"type":"boolean","description":"Whether a client secret is stored for this integration."}},"required":["tokenUrl","clientId","clientSecretSet"]},"ClaimsIntegrationWebhookResponse":{"type":"object","properties":{"issuedClaimsUrl":{"type":"string","description":"URL notified when new claims are issued."},"revokedClaimsUrl":{"type":"string","description":"URL notified when claims are revoked."}},"required":["issuedClaimsUrl","revokedClaimsUrl"]},"ClaimsIntegrationAttributeProviderResponse":{"type":"object","properties":{"endpointUrl":{"type":"string","description":"URL called during issuance to fetch the claims of a subject."}},"required":["endpointUrl"]}}},"paths":{"/api/v1/tenants/{id}/claims-integration":{"get":{"description":"Retrieves the claims integration configuration for a Tenant","operationId":"TenantController_getClaimsIntegration_api/v1","parameters":[{"name":"id","required":true,"in":"path","description":"Tenant unique ID","schema":{"type":"string"}}],"responses":{"200":{"description":"When the Tenant claims integration is retrieved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTenantClaimsIntegrationResponse"}}}},"404":{"description":"- When Tenant identified by id does not exist.\n- When no claims integration is configured for this Tenant."}},"summary":"Get Tenant Claims Integration","tags":["Tenant"]}}}}
```

## Upsert Tenant Claims Integration

> Creates or replaces the claims integration for a Tenant. Replaces rather than merges: an omitted leg is removed.

```json
{"openapi":"3.0.0","info":{"title":"EqusDTK Control API Documentation","version":"0.1.2"},"tags":[{"name":"Tenant","description":""}],"security":[{"sp":[]}],"components":{"securitySchemes":{"sp":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Service Provider. Token of the Service Provider client in the `agents` realm, with no `tenantId` claim. Authorize one bearer scheme at a time."}},"schemas":{"UpdateTenantClaimsIntegrationRequest":{"type":"object","properties":{"client":{"description":"OAuth client credentials used to authenticate the integration calls.","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationClient"}]},"webhook":{"description":"Endpoints of the tenant's service notified about claim changes.","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationWebhook"}]},"attributeProvider":{"description":"Endpoint of the tenant's service queried for claims during issuance.","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationAttributeProvider"}]}},"required":["client"]},"ClaimsIntegrationClient":{"type":"object","properties":{"tokenUrl":{"type":"string","description":"Token endpoint used to obtain an access token for the integration calls."},"clientId":{"type":"string","description":"Client unique ID"},"clientSecret":{"type":"string","description":"OAuth client secret used to authenticate the integration calls.","writeOnly":true}},"required":["tokenUrl","clientId","clientSecret"]},"ClaimsIntegrationWebhook":{"type":"object","properties":{"issuedClaimsUrl":{"type":"string","description":"URL notified when new claims are issued."},"revokedClaimsUrl":{"type":"string","description":"URL notified when claims are revoked."}},"required":["issuedClaimsUrl","revokedClaimsUrl"]},"ClaimsIntegrationAttributeProvider":{"type":"object","properties":{"endpointUrl":{"type":"string","description":"URL called during issuance to fetch the claims of a subject."}},"required":["endpointUrl"]},"UpdateTenantClaimsIntegrationResponse":{"type":"object","properties":{"uuid":{"type":"string","description":"Claims integration unique ID"},"client":{"description":"OAuth client credentials used to authenticate the integration calls.","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationClientResponse"}]},"webhook":{"description":"Endpoints of the tenant's service notified about claim changes.","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationWebhookResponse"}]},"attributeProvider":{"description":"Endpoint of the tenant's service queried for claims during issuance.","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/ClaimsIntegrationAttributeProviderResponse"}]},"createdAt":{"format":"date-time","type":"string","description":"Date and time the claims integration was created."},"updatedAt":{"format":"date-time","type":"string","description":"Date and time the claims integration was last updated."}},"required":["uuid","client","createdAt","updatedAt"]},"ClaimsIntegrationClientResponse":{"type":"object","properties":{"tokenUrl":{"type":"string","description":"Token endpoint used to obtain an access token for the integration calls."},"clientId":{"type":"string","description":"Client unique ID"},"clientSecretSet":{"type":"boolean","description":"Whether a client secret is stored for this integration."}},"required":["tokenUrl","clientId","clientSecretSet"]},"ClaimsIntegrationWebhookResponse":{"type":"object","properties":{"issuedClaimsUrl":{"type":"string","description":"URL notified when new claims are issued."},"revokedClaimsUrl":{"type":"string","description":"URL notified when claims are revoked."}},"required":["issuedClaimsUrl","revokedClaimsUrl"]},"ClaimsIntegrationAttributeProviderResponse":{"type":"object","properties":{"endpointUrl":{"type":"string","description":"URL called during issuance to fetch the claims of a subject."}},"required":["endpointUrl"]}}},"paths":{"/api/v1/tenants/{id}/claims-integration":{"put":{"description":"Creates or replaces the claims integration for a Tenant. Replaces rather than merges: an omitted leg is removed.","operationId":"TenantController_upsertClaimsIntegration_api/v1","parameters":[{"name":"id","required":true,"in":"path","description":"Tenant unique ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTenantClaimsIntegrationRequest"}}}},"responses":{"200":{"description":"When the Tenant claims integration is created or replaced.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTenantClaimsIntegrationResponse"}}}},"400":{"description":"When neither webhook nor attributeProvider is provided, when the webhook leg is sent without the client block, or when the Attribute Provider URL is not a public https URL."},"404":{"description":"When Tenant identified by id does not exist."}},"summary":"Upsert Tenant Claims Integration","tags":["Tenant"]}}}}
```

## Delete Tenant Claims Integration

> Removes the claims integration configuration for a Tenant

```json
{"openapi":"3.0.0","info":{"title":"EqusDTK Control API Documentation","version":"0.1.2"},"tags":[{"name":"Tenant","description":""}],"security":[{"sp":[]}],"components":{"securitySchemes":{"sp":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Service Provider. Token of the Service Provider client in the `agents` realm, with no `tenantId` claim. Authorize one bearer scheme at a time."}}},"paths":{"/api/v1/tenants/{id}/claims-integration":{"delete":{"description":"Removes the claims integration configuration for a Tenant","operationId":"TenantController_deleteClaimsIntegration_api/v1","parameters":[{"name":"id","required":true,"in":"path","description":"Tenant unique ID","schema":{"type":"string"}}],"responses":{"204":{"description":"When the Tenant claims integration is deleted."},"404":{"description":"- When Tenant identified by id does not exist.\n- When no claims integration is configured for this Tenant."}},"summary":"Delete Tenant Claims Integration","tags":["Tenant"]}}}}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.toolkit.equs.ai/api/control-api/tenant.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
