Grants one or more principals (user, group, or resource) access to one or more
entities (resource or group). The request body is batched to match the GraphQL
addRoleAssignments mutation, which this endpoint thin-wraps. The caller must
hold the EDIT_ASSIGNMENTS role permission on every entity in the batch.
Omit access_level_remote_id for entities that have a single default access
level. Omit duration_minutes (or send 0) for an indefinite grant.
Atomicity: the batch is applied as a single transaction. If any entry
fails input validation, authorization, lookup, or creation, no entries
are created and the response identifies the first failing entry’s
entity_id and principal_id (and the request-array index for input
validation errors). Clients should retry with the offending entry
removed; partial-success is intentionally not supported, matching the
semantics of the GraphQL addRoleAssignments mutation that this
endpoint wraps.
Prefer this endpoint for batch or programmatic use (e.g. Terraform). For a
single grant on a specific entity/principal pair, the per-pair endpoints —
/resources/{id}/users/{id}, /groups/{id}/users/{id},
/groups/{id}/resources/{id}, /groups/{id}/containing-groups,
/resources/{id}/non-human-identities/{id} — are often simpler.
Opaque IDs of push tasks enqueued to propagate the new assignments to end systems. Each ID is a base64-encoded, URL-safe string that mirrors the identifier returned by the GraphQL addRoleAssignments mutation.
One entry per role assignment created, in request order.
Show child attributes
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Opal Security Docs","colors":{"primary":"#0C7997","light":"#EDFCFC","dark":"#074055"},"logo":{"light":"https://mintcdn.com/opalsecurity/FBbZyeMPZrA69UcV/logo/logo-dark.svg?fit=max\u0026auto=format\u0026n=FBbZyeMPZrA69UcV\u0026q=85\u0026s=93a4bd75f157f9f0ab43cdf4d715b5cd","dark":"https://mintcdn.com/opalsecurity/FBbZyeMPZrA69UcV/logo/logo-light.svg?fit=max\u0026auto=format\u0026n=FBbZyeMPZrA69UcV\u0026q=85\u0026s=1774b545e4f1c5cad647f5194f7b26d9"},"favicon":{"light":"https://mintcdn.com/opalsecurity/DRAwGKUXMxLRQouh/logo/icon-opal-black.svg?fit=max\u0026auto=format\u0026n=DRAwGKUXMxLRQouh\u0026q=85\u0026s=9c8bd1204b6b5b83542c2ab5be549858","dark":"https://mintcdn.com/opalsecurity/DRAwGKUXMxLRQouh/logo/icon-opal-white.svg?fit=max\u0026auto=format\u0026n=DRAwGKUXMxLRQouh\u0026q=85\u0026s=73b53b4ceab6ae0b00e30b2042a6020a"},"icons":{"library":"lucide"},"styling":{"eyebrows":"breadcrumbs","latex":false},"integrations":{"ga4":{"measurementId":"G-1PPPM1WF6D"}},"errors":{"404":{"redirect":false,"title":"Page can't be found","description":"Sorry! This page might have been moved, or the link might be broken. Go back to our documentation via https://docs.opal.dev/docs/welcome."}},"metadata":{"timestamp":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"opalsecurity","hasAudioNarration":false,"actualSubdomain":"opalsecurity","customDomains":["docs.opal.dev"],"gitSource":{"type":"github","owner":"opalsecurity","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aeccf8cc031932d757b171a","collectionId":"3a50710d-ce57-4904-b650-8581a481b4f9","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aeccf8cc031932d757b171a"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6aed437ae0a02443b201880e","clientVersion":"0.0.4074","searchFilterCounts":[{"language":"default","tag":"API Reference","count":217},{"language":"default","tag":"Opal API","count":212},{"language":"default","tag":"Documentation","count":100},{"language":"default","tag":"Integrations","count":100},{"language":"default","tag":"Entitlement Management","count":67},{"language":"default","tag":"resources","count":34},{"language":"default","tag":"groups","count":32},{"language":"default","tag":"Getting Started","count":25},{"language":"default","tag":"Access Management","count":22},{"language":"default","tag":"Infrastructure","count":22}]},"assistantConfig":{"enableStarterQuestions":true,"enableContextualStarterQuestions":true,"deflection":{"enabled":true,"email":"support@opal.dev","showHelpButton":true}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/role-assignments/add-role-assignments","slug":"/api-reference/role-assignments/add-role-assignments","pageMetadata":{"title":"Add role assignments","description":"Grants one or more principals (user, group, or resource) access to one or more\nentities (resource or group). The request body is batched to match the GraphQL\n`addRoleAssignments` mutation, which this endpoint thin-wraps. The caller must\nhold the `EDIT_ASSIGNMENTS` role permission on every entity in the batch.\n\nOmit `access_level_remote_id` for entities that have a single default access\nlevel. Omit `duration_minutes` (or send `0`) for an indefinite grant.\n\n**Atomicity:** the batch is applied as a single transaction. If any entry\nfails input validation, authorization, lookup, or creation, **no entries\nare created** and the response identifies the first failing entry's\n`entity_id` and `principal_id` (and the request-array index for input\nvalidation errors). Clients should retry with the offending entry\nremoved; partial-success is intentionally not supported, matching the\nsemantics of the GraphQL `addRoleAssignments` mutation that this\nendpoint wraps.\n\nPrefer this endpoint for batch or programmatic use (e.g. Terraform). For a\nsingle grant on a specific entity/principal pair, the per-pair endpoints —\n`/resources/{id}/users/{id}`, `/groups/{id}/users/{id}`,\n`/groups/{id}/resources/{id}`, `/groups/{id}/containing-groups`,\n`/resources/{id}/non-human-identities/{id}` — are often simpler.\n","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /role-assignments","href":"/api-reference/role-assignments/add-role-assignments","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Grants one or more principals (user, group, or resource) access to one or more\\nentities (resource or group). The request body is batched to match the GraphQL\\n\", _jsx(_components.code, {\n children: \"addRoleAssignments\"\n }), \" mutation, which this endpoint thin-wraps. The caller must\\nhold the \", _jsx(_components.code, {\n children: \"EDIT_ASSIGNMENTS\"\n }), \" role permission on every entity in the batch.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Omit \", _jsx(_components.code, {\n children: \"access_level_remote_id\"\n }), \" for entities that have a single default access\\nlevel. Omit \", _jsx(_components.code, {\n children: \"duration_minutes\"\n }), \" (or send \", _jsx(_components.code, {\n children: \"0\"\n }), \") for an indefinite grant.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Atomicity:\"\n }), \" the batch is applied as a single transaction. If any entry\\nfails input validation, authorization, lookup, or creation, \", _jsx(_components.strong, {\n children: \"no entries\\nare created\"\n }), \" and the response identifies the first failing entry’s\\n\", _jsx(_components.code, {\n children: \"entity_id\"\n }), \" and \", _jsx(_components.code, {\n children: \"principal_id\"\n }), \" (and the request-array index for input\\nvalidation errors). Clients should retry with the offending entry\\nremoved; partial-success is intentionally not supported, matching the\\nsemantics of the GraphQL \", _jsx(_components.code, {\n children: \"addRoleAssignments\"\n }), \" mutation that this\\nendpoint wraps.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Prefer this endpoint for batch or programmatic use (e.g. Terraform). For a\\nsingle grant on a specific entity/principal pair, the per-pair endpoints —\\n\", _jsx(_components.code, {\n children: \"/resources/{id}/users/{id}\"\n }), \", \", _jsx(_components.code, {\n children: \"/groups/{id}/users/{id}\"\n }), \",\\n\", _jsx(_components.code, {\n children: \"/groups/{id}/resources/{id}\"\n }), \", \", _jsx(_components.code, {\n children: \"/groups/{id}/containing-groups\"\n }), \",\\n\", _jsx(_components.code, {\n children: \"/resources/{id}/non-human-identities/{id}\"\n }), \" — are often simpler.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Add role assignments","description":"Grants one or more principals (user, group, or resource) access to one or more\nentities (resource or group). The request body is batched to match the GraphQL\n`addRoleAssignments` mutation, which this endpoint thin-wraps. The caller must\nhold the `EDIT_ASSIGNMENTS` role permission on every entity in the batch.\n\nOmit `access_level_remote_id` for entities that have a single default access\nlevel. Omit `duration_minutes` (or send `0`) for an indefinite grant.\n\n**Atomicity:** the batch is applied as a single transaction. If any entry\nfails input validation, authorization, lookup, or creation, **no entries\nare created** and the response identifies the first failing entry's\n`entity_id` and `principal_id` (and the request-array index for input\nvalidation errors). Clients should retry with the offending entry\nremoved; partial-success is intentionally not supported, matching the\nsemantics of the GraphQL `addRoleAssignments` mutation that this\nendpoint wraps.\n\nPrefer this endpoint for batch or programmatic use (e.g. Terraform). For a\nsingle grant on a specific entity/principal pair, the per-pair endpoints —\n`/resources/{id}/users/{id}`, `/groups/{id}/users/{id}`,\n`/groups/{id}/resources/{id}`, `/groups/{id}/containing-groups`,\n`/resources/{id}/non-human-identities/{id}` — are often simpler.\n","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /role-assignments","href":"/api-reference/role-assignments/add-role-assignments","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/opalsecurity/d0e14c3cf9bbd682/changelog-scraper.js"],"openApiReferenceData":{"operation":{"summary":"Add role assignments","description":"Grants one or more principals (user, group, or resource) access to one or more\nentities (resource or group). The request body is batched to match the GraphQL\n`addRoleAssignments` mutation, which this endpoint thin-wraps. The caller must\nhold the `EDIT_ASSIGNMENTS` role permission on every entity in the batch.\n\nOmit `access_level_remote_id` for entities that have a single default access\nlevel. Omit `duration_minutes` (or send `0`) for an indefinite grant.\n\n**Atomicity:** the batch is applied as a single transaction. If any entry\nfails input validation, authorization, lookup, or creation, **no entries\nare created** and the response identifies the first failing entry's\n`entity_id` and `principal_id` (and the request-array index for input\nvalidation errors). Clients should retry with the offending entry\nremoved; partial-success is intentionally not supported, matching the\nsemantics of the GraphQL `addRoleAssignments` mutation that this\nendpoint wraps.\n\nPrefer this endpoint for batch or programmatic use (e.g. Terraform). For a\nsingle grant on a specific entity/principal pair, the per-pair endpoints —\n`/resources/{id}/users/{id}`, `/groups/{id}/users/{id}`,\n`/groups/{id}/resources/{id}`, `/groups/{id}/containing-groups`,\n`/resources/{id}/non-human-identities/{id}` — are often simpler.\n","operationId":"addRoleAssignments","requestBody":"868dac71-abee-4c32-bca2-4906b2c53d6f","responses":{"200":"d5bd847e-1245-47a4-8cc0-e51c5036b533","400":"bbea4b34-5eed-430a-b1bf-a13798722d21","403":"2dbd8979-e3b7-4fe8-b643-b60556915916","404":"432a4878-be9a-481b-bfe5-6f85fac65a00","409":"8bd16783-8404-4c98-a733-91be94a935fd","422":"a1191506-35a0-477a-b278-6846ebeb2633"},"security":["3dcfc798-20de-43bd-a507-0813bd08545c"],"tags":["role-assignments"],"method":"post","type":"path","servers":["cd7fac86-7b27-4377-b19a-d97056e81254"],"path":"/role-assignments","baseUrlOptions":["https://api.opal.dev/v1"],"title":"Add role assignments","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Request body for `POST /role-assignments`.","type":"object","required":["role_assignments"],"properties":{"role_assignments":{"description":"The list of role assignments to add.","items":{"description":"A single role assignment to create in a batch add request.","type":"object","required":["entity_id","entity_type","principal_id","principal_type"],"properties":{"entity_id":{"description":"The ID of the entity (resource or group) being accessed.","example":"1b978423-db0a-4037-a4cf-f79c60cb67b3","format":"uuid","type":"string","isRequired":true,"uniqueKey":"role_assignments.items.[INDEX].entity_id","typeLabel":"string\u003cuuid>"},"entity_type":{"type":"string","description":"The type of the entity being accessed. Must be `RESOURCE` or `GROUP`.","enum":["GROUP","RESOURCE","USER"],"example":"GROUP","isRequired":true,"uniqueKey":"role_assignments.items.[INDEX].entity_type","typeLabel":"enum\u003cstring>"},"principal_id":{"description":"The ID of the principal (user, group, or resource) being granted access.","example":"29827fb8-f2dd-4e80-9576-28e31e9934ac","format":"uuid","type":"string","isRequired":true,"uniqueKey":"role_assignments.items.[INDEX].principal_id","typeLabel":"string\u003cuuid>"},"principal_type":{"type":"string","description":"The type of the principal being granted access. Must be `RESOURCE`, `GROUP`, or `USER`.","enum":["GROUP","RESOURCE","USER"],"example":"GROUP","isRequired":true,"uniqueKey":"role_assignments.items.[INDEX].principal_type","typeLabel":"enum\u003cstring>"},"access_level_remote_id":{"oneOf":[{"description":"Remote ID of the access level to grant. Omit for entities that only have a single default access level.","type":"string","uniqueKey":"role_assignments.items.[INDEX].access_level_remote_id.oneOf.0","typeLabel":"string"},{"description":"Remote ID of the access level to grant. Omit for entities that only have a single default access level.","type":"null","uniqueKey":"role_assignments.items.[INDEX].access_level_remote_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"role_assignments.items.[INDEX].access_level_remote_id","typeLabel":"string | null"},"duration_minutes":{"oneOf":[{"description":"Duration of the grant in minutes. Omit or send `0` for an indefinite grant.","minimum":0,"type":"integer","uniqueKey":"role_assignments.items.[INDEX].duration_minutes.oneOf.0","typeLabel":"integer"},{"description":"Duration of the grant in minutes. Omit or send `0` for an indefinite grant.","minimum":0,"type":"null","uniqueKey":"role_assignments.items.[INDEX].duration_minutes.oneOf.1","typeLabel":"null"}],"uniqueKey":"role_assignments.items.[INDEX].duration_minutes","typeLabel":"integer | null"}},"uniqueKey":"role_assignments.items.[INDEX]","typeLabel":"object"},"minItems":1,"maxItems":100,"type":"array","isRequired":true,"uniqueKey":"role_assignments","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"role_assignments":[{"entity_id":"1b978423-db0a-4037-a4cf-f79c60cb67b3","entity_type":"GROUP","principal_id":"29827fb8-f2dd-4e80-9576-28e31e9934ac","principal_type":"GROUP","access_level_remote_id":"\u003cstring>","duration_minutes":1}]}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"d5bd847e-1245-47a4-8cc0-e51c5036b533":{"content":{"application/json":{"schema":{"description":"Response body for `POST /role-assignments`.","type":"object","required":["task_ids","entries"],"properties":{"task_ids":{"description":"Opaque IDs of push tasks enqueued to propagate the new assignments to end systems. Each ID is a base64-encoded, URL-safe string that mirrors the identifier returned by the GraphQL `addRoleAssignments` mutation.","items":{"type":"string","uniqueKey":"task_ids.items.[INDEX]","typeLabel":"string"},"type":"array","isRequired":true,"uniqueKey":"task_ids","typeLabel":"string[]"},"entries":{"description":"One entry per role assignment created, in request order.","items":{"description":"A single entry in the result of `POST /role-assignments`.","type":"object","required":["role_assignment"],"properties":{"role_assignment":{"description":"A role assignment representing access granted to a principal for an entity.","type":"object","required":["id","entity_id","entity_type","principal_id","principal_type"],"properties":{"id":{"description":"Unique identifier for the role assignment.","format":"uuid","type":"string","isRequired":true,"uniqueKey":"entries.items.[INDEX].role_assignment.id","typeLabel":"string\u003cuuid>"},"entity_id":{"description":"The ID of the entity (resource or group) being accessed.","format":"uuid","type":"string","isRequired":true,"uniqueKey":"entries.items.[INDEX].role_assignment.entity_id","typeLabel":"string\u003cuuid>"},"entity_type":{"description":"The type of an entity.","enum":["GROUP","RESOURCE","USER"],"example":"GROUP","type":"string","isRequired":true,"uniqueKey":"entries.items.[INDEX].role_assignment.entity_type","typeLabel":"enum\u003cstring>"},"principal_id":{"description":"The ID of the principal being granted access.","format":"uuid","type":"string","isRequired":true,"uniqueKey":"entries.items.[INDEX].role_assignment.principal_id","typeLabel":"string\u003cuuid>"},"principal_type":{"description":"The type of an entity.","enum":["GROUP","RESOURCE","USER"],"example":"GROUP","type":"string","isRequired":true,"uniqueKey":"entries.items.[INDEX].role_assignment.principal_type","typeLabel":"enum\u003cstring>"},"access_level":{"oneOf":[{"type":"object","description":"The level of access granted. Null when the entity does not define access levels.","required":["access_level_name","access_level_remote_id"],"example":{"access_level_name":"AdminRole","access_level_remote_id":"arn:aws:iam::590304332660:role/AdministratorAccess"},"properties":{"access_level_name":{"description":"The human-readable name of the access level.","example":"AdminRole","type":"string","isRequired":true,"uniqueKey":"entries.items.[INDEX].role_assignment.access_level.oneOf.0.access_level_name","typeLabel":"string"},"access_level_remote_id":{"description":"The machine-readable identifier of the access level.","example":"arn:aws:iam::590304332660:role/AdministratorAccess","type":"string","isRequired":true,"uniqueKey":"entries.items.[INDEX].role_assignment.access_level.oneOf.0.access_level_remote_id","typeLabel":"string"}},"uniqueKey":"entries.items.[INDEX].role_assignment.access_level.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"entries.items.[INDEX].role_assignment.access_level.oneOf.1","typeLabel":"null"}],"uniqueKey":"entries.items.[INDEX].role_assignment.access_level","typeLabel":"object | null"},"expiration":{"oneOf":[{"description":"When this access expires. Null when the grant is indefinite.","format":"date-time","type":"string","uniqueKey":"entries.items.[INDEX].role_assignment.expiration.oneOf.0","typeLabel":"string\u003cdate-time>"},{"description":"When this access expires. Null when the grant is indefinite.","format":"date-time","type":"null","uniqueKey":"entries.items.[INDEX].role_assignment.expiration.oneOf.1","typeLabel":"null"}],"uniqueKey":"entries.items.[INDEX].role_assignment.expiration","typeLabel":"string\u003cdate-time> | null"},"granted_at":{"oneOf":[{"description":"When this access was first granted.","format":"date-time","type":"string","uniqueKey":"entries.items.[INDEX].role_assignment.granted_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"description":"When this access was first granted.","format":"date-time","type":"null","uniqueKey":"entries.items.[INDEX].role_assignment.granted_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"entries.items.[INDEX].role_assignment.granted_at","typeLabel":"string\u003cdate-time> | null"}},"isRequired":true,"uniqueKey":"entries.items.[INDEX].role_assignment","typeLabel":"object"}},"uniqueKey":"entries.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"entries","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"task_ids":["\u003cstring>"],"entries":[{"role_assignment":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","entity_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","entity_type":"GROUP","principal_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","principal_type":"GROUP","access_level":{"access_level_name":"AdminRole","access_level_remote_id":"arn:aws:iam::590304332660:role/AdministratorAccess"},"expiration":"2023-11-07T05:31:56Z","granted_at":"2023-11-07T05:31:56Z"}}]}}},"exampleType":"generated"}},"description":"The requested role assignments were created.","exampleType":"generated"},"bbea4b34-5eed-430a-b1bf-a13798722d21":{"description":"Invalid request body: unknown field, missing required field, malformed JSON,\ninvalid enum (entity_type must be RESOURCE or GROUP; principal_type must be\nRESOURCE, GROUP, or USER), negative duration_minutes, or role_assignments\nbatch size outside the allowed range.\n","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"2dbd8979-e3b7-4fe8-b643-b60556915916":{"description":"Caller is not authorized to edit role assignments on one or more of the entities.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"432a4878-be9a-481b-bfe5-6f85fac65a00":{"description":"One or more referenced entities or principals does not exist in the organization.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"8bd16783-8404-4c98-a733-91be94a935fd":{"description":"One of the requested role assignments already exists. The error\nmessage identifies the offending entity_id and principal_id so a\nbatch client can locate the colliding entry. Matches the convention\nof the per-pair endpoints (`/resources/{id}/users/{id}`,\n`/groups/{id}/users/{id}`), which also return 409 for the same\ncondition.\n","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"a1191506-35a0-477a-b278-6846ebeb2633":{"description":"Request was syntactically valid but could not be fulfilled. Includes\ngroup nesting cycles, self-grants, invalid durations, access-level\nmismatches, assignments on computed groups or non-requestable\nresources, and unsupported entity/principal type combinations.\n","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"security":{"3dcfc798-20de-43bd-a507-0813bd08545c":{"BearerAuth":{"scheme":"bearer","type":"http","scopes":[],"schemeName":"BearerAuth"}}},"servers":{"cd7fac86-7b27-4377-b19a-d97056e81254":{"description":"Production","url":"https://api.opal.dev/v1"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"scheme":"bearer","type":"http","scopes":[],"schemeName":"BearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer authentication header of the form `Bearer \u003ctoken>`, where `\u003ctoken>` is your auth token.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"BearerAuth","name":"Authorization"}],"title":"BearerAuth"}]},"originalFileLocation":"https://app.opal.dev/openapi.yaml"},"subdomain":"opalsecurity","siteName":"Opal Security Docs","title":"Add role assignments - Opal Security Docs","contextualStarterQuestions":[],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"originalFileLocation":"api-reference/role-assignments/add-role-assignments.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Grants one or more principals (user, group, or resource) access to one or more entities (resource or group). The request body is batched to match the GraphQL addRoleAssignments mutation, which this endpoint thin-wraps. The caller must hold the EDIT_ASSIGNMENTS role permission on every entity in the batch. Omit access_level_remote_id for entities that have a single default access level. Omit duration_minutes (or send 0) for an indefinite grant. Atomicity: the batch is applied as a single transaction. If any entry fails input validation, authorization, lookup, or creation, no entries are created and the response identifies the first failing entry\u0026#x27;s entity_id and principal_id (and the request-array index for input validation errors). Clients should retry with the offending entry removed; partial-success is intentionally not supported, matching the semantics of the GraphQL addRoleAssignments mutation that this endpoint wraps. Prefer this endpoint for batch or programmatic use (e.g. Terraform). For a single grant on a specific entity/principal pair, the per-pair endpoints — /resources/{id}/users/{id}, /groups/{id}/users/{id}, /groups/{id}/resources/{id}, /groups/{id}/containing-groups, /resources/{id}/non-human-identities/{id} — are often simpler.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Opal Security Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/opalsecurity/t501z2uOx-XXqevB/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/opalsecurity/t501z2uOx-XXqevB/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/opalsecurity/t501z2uOx-XXqevB/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/opalsecurity/t501z2uOx-XXqevB/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/opalsecurity/t501z2uOx-XXqevB/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/opalsecurity/t501z2uOx-XXqevB/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/opalsecurity/t501z2uOx-XXqevB/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/opalsecurity/t501z2uOx-XXqevB/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/opalsecurity/t501z2uOx-XXqevB/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Add role assignments - Opal Security Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Grants one or more principals (user, group, or resource) access to one or more entities (resource or group). The request body is batched to match the GraphQL addRoleAssignments mutation, which this endpoint thin-wraps. The caller must hold the EDIT_ASSIGNMENTS role permission on every entity in the batch. Omit access_level_remote_id for entities that have a single default access level. Omit duration_minutes (or send 0) for an indefinite grant. Atomicity: the batch is applied as a single transaction. If any entry fails input validation, authorization, lookup, or creation, no entries are created and the response identifies the first failing entry\u0026#x27;s entity_id and principal_id (and the request-array index for input validation errors). Clients should retry with the offending entry removed; partial-success is intentionally not supported, matching the semantics of the GraphQL addRoleAssignments mutation that this endpoint wraps. Prefer this endpoint for batch or programmatic use (e.g. Terraform). For a single grant on a specific entity/principal pair, the per-pair endpoints — /resources/{id}/users/{id}, /groups/{id}/users/{id}, /groups/{id}/resources/{id}, /groups/{id}/containing-groups, /resources/{id}/non-human-identities/{id} — are often simpler.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Opal Security Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.opal.dev/api-reference/role-assignments/add-role-assignments\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://opalsecurity.mintlify.site/_mintlify/api/og/v2?division=role-assignments\u0026amp;title=Add+role+assignments\u0026amp;description=Grants+one+or+more+principals+%28user%2C+group%2C+or+resource%29+access+to+one+or+more%0Aentities+%28resource+or+group%29.+The+request+body+is+batched+to+match+the+GraphQL%0A%60a\u0026amp;theme=287ef1256bbb1bf2a61f3fd2\u0026amp;signature=a658b1715ef35959f1a0b7a77c4e2d6ea54aa5e2a53b755e0ee183fe45856951\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Add role assignments - Opal Security Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Grants one or more principals (user, group, or resource) access to one or more entities (resource or group). The request body is batched to match the GraphQL addRoleAssignments mutation, which this endpoint thin-wraps. The caller must hold the EDIT_ASSIGNMENTS role permission on every entity in the batch. Omit access_level_remote_id for entities that have a single default access level. Omit duration_minutes (or send 0) for an indefinite grant. Atomicity: the batch is applied as a single transaction. If any entry fails input validation, authorization, lookup, or creation, no entries are created and the response identifies the first failing entry\u0026#x27;s entity_id and principal_id (and the request-array index for input validation errors). Clients should retry with the offending entry removed; partial-success is intentionally not supported, matching the semantics of the GraphQL addRoleAssignments mutation that this endpoint wraps. Prefer this endpoint for batch or programmatic use (e.g. Terraform). For a single grant on a specific entity/principal pair, the per-pair endpoints — /resources/{id}/users/{id}, /groups/{id}/users/{id}, /groups/{id}/resources/{id}, /groups/{id}/containing-groups, /resources/{id}/non-human-identities/{id} — are often simpler.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://opalsecurity.mintlify.site/_mintlify/api/og/v2?division=role-assignments\u0026amp;title=Add+role+assignments\u0026amp;description=Grants+one+or+more+principals+%28user%2C+group%2C+or+resource%29+access+to+one+or+more%0Aentities+%28resource+or+group%29.+The+request+body+is+batched+to+match+the+GraphQL%0A%60a\u0026amp;theme=287ef1256bbb1bf2a61f3fd2\u0026amp;signature=a658b1715ef35959f1a0b7a77c4e2d6ea54aa5e2a53b755e0ee183fe45856951\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/opalsecurity/t501z2uOx-XXqevB/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Opal Security Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0C7997\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.opal.dev/api-reference/role-assignments/add-role-assignments\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/role-assignments/add-role-assignments.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.opal.dev/#organization\",\"name\":\"Opal Security Docs\",\"url\":\"https://docs.opal.dev\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/opalsecurity/FBbZyeMPZrA69UcV/logo/logo-dark.svg?fit=max\u0026auto=format\u0026n=FBbZyeMPZrA69UcV\u0026q=85\u0026s=93a4bd75f157f9f0ab43cdf4d715b5cd\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.opal.dev#website\",\"name\":\"Opal Security Docs\",\"url\":\"https://docs.opal.dev\",\"publisher\":{\"@id\":\"https://docs.opal.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.opal.dev/api-reference/role-assignments/add-role-assignments#webpage\",\"url\":\"https://docs.opal.dev/api-reference/role-assignments/add-role-assignments\",\"name\":\"Add role assignments\",\"description\":\"Grants one or more principals (user, group, or resource) access to one or more entities (resource or group). The request body is batched to match the GraphQL addRoleAssignments mutation, which this endpoint thin-wraps. The caller must hold the EDIT_ASSIGNMENTS role permission on every entity in the batch. Omit access_level_remote_id for entities that have a single default access level. Omit duration_minutes (or send 0) for an indefinite grant. Atomicity: the batch is applied as a single transaction. If any entry fails input validation, authorization, lookup, or creation, no entries are created and the response identifies the first failing entry's entity_id and principal_id (and the request-array index for input validation errors). Clients should retry with the offending entry removed; partial-success is intentionally not supported, matching the semantics of the GraphQL addRoleAssignments mutation that this endpoint wraps. Prefer this endpoint for batch or programmatic use (e.g. Terraform). For a single grant on a specific entity/principal pair, the per-pair endpoints — /resources/{id}/users/{id}, /groups/{id}/users/{id}, /groups/{id}/resources/{id}, /groups/{id}/containing-groups, /resources/{id}/non-human-identities/{id} — are often simpler.\",\"isPartOf\":{\"@id\":\"https://docs.opal.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.opal.dev/api-reference/role-assignments/add-role-assignments#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.opal.dev/api-reference/role-assignments/add-role-assignments#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Opal API\",\"item\":\"https://docs.opal.dev/api-reference/agent-activity/report-agent-activity\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"role-assignments\",\"item\":\"https://docs.opal.dev/api-reference/role-assignments/list-role-assignments\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Add role assignments\",\"item\":\"https://docs.opal.dev/api-reference/role-assignments/add-role-assignments\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.opal.dev/api-reference/role-assignments/add-role-assignments#apireference\",\"headline\":\"Add role assignments\",\"name\":\"Add role assignments\",\"description\":\"Grants one or more principals (user, group, or resource) access to one or more entities (resource or group). The request body is batched to match the GraphQL addRoleAssignments mutation, which this endpoint thin-wraps. The caller must hold the EDIT_ASSIGNMENTS role permission on every entity in the batch. Omit access_level_remote_id for entities that have a single default access level. Omit duration_minutes (or send 0) for an indefinite grant. Atomicity: the batch is applied as a single transaction. If any entry fails input validation, authorization, lookup, or creation, no entries are created and the response identifies the first failing entry's entity_id and principal_id (and the request-array index for input validation errors). Clients should retry with the offending entry removed; partial-success is intentionally not supported, matching the semantics of the GraphQL addRoleAssignments mutation that this endpoint wraps. Prefer this endpoint for batch or programmatic use (e.g. Terraform). For a single grant on a specific entity/principal pair, the per-pair endpoints — /resources/{id}/users/{id}, /groups/{id}/users/{id}, /groups/{id}/resources/{id}, /groups/{id}/containing-groups, /resources/{id}/non-human-identities/{id} — are often simpler.\",\"url\":\"https://docs.opal.dev/api-reference/role-assignments/add-role-assignments\",\"mainEntityOfPage\":{\"@id\":\"https://docs.opal.dev/api-reference/role-assignments/add-role-assignments#webpage\"},\"publisher\":{\"@id\":\"https://docs.opal.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.opal.dev#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Opal Security Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Opal Security Docs","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/docs/welcome"}]},{"tab":"Integrations","pages":[{"title":"Integrations","href":"/integrations/overview"}]},{"tab":"API Reference","groups":[{"group":"API Concepts","pages":[{"title":"Authentication","href":"/reference/authentication"},{"title":"Pagination","href":"/reference/pagination"},{"title":"Identifying End System Objects","href":"/reference/end-system-objects"},{"title":"Opal API Rate Limits","href":"/reference/opal-api-rate-limits"}]},{"group":"SDKs","pages":[{"title":"Overview","href":"/reference/opal-sdks"}]},{"group":"Opal API","pages":[{"group":"agent-activity","pages":[{"title":"Report agent activity","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /agent-activity","href":"/api-reference/agent-activity/report-agent-activity"},{"title":"Get agent activity client settings","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /agent-activity/client-settings","href":"/api-reference/agent-activity/get-agent-activity-client-settings"},{"title":"Report MCP server configuration","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /agent-activity/mcp-config","href":"/api-reference/agent-activity/report-mcp-server-configuration"},{"title":"Anthropic inference hook verdict","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /inference-hooks/anthropic","href":"/api-reference/agent-activity/anthropic-inference-hook-verdict"},{"title":"Get the agent kill switch","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /agent-kill-switch","href":"/api-reference/agent-activity/get-the-agent-kill-switch"},{"title":"Set the agent kill switch","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /agent-kill-switch","href":"/api-reference/agent-activity/set-the-agent-kill-switch"}]},{"group":"apps","pages":[{"title":"Get apps","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /apps","href":"/api-reference/apps/get-apps"},{"title":"Create app","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /apps","href":"/api-reference/apps/create-app"},{"title":"Get app by ID","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /apps/{app_id}","href":"/api-reference/apps/get-app-by-id"},{"title":"Update app","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /apps/{app_id}","href":"/api-reference/apps/update-app"},{"title":"Delete app","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /apps/{app_id}","href":"/api-reference/apps/delete-app"},{"title":"Get app visibility","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /apps/{app_id}/visibility","href":"/api-reference/apps/get-app-visibility"},{"title":"Set app visibility","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /apps/{app_id}/visibility","href":"/api-reference/apps/set-app-visibility"},{"title":"Get sync errors","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /sync_errors","href":"/api-reference/apps/get-sync_errors"}]},{"group":"bundles","pages":[{"title":"Get bundles","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /bundles","href":"/api-reference/bundles/get-bundles"},{"title":"Post bundles","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /bundles","href":"/api-reference/bundles/post-bundles"},{"title":"Get bundle by ID","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /bundles/{bundle_id}","href":"/api-reference/bundles/get-bundle-by-id"},{"title":"Put bundles","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /bundles/{bundle_id}","href":"/api-reference/bundles/put-bundles"},{"title":"Delete bundles","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /bundles/{bundle_id}","href":"/api-reference/bundles/delete-bundles"},{"title":"Get bundles resources","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /bundles/{bundle_id}/resources","href":"/api-reference/bundles/get-bundles-resources"},{"title":"Post bundles resources","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /bundles/{bundle_id}/resources","href":"/api-reference/bundles/post-bundles-resources"},{"title":"Delete bundles resources","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /bundles/{bundle_id}/resources/{resource_id}","href":"/api-reference/bundles/delete-bundles-resources"},{"title":"Get bundles groups","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /bundles/{bundle_id}/groups","href":"/api-reference/bundles/get-bundles-groups"},{"title":"Post bundles groups","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /bundles/{bundle_id}/groups","href":"/api-reference/bundles/post-bundles-groups"},{"title":"Delete bundles groups","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /bundles/{bundle_id}/groups/{group_id}","href":"/api-reference/bundles/delete-bundles-groups"},{"title":"Get bundles visibility","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /bundles/{bundle_id}/visibility","href":"/api-reference/bundles/get-bundles-visibility"},{"title":"Put bundles visibility","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /bundles/{bundle_id}/visibility","href":"/api-reference/bundles/put-bundles-visibility"}]},{"group":"campaigns","pages":[{"title":"Get campaigns","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /campaigns","href":"/api-reference/campaigns/get-campaigns"},{"title":"Post campaigns","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /campaigns","href":"/api-reference/campaigns/post-campaigns"},{"title":"Get campaign by ID","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /campaigns/{campaign_id}","href":"/api-reference/campaigns/get-campaign-by-id"},{"title":"Update campaign","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /campaigns/{campaign_id}","href":"/api-reference/campaigns/update-campaign"},{"title":"Start campaign","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /campaigns/{campaign_id}/start","href":"/api-reference/campaigns/start-campaign"},{"title":"Stop campaign","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /campaigns/{campaign_id}/stop","href":"/api-reference/campaigns/stop-campaign"},{"title":"End campaign","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /campaigns/{campaign_id}/end","href":"/api-reference/campaigns/end-campaign"},{"title":"List campaign items","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /campaigns/{campaign_id}/items","href":"/api-reference/campaigns/list-campaign-items"},{"title":"Update campaign item reviewers","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /campaigns/{campaign_id}/item-reviewers","href":"/api-reference/campaigns/update-campaign-item-reviewers"},{"title":"Submit campaign item review decisions","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /campaigns/{campaign_id}/reviews","href":"/api-reference/campaigns/submit-campaign-item-review-decisions"},{"title":"List viewer campaign items","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /campaigns/{campaign_id}/viewer-items","href":"/api-reference/campaigns/list-viewer-campaign-items"}]},{"group":"configuration-templates","pages":[{"title":"Get configuration templates","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /configuration-templates","href":"/api-reference/configuration-templates/get-configuration-templates"},{"title":"Put configuration templates","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /configuration-templates","href":"/api-reference/configuration-templates/put-configuration-templates"},{"title":"Post configuration templates","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /configuration-templates","href":"/api-reference/configuration-templates/post-configuration-templates"},{"title":"Delete configuration templates","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /configuration-templates/{configuration_template_id}","href":"/api-reference/configuration-templates/delete-configuration-templates"}]},{"group":"event-streams","pages":[{"title":"Get event streams","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /event-streams","href":"/api-reference/event-streams/get-event-streams"},{"title":"Create event stream","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /event-streams","href":"/api-reference/event-streams/create-event-stream"},{"title":"Update event stream","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /event-streams/{event_stream_id}","href":"/api-reference/event-streams/update-event-stream"},{"title":"Delete event stream","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /event-streams/{event_stream_id}","href":"/api-reference/event-streams/delete-event-stream"}]},{"group":"events","pages":[{"title":"Get events","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /events","href":"/api-reference/events/get-events"},{"title":"Get event by ID","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /events/{event_id}","href":"/api-reference/events/get-event-by-id"}]},{"group":"groups","pages":[{"title":"Get groups","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /groups","href":"/api-reference/groups/get-groups"},{"title":"Put groups","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /groups","href":"/api-reference/groups/put-groups"},{"title":"Post groups","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /groups","href":"/api-reference/groups/post-groups"},{"title":"Get group by ID","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /groups/{group_id}","href":"/api-reference/groups/get-group-by-id"},{"title":"Delete groups","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /groups/{group_id}","href":"/api-reference/groups/delete-groups"},{"title":"Get the ID of the configuration template linked to a group","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /groups/{group_id}/configuration-template","href":"/api-reference/groups/get-the-id-of-the-configuration-template-linked-to-a-group"},{"title":"Set the ID of the configuration template linked to a group","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /groups/{group_id}/configuration-template","href":"/api-reference/groups/set-the-id-of-the-configuration-template-linked-to-a-group"},{"title":"Get groups message channels","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /groups/{group_id}/message-channels","href":"/api-reference/groups/get-groups-message-channels"},{"title":"Put groups message channels","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /groups/{group_id}/message-channels","href":"/api-reference/groups/put-groups-message-channels"},{"title":"Get groups on call schedules","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /groups/{group_id}/on-call-schedules","href":"/api-reference/groups/get-groups-on-call-schedules"},{"title":"Put groups on call schedules","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /groups/{group_id}/on-call-schedules","href":"/api-reference/groups/put-groups-on-call-schedules"},{"title":"Get group access levels","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /groups/{group_id}/access_levels","href":"/api-reference/groups/get-group-access-levels"},{"title":"Get groups resources","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /groups/{group_id}/resources","href":"/api-reference/groups/get-groups-resources"},{"title":"Put groups resources","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /groups/{group_id}/resources","href":"/api-reference/groups/put-groups-resources"},{"title":"Get member groups","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /groups/{group_id}/groups","href":"/api-reference/groups/get-member-groups"},{"title":"Get nested groups","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /groups/{group_id}/containing-groups","href":"/api-reference/groups/get-nested-groups"},{"title":"Post groups containing groups","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /groups/{group_id}/containing-groups","href":"/api-reference/groups/post-groups-containing-groups"},{"title":"Get nested group by ID","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /groups/{group_id}/containing-groups/{containing_group_id}","href":"/api-reference/groups/get-nested-group-by-id"},{"title":"Delete groups containing groups","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /groups/{group_id}/containing-groups/{containing_group_id}","href":"/api-reference/groups/delete-groups-containing-groups"},{"title":"Post groups resources","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /groups/{group_id}/resources/{resource_id}","href":"/api-reference/groups/post-groups-resources"},{"title":"Get groups visibility","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /groups/{group_id}/visibility","href":"/api-reference/groups/get-groups-visibility"},{"title":"Put groups visibility","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /groups/{group_id}/visibility","href":"/api-reference/groups/put-groups-visibility"},{"title":"Get groups reviewers","deprecated":true,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /groups/{group_id}/reviewers","href":"/api-reference/groups/get-groups-reviewers"},{"title":"Put groups reviewers","deprecated":true,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /groups/{group_id}/reviewers","href":"/api-reference/groups/put-groups-reviewers"},{"title":"Get groups reviewer stages","deprecated":true,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /groups/{group_id}/reviewer-stages","href":"/api-reference/groups/get-groups-reviewer-stages"},{"title":"Put groups reviewer stages","deprecated":true,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /groups/{group_id}/reviewer-stages","href":"/api-reference/groups/put-groups-reviewer-stages"},{"title":"Get groups tags","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /groups/{group_id}/tags","href":"/api-reference/groups/get-groups-tags"},{"title":"Get groups users","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /groups/{group_id}/users","href":"/api-reference/groups/get-groups-users"},{"title":"Put groups users","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /groups/{group_id}/users/{user_id}","href":"/api-reference/groups/put-groups-users"},{"title":"Post groups users","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /groups/{group_id}/users/{user_id}","href":"/api-reference/groups/post-groups-users"},{"title":"Delete groups users","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /groups/{group_id}/users/{user_id}","href":"/api-reference/groups/delete-groups-users"},{"title":"Get groupsusers","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /groups/users/{user_id}","href":"/api-reference/groups/get-groupsusers"}]},{"group":"group-bindings","pages":[{"title":"Get group bindings","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /group-bindings","href":"/api-reference/group-bindings/get-group-bindings"},{"title":"Put group bindings","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /group-bindings","href":"/api-reference/group-bindings/put-group-bindings"},{"title":"Post group bindings","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /group-bindings","href":"/api-reference/group-bindings/post-group-bindings"},{"title":"Get group binding by ID","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /group-bindings/{group_binding_id}","href":"/api-reference/group-bindings/get-group-binding-by-id"},{"title":"Delete group bindings","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /group-bindings/{group_binding_id}","href":"/api-reference/group-bindings/delete-group-bindings"}]},{"group":"idp-group-mappings","pages":[{"title":"Get idp group mappings","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /idp-group-mappings/{app_resource_id}","href":"/api-reference/idp-group-mappings/get-idp-group-mappings"},{"title":"Put idp group mappings","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /idp-group-mappings/{app_resource_id}","href":"/api-reference/idp-group-mappings/put-idp-group-mappings"},{"title":"Get idp group mappings groups","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /idp-group-mappings/{app_resource_id}/groups/{group_id}","href":"/api-reference/idp-group-mappings/get-idp-group-mappings-groups"},{"title":"Post idp group mappings groups","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /idp-group-mappings/{app_resource_id}/groups/{group_id}","href":"/api-reference/idp-group-mappings/post-idp-group-mappings-groups"},{"title":"Delete idp group mappings groups","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /idp-group-mappings/{app_resource_id}/groups/{group_id}","href":"/api-reference/idp-group-mappings/delete-idp-group-mappings-groups"}]},{"group":"opal-scripts","pages":[{"title":"List OpalScripts","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /opal-scripts","href":"/api-reference/opal-scripts/list-opalscripts"},{"title":"Create OpalScript","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /opal-scripts","href":"/api-reference/opal-scripts/create-opalscript"},{"title":"Get OpalScript by ID","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /opal-scripts/{opal_script_id}","href":"/api-reference/opal-scripts/get-opalscript-by-id"},{"title":"Update OpalScript","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /opal-scripts/{opal_script_id}","href":"/api-reference/opal-scripts/update-opalscript"},{"title":"Delete OpalScript","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /opal-scripts/{opal_script_id}","href":"/api-reference/opal-scripts/delete-opalscript"},{"title":"Get OpalScript by name","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /opal-scripts/name/{opal_script_name}","href":"/api-reference/opal-scripts/get-opalscript-by-name"}]},{"group":"owners","pages":[{"title":"Get owners","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /owners","href":"/api-reference/owners/get-owners"},{"title":"Put owners","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /owners","href":"/api-reference/owners/put-owners"},{"title":"Post owners","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /owners","href":"/api-reference/owners/post-owners"},{"title":"Get owner by ID","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /owners/{owner_id}","href":"/api-reference/owners/get-owner-by-id"},{"title":"Delete owners","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /owners/{owner_id}","href":"/api-reference/owners/delete-owners"},{"title":"Get ownersname","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /owners/name/{owner_name}","href":"/api-reference/owners/get-ownersname"},{"title":"Get owners users","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /owners/{owner_id}/users","href":"/api-reference/owners/get-owners-users"},{"title":"Put owners users","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /owners/{owner_id}/users","href":"/api-reference/owners/put-owners-users"}]},{"group":"request-templates","pages":[{"title":"Get request templates","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /request-templates","href":"/api-reference/request-templates/get-request-templates"},{"title":"Put request templates","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /request-templates","href":"/api-reference/request-templates/put-request-templates"},{"title":"Post request templates","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /request-templates","href":"/api-reference/request-templates/post-request-templates"},{"title":"Get request templates 1","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /request-templates/{request_template_id}","href":"/api-reference/request-templates/get-request-templates-1"},{"title":"Delete request templates","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /request-templates/{request_template_id}","href":"/api-reference/request-templates/delete-request-templates"}]},{"group":"requests","pages":[{"title":"Get requests","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /requests","href":"/api-reference/requests/get-requests"},{"title":"Post requests","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /requests","href":"/api-reference/requests/post-requests"},{"title":"Get requests via Relay","deprecated":true,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /requests/relay","href":"/api-reference/requests/get-requests-via-relay"},{"title":"Get request by ID","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /requests/{id}","href":"/api-reference/requests/get-request-by-id"},{"title":"Post requests approve","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /requests/{id}/approve","href":"/api-reference/requests/post-requests-approve"},{"title":"Post requests deny","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /requests/{id}/deny","href":"/api-reference/requests/post-requests-deny"},{"title":"Cancel request","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /requests/{id}/cancel","href":"/api-reference/requests/cancel-request"},{"title":"Escalate request to skip-manager","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /requests/{id}/escalate","href":"/api-reference/requests/escalate-request-to-skip-manager"},{"title":"Send request reminder","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /requests/{id}/remind","href":"/api-reference/requests/send-request-reminder"},{"title":"Send reminder to a reviewer","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /requests/{id}/reviewers/{reviewer_id}/remind","href":"/api-reference/requests/send-reminder-to-a-reviewer"},{"title":"Get requests comments","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /requests/{id}/comments","href":"/api-reference/requests/get-requests-comments"},{"title":"Post requests comments","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /requests/{id}/comments","href":"/api-reference/requests/post-requests-comments"}]},{"group":"role-assignments","pages":[{"title":"List role assignments","description":"Returns a paginated list of role assignments. This endpoint is\n**admin-only**: the caller's bearer token must belong to a user with the\nadmin or read-only admin role. Non-admin callers receive 403.\n\nMirrors the GraphQL `directRoleAssignments` query and shares the same\nunderlying code path, so pagination order, sort default\n(`first_granted_at` DESC), and the set of grants returned are identical\nacross the two surfaces.\n\nThe REST filter surface is intentionally narrower on first ship — sort,\nrisk-factor filters, text search, access-scope filters, the\nagents/humans toggle, and access-level filtering are deferred to a\nfuture revision. For a single entity/principal pair, the per-pair\nendpoints — `/resources/{resource_id}/users`,\n`/resources/{resource_id}/groups`,\n`/resources/{resource_id}/non-human-identities`,\n`/groups/{group_id}/users`, `/groups/{group_id}/containing-groups` —\nare often simpler.\n","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /role-assignments","href":"/api-reference/role-assignments/list-role-assignments"},{"title":"Add role assignments","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /role-assignments","href":"/api-reference/role-assignments/add-role-assignments"},{"title":"Remove role assignments","description":"Revoke one or more role assignments. Each entry identifies a specific\nstored grant by the 5-tuple `(entity_id, entity_type, principal_id,\nprincipal_type, access_level_remote_id)` — see the field description\non `access_level_remote_id` for when it must be supplied and when it\nmust be omitted. The call is idempotent: an entry that does not match\nany stored grant is silently skipped and absent from `entries` in the\nresponse. Caller must have `EDIT_ASSIGNMENTS` on each entity.\n","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /role-assignments","href":"/api-reference/role-assignments/remove-role-assignments"}]},{"group":"resources","pages":[{"title":"Get resources","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /resources","href":"/api-reference/resources/get-resources"},{"title":"Put resources","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /resources","href":"/api-reference/resources/put-resources"},{"title":"Post resources","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /resources","href":"/api-reference/resources/post-resources"},{"title":"Get resource by ID","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /resources/{resource_id}","href":"/api-reference/resources/get-resource-by-id"},{"title":"Delete resources","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /resources/{resource_id}","href":"/api-reference/resources/delete-resources"},{"title":"Get the ID of the configuration template linked to a resource","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /resources/{resource_id}/configuration-template","href":"/api-reference/resources/get-the-id-of-the-configuration-template-linked-to-a-resource"},{"title":"Set the ID of the configuration template linked to a resource","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /resources/{resource_id}/configuration-template","href":"/api-reference/resources/set-the-id-of-the-configuration-template-linked-to-a-resource"},{"title":"Get resources message channels","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /resources/{resource_id}/message-channels","href":"/api-reference/resources/get-resources-message-channels"},{"title":"Put resources message channels","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /resources/{resource_id}/message-channels","href":"/api-reference/resources/put-resources-message-channels"},{"title":"Get resources visibility","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /resources/{resource_id}/visibility","href":"/api-reference/resources/get-resources-visibility"},{"title":"Put resources visibility","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /resources/{resource_id}/visibility","href":"/api-reference/resources/put-resources-visibility"},{"title":"Get resources reviewers","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /resources/{resource_id}/reviewers","href":"/api-reference/resources/get-resources-reviewers"},{"title":"Put resources reviewers","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /resources/{resource_id}/reviewers","href":"/api-reference/resources/put-resources-reviewers"},{"title":"Get resources reviewer stages","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /resources/{resource_id}/reviewer-stages","href":"/api-reference/resources/get-resources-reviewer-stages"},{"title":"Put resources reviewer stages","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /resources/{resource_id}/reviewer-stages","href":"/api-reference/resources/put-resources-reviewer-stages"},{"title":"Get resources non human identities","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /resources/{resource_id}/non-human-identities","href":"/api-reference/resources/get-resources-non-human-identities"},{"title":"Get resource users","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /resources/{resource_id}/users","href":"/api-reference/resources/get-resource-users"},{"title":"Post resources non human identities","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /resources/{resource_id}/non-human-identities/{non_human_identity_id}","href":"/api-reference/resources/post-resources-non-human-identities"},{"title":"Delete resources non human identities","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /resources/{resource_id}/non-human-identities/{non_human_identity_id}","href":"/api-reference/resources/delete-resources-non-human-identities"},{"title":"Get resource user","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /resources/{resource_id}/users/{user_id}","href":"/api-reference/resources/get-resource-user"},{"title":"Put resources users","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /resources/{resource_id}/users/{user_id}","href":"/api-reference/resources/put-resources-users"},{"title":"Post resources users","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /resources/{resource_id}/users/{user_id}","href":"/api-reference/resources/post-resources-users"},{"title":"Delete resources users","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /resources/{resource_id}/users/{user_id}","href":"/api-reference/resources/delete-resources-users"},{"title":"Get resource user access status ","deprecated":true,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /resource-user-access-status/{resource_id}/{user_id}","href":"/api-reference/resources/get-resource-user-access-status-"},{"title":"Get resources tags","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /resources/{resource_id}/tags","href":"/api-reference/resources/get-resources-tags"},{"title":"Get resources scoped role permissions","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /resources/{resource_id}/scoped-role-permissions","href":"/api-reference/resources/get-resources-scoped-role-permissions"},{"title":"Put resources scoped role permissions","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /resources/{resource_id}/scoped-role-permissions","href":"/api-reference/resources/put-resources-scoped-role-permissions"},{"title":"Get resources custom access levels","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /resources/{resource_id}/custom-access-levels","href":"/api-reference/resources/get-resources-custom-access-levels"},{"title":"Post resources custom access levels","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /resources/{resource_id}/custom-access-levels","href":"/api-reference/resources/post-resources-custom-access-levels"},{"title":"Delete resources custom access levels","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /resources/{resource_id}/custom-access-levels/{access_level_remote_id}","href":"/api-reference/resources/delete-resources-custom-access-levels"},{"title":"Patch resources custom access levels","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml patch /resources/{resource_id}/custom-access-levels/{access_level_remote_id}","href":"/api-reference/resources/patch-resources-custom-access-levels"},{"title":"Get resourcesusers","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /resources/users/{user_id}","href":"/api-reference/resources/get-resourcesusers"},{"title":"Get resources groups","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /resources/{resource_id}/groups","href":"/api-reference/resources/get-resources-groups"},{"title":"Get resource access levels","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /resources/{resource_id}/access_levels","href":"/api-reference/resources/get-resource-access-levels"}]},{"group":"non-human-identities","pages":[{"title":"Get non human identities","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /non-human-identities","href":"/api-reference/non-human-identities/get-non-human-identities"}]},{"group":"paladin","pages":[{"title":"Create Paladin","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /paladin","href":"/api-reference/paladin/create-paladin"},{"title":"Get Paladin by ID","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /paladin/{paladin_id}","href":"/api-reference/paladin/get-paladin-by-id"},{"title":"Update Paladin","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /paladin/{paladin_id}","href":"/api-reference/paladin/update-paladin"},{"title":"Delete Paladin","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /paladin/{paladin_id}","href":"/api-reference/paladin/delete-paladin"},{"title":"Get Paladins by name","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /paladin/name/{paladin_name}","href":"/api-reference/paladin/get-paladins-by-name"},{"title":"List Paladin context sources","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /paladin/{paladin_id}/context-sources","href":"/api-reference/paladin/list-paladin-context-sources"},{"title":"Add a Paladin context source","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /paladin/{paladin_id}/context-sources","href":"/api-reference/paladin/add-a-paladin-context-source"},{"title":"Remove a Paladin context source","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /paladin/{paladin_id}/context-sources/{context_source_id}","href":"/api-reference/paladin/remove-a-paladin-context-source"}]},{"group":"service-users","pages":[{"title":"Create service user","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /service-users","href":"/api-reference/service-users/create-service-user"}]},{"group":"sessions","pages":[{"title":"Get sessions","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /sessions","href":"/api-reference/sessions/get-sessions"}]},{"group":"users","pages":[{"title":"Get user","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /user","href":"/api-reference/users/get-user"},{"title":"Get users","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /users","href":"/api-reference/users/get-users"},{"title":"Post users","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /users","href":"/api-reference/users/post-users"},{"title":"Get user by ID","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /users/{user_id}","href":"/api-reference/users/get-user-by-id"},{"title":"Delete users","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /users/{user_id}","href":"/api-reference/users/delete-users"},{"title":"Patch users","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml patch /users/{user_id}","href":"/api-reference/users/patch-users"},{"title":"Reset a user's Opal MFA","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /users/{user_id}/mfa/reset","href":"/api-reference/users/reset-a-users-opal-mfa"},{"title":"Revoke all of a user's access","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /users/{user_id}/revoke-all","href":"/api-reference/users/revoke-all-of-a-users-access"},{"title":"Get usersremote users","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /users/remote_users","href":"/api-reference/users/get-usersremote_users"},{"title":"Get userswhoami","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /users/whoami","href":"/api-reference/users/get-userswhoami"},{"title":"Get users tags","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /users/{user_id}/tags","href":"/api-reference/users/get-users-tags"}]},{"group":"access-rules","pages":[{"title":"Get access rules","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /access-rules","href":"/api-reference/access-rules/get-access-rules"},{"title":"Post access rules","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /access-rules","href":"/api-reference/access-rules/post-access-rules"},{"title":"Get access rules 1","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /access-rules/{access_rule_id}","href":"/api-reference/access-rules/get-access-rules-1"},{"title":"Put access rules","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml put /access-rules/{access_rule_id}","href":"/api-reference/access-rules/put-access-rules"}]},{"group":"tags","pages":[{"title":"Get tag by ID","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /tag/{tag_id}","href":"/api-reference/tags/get-tag-by-id"},{"title":"Delete tag","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /tag/{tag_id}","href":"/api-reference/tags/delete-tag"},{"title":"Get tag","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /tag","href":"/api-reference/tags/get-tag"},{"title":"Post tag","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /tag","href":"/api-reference/tags/post-tag"},{"title":"Get tags","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /tags","href":"/api-reference/tags/get-tags"},{"title":"Post tags users","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /tags/{tag_id}/users/{user_id}","href":"/api-reference/tags/post-tags-users"},{"title":"Delete tags users","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /tags/{tag_id}/users/{user_id}","href":"/api-reference/tags/delete-tags-users"},{"title":"Post tags groups","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /tags/{tag_id}/groups/{group_id}","href":"/api-reference/tags/post-tags-groups"},{"title":"Delete tags groups","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /tags/{tag_id}/groups/{group_id}","href":"/api-reference/tags/delete-tags-groups"},{"title":"Post tags resources","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /tags/{tag_id}/resources/{resource_id}","href":"/api-reference/tags/post-tags-resources"},{"title":"Delete tags resources","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /tags/{tag_id}/resources/{resource_id}","href":"/api-reference/tags/delete-tags-resources"}]},{"group":"message-channels","pages":[{"title":"Get message channels","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /message-channels","href":"/api-reference/message-channels/get-message-channels"},{"title":"Post message channels","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /message-channels","href":"/api-reference/message-channels/post-message-channels"},{"title":"Get message channel by ID","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /message-channels/{message_channel_id}","href":"/api-reference/message-channels/get-message-channel-by-id"}]},{"group":"on-call-schedules","pages":[{"title":"Get on call schedules","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /on-call-schedules","href":"/api-reference/on-call-schedules/get-on-call-schedules"},{"title":"Post on call schedules","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /on-call-schedules","href":"/api-reference/on-call-schedules/post-on-call-schedules"},{"title":"Get on call schedule by ID","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /on-call-schedules/{on_call_schedule_id}","href":"/api-reference/on-call-schedules/get-on-call-schedule-by-id"}]},{"group":"opal-queries","pages":[{"title":"Run an ad-hoc OpalQuery","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /queries/run","href":"/api-reference/opal-queries/run-an-ad-hoc-opalquery"}]},{"group":"tokens","pages":[{"title":"Get tokens","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /tokens","href":"/api-reference/tokens/get-tokens"},{"title":"Create token","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /tokens","href":"/api-reference/tokens/create-token"},{"title":"Delete token","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /tokens/{token_id}","href":"/api-reference/tokens/delete-token"}]},{"group":"uars","pages":[{"title":"Get uars","deprecated":true,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /uars","href":"/api-reference/uars/get-uars"},{"title":"Post uar","deprecated":true,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /uar","href":"/api-reference/uars/post-uar"},{"title":"Get uar","deprecated":true,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /uar/{uar_id}","href":"/api-reference/uars/get-uar"}]},{"group":"delegations","pages":[{"title":"Get delegations","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /delegations","href":"/api-reference/delegations/get-delegations"},{"title":"Post delegations","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml post /delegations","href":"/api-reference/delegations/post-delegations"},{"title":"Get delegation by ID","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml get /delegations/{delegation_id}","href":"/api-reference/delegations/get-delegation-by-id"},{"title":"Delete delegations","deprecated":null,"version":null,"openapi":"https://app.opal.dev/openapi.yaml delete /delegations/{delegation_id}","href":"/api-reference/delegations/delete-delegations"}]}]}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog/changelog"}]}]},"basePath":"","title":"Add role assignments - Opal Security Docs","buildId":"dpl_BLQvU86QFwq3AhPofSTw6q8dGWKm","deploymentId":"dpl_BLQvU86QFwq3AhPofSTw6q8dGWKm","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-Myd8dsju.js","utils-C2HkQgW0.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-8rSppmTv.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-B6MjiCFm.js","snippetPresets-DwrSAONL.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-1-a5UQKQ.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C541m7wZ.js","shallow-CWELCZ77.js","getApiPlaygroundDisplay-CTo5Zn03.js","CodeSnippet-D--dzvnl.js","CodeSnippets-DM3cXEDh.js","Page-CxAy5y67.js","getPastedJson-C-VECgcL.js","icon-BPq2-Mg3.js","MethodPill-D9J5cUHd.js","DuplicateIcon-BqHaxUnD.js","createIcon-CIbcZHp9.js","DynamicMarkdown-BKiHAm_d.js","SectionHeading-DstQXt3H.js","axios-vUo_bRtp.js","Markdown-CpxgzsKA.js","clsx-C5EfhVm0.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CJ9Oly2E.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-Mk6P3qvh.js"]}