Identity & Access Management

Preview — pending review

This reference is generated from the platform API contract and is still under review. Operations, fields, and descriptions can change before publication.

Create an OpenStack API credential (secret revealed once)

POST
/scopes/{scopeId}/iam/openstack-credentials

Mints a RESTRICTED, EXPIRING Keystone application credential for the caller (or, with serviceAccountId, for a service account) scoped to this project, usable with Terraform, the openstack CLI, OCCM and Cinder CSI. The owner's Keystone principal is created lazily; its project roles are derived from the portal permissions. The chosen profile (full = member + load-balancer_member, readonly = reader + load-balancer_observer) can never exceed that projection. Expiry is mandatory: default 90 days, at most 365. Limits: 20 active credentials per owner, 50 per project. The response carries applicationCredentialSecret exactly ONCE. It is never stored by the platform (not in the database, logs, audit or idempotency records) and cannot be retrieved again. Authorization: an interactive console session with a second factor verified in the last 5 minutes (pc_live_ tokens and sak_live_ keys are refused); direct API access enabled for the organisation and not locked by the platform operator (403 details.reason API_ACCESS_DISABLED_BY_OPERATOR); own credential: compute, network and storage at least read on the project; service-account credential: tokens: manage AND the caller's permissions on the project must dominate the service account's. Errors: 401; 403 (FORBIDDEN, MFA_STEP_UP_REQUIRED, MFA_SETUP_REQUIRED, INTERACTIVE_SESSION_REQUIRED); 404 scope or service account; 409 an Idempotency-Key that was already used (the secret is never replayed) or a limit reached (QUOTA_EXCEEDED); 412 API access disabled / project not provisioned; 422 validation; 429 RATE_LIMITED another credential of the same owner is being minted right now and did not finish within the wait (retry); 503 the cloud could not complete it (retry). Concurrent requests with one Idempotency-Key: exactly one mints, the others answer 409.

Authorization

bearerToken
headerAuthorizationBearer <token>

An API token (pc_live_…) or a service-account key (sak_live_…), created in Identity & Access Management and sent as Authorization: Bearer <token>. Requests are rate limited per credential and per tenant: every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, and a refused request gets 429 RATE_LIMITED with Retry-After.

Path Parameters

scopeId*string

Opaque ownership+authorization scope resolving to tenant + subscription + project.

Header Parameters

Idempotency-Key?string

Optional; recommended for safe retries. When sent, the same key+body within 24h replays the original result and the same key with a different body is 409 CONFLICT; keys are unique per tenant. When an API token or service-account (bearer) caller omits it, the request is applied once with no replay protection (a retry may apply it again). A console session gets one from the edge.

Formatuuid

Request Body

application/json
  1. body
name*string

Letters, digits, interior space, '.', '_' or '-'; starts with a letter or digit.

Match^[A-Za-z0-9](?:[A-Za-z0-9._ -]{0,61}[A-Za-z0-9._-])?$
Length1 <= length <= 63
profile*OpenStackCredentialProfile

full = Keystone member + load-balancer_member; readonly = reader + load-balancer_observer. Never more than the owner's projected roles on the project.

Value in"full""readonly"
expiresInDays?integer

Lifetime in days (default 90). Mutually exclusive with expiresAt.

Range1 <= value <= 365
expiresAt?string

Explicit expiry (1-365 days ahead). Mutually exclusive with expiresInDays.

Formatdate-time
serviceAccountId?string

Mint for this service account instead of the caller (requires tokens manage).

Response Body

Created; the secret is in this response only.

application/json
  1. response
credential*

An OpenStack application credential minted by the platform (the secret is never included).

secret*

The one-time secret material plus what a clouds.yaml / openrc needs.

curl -X POST "https://example.com/scopes/string/iam/openstack-credentials" \  -H "Content-Type: application/json" \  -d '{    "name": "string",    "profile": "full"  }'
{  "credential": {    "id": "string",    "name": "string",    "projectId": "string",    "owner": {      "kind": "user",      "id": "string"    },    "profile": "full",    "roles": [      "string"    ],    "status": "active",    "applicationCredentialId": "string",    "expiresAt": "2019-08-24T14:15:22Z",    "createdAt": "2019-08-24T14:15:22Z",    "createdBy": "string",    "lastUsedAt": "2019-08-24T14:15:22Z",    "revokedAt": "2019-08-24T14:15:22Z",    "revokeReason": "user",    "rotatedFromId": "string",    "replacedById": "string",    "deleteAfter": "2019-08-24T14:15:22Z"  },  "secret": {    "applicationCredentialId": "string",    "applicationCredentialSecret": "string",    "authUrl": "string",    "regionName": "string",    "interface": "string"  }}