Bulk-attach EnvironmentMemberships for the Add-from-directory picker
/portal/v1/accounts/{accountSlug}/identities/environment-memberships/bulk-attachPartial-success bulk attach for the add-from-directory picker: creates an EnvironmentMembership in one target Environment for each identity in identity_ids. Each identity is processed independently so pre-existing memberships and validation errors fail individually without aborting the batch. Returns 200 on full success or 207 Multi-Status on mixed outcomes, with a { summary, results } body either way. Grants membership only — assigning a role at a node is a separate env-scoped call.
Authentication
AuthorizationJWT access token. Never send alongside X-API-Key: a request carrying both is refused.
identities.manageIdentitiesManage end-user identities across the account. Granted through an administrator role in the Admin Workspace; a valid token without it is refused with 403.
Request body
application/json
environment_idstring Required The Environment ID to attach the identities to. Must belong to the same Account.
identity_idsstring[] Required Identity IDs to attach to the Environment as active EnvironmentMembership rows. Each row is processed independently — pre-existing memberships and validation failures are reported per-item rather than failing the batch. Max 200 per request.
Responses
application/json
summary *objectresults *object[]
application/json
summary *objectresults *("success" | "error")[]
application/json
error *ApiErrorBodyDto
application/json
error *ApiErrorBodyDto
Errors
When the request can't be completed, the response body includes a stable error code you can branch on.
account.capability_requiredForbiddenThe signed-in user's administrator roles do not grant the capability this endpoint requires.
Ask an account administrator to grant a role carrying the capability named in the Authentication section, then retry.
curl -X POST "https://auth.canopy-io.com/portal/v1/accounts/{accountSlug}/identities/environment-memberships/bulk-attach" \ -H "Authorization: Bearer $CANOPY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "environment_id": "string", "identity_ids": [ "id_01HXABC...", "id_01HXDEF..." ] }'
{ "summary": { "total": 0, "succeeded": 0, "failed": 0 }, "results": [ { "index": 0, "status": "success", "code": 0, "data": { "id": "string", "identity_id": "string", "environment_id": "string", "status": "invited", "invited_at": "2026-04-20T12:00:00.000Z", "activated_at": "2026-04-20T12:00:00.000Z", "deactivated_at": "2026-04-20T12:00:00.000Z", "created_at": "2026-04-20T12:00:00.000Z" } } ] }
Tell us how we can improve this guide.