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.

List and query service accounts in the active scope

GET
/scopes/{scopeId}/iam/service-accounts

Returns the machine identities (service accounts) visible in the active tenant/subscription/project scope, as rendered by the Service accounts page on route load. Each row carries the email-style identifier (<name>@iam. followed by the platform's DNS domain), ARN, key/binding counts, key-hygiene signal (oldestKeyAgeDays vs the 90-day rotation guideline) and 24h auth/denied counters. This single endpoint also serves the UI's search/filter/sort/pagination controls (collapsed iam.service_account.search_filter_sort): free-text q matches name or email; status narrows to enabled/disabled; staleKeys=true returns only accounts whose oldest key exceeds the 90-day rotation guideline; sortable columns include name, bindings, keys, lastUsed. Validation: scopeId must reference a scope the caller can access (unknown → 404 NOT_FOUND); status must be one of enabled|disabled and page/pageSize must be positive integers (else 422 VALIDATION_FAILED); caller needs at least reader on IAM in the scope (else 403 FORBIDDEN). Async & state: Synchronous read; no state change. Backed by the IAM read model; no SSE frames emitted. Errors: 401 missing/expired session; 403 caller lacks IAM read permission in the scope; 404 scope not found or not visible; 422 malformed query parameters; 500 read-model unavailable. Idempotency/Concurrency: Safe, cacheable; no idempotency key required.

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.

Query Parameters

region?string

Restrict the result set to a single region.

Match^[a-z][a-z0-9-]{1,39}$
q?string

Free-text search.

sort?string

Field to sort by (entity-specific; defaults to the entity's natural order).

order?string

Sort direction.

Default"asc"
Value in"asc""desc"
page?integer

1-based page number.

Range1 <= value
Default1
pageSize?integer

Items per page (max 200).

Range1 <= value <= 200
Default50
status?string

Filter by account status (UI quick filters "Active" / "Disabled").

Value in"enabled""disabled"
staleKeys?boolean

When true, return only accounts whose oldest key exceeds the 90-day rotation guideline (UI "Stale keys" filter).

Response Body

Paginated collection of service accounts in the active scope.

application/json
  1. response
data*array<>
meta*

Pagination envelope metadata. List responses are always { data, meta } — never a naked array.

curl -X GET "https://example.com/scopes/string/iam/service-accounts"
{  "data": [    {      "id": "string",      "name": "string",      "email": "string",      "arn": "string",      "uniqueId": "string",      "description": "string",      "status": "enabled",      "createdAt": "2019-08-24T14:15:22Z",      "createdBy": "string",      "lastUsedAt": "2019-08-24T14:15:22Z",      "keyCount": 0,      "bindingCount": 0,      "oldestKeyAgeDays": 0,      "auth24h": 0,      "denied24h": 0    }  ],  "meta": {    "page": 1,    "pageSize": 1,    "total": 0,    "hasNext": true  }}