Add a member to an organization
/api/v1/organizations/{id}/membersAdds a member. Membership is admission, not authority: with role_id the member also holds that role from the start, at the organization node or at the office or team node_id names, for the effective_from to effective_to window when given; without it they belong and hold nothing until a role is assigned (a place or dates need a role, 400 invite.window_requires_role). The identity must already hold an active membership in this Environment (invite by email instead for someone who does not). An identity that is already a member returns 409; roles are added through the assignment routes. Requires the rbac.manage_assignments permission at the organization and emits organization.member.added. An organization's own administrator, signed in with an identity token and admitted by canopy:organization.manage alone, is refused with 403 (organization.member_add_requires_invite): the person never agreed to join, so the administrator invites them instead.
Authentication
Authorization Option A JWT access token. Never send alongside X-API-Key: a request carrying both is refused.
X-API-Key Option B API key for management-tier access. Never send alongside an Authorization header: a request carrying both is refused.
Path Parameters
idstring Required Request body
application/json
identity_idstring Required Identity to add. Must already hold an active membership in this Environment; invite by email instead for someone who does not.
role_idstring Optional A role to hold at the organization node from the start, from the Environment's roles. Left out, the member belongs and holds nothing until a role is assigned.
node_idstring Optional Where the role is held: the organization node (the default) or an office or team beneath it. Needs a role.
effective_fromstring · date-time Optional When the role starts to count (ISO 8601). Needs a role.
effective_tostring · date-time Optional When the role stops counting (ISO 8601), after `effective_from`. Needs a role.
Responses
application/json
data *OrganizationMemberResponseDto
application/json
error *ApiErrorBodyDto
application/json
error *ApiErrorBodyDto
application/json
error *ApiErrorBodyDto
application/json
error *ApiErrorBodyDto
application/json
error *ApiErrorBodyDto
Returned object
curl -X POST "https://auth.canopy-io.com/api/v1/organizations/value/members" \ -H "X-API-Key: $CANOPY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "identity_id": "string", "role_id": "string", "node_id": "string", "effective_from": "2026-04-20T12:00:00.000Z", "effective_to": "2026-04-20T12:00:00.000Z" }'
{ "data": { "id": "string", "identity": { "id": "string", "email": "string", "first_name": "string", "last_name": "string" }, "status": "active", "source": "added", "joined_at": "2026-04-20T12:00:00.000Z", "deactivated_at": "2026-04-20T12:00:00.000Z", "roles": [ { "id": "string", "role": { "id": "string", "name": "string" }, "node": { "id": "string", "name": "string", "node_type": "string" }, "effective_from": "2026-04-20T12:00:00.000Z", "effective_to": "2026-04-20T12:00:00.000Z", "version": 0 } ], "version": 0 } }
Tell us how we can improve this guide.