1. Docs
  2. API Reference
  3. Invite an identity into a location with a role

Invite an identity into a location with a role

POST/portal/v1/accounts/{accountSlug}/applications/{appSlug}/environments/{envSlug}/workspace/invitations

Invites a person by email into a hierarchy node with a starting role, sends the invitation email and records an invite.created audit event. The invitation expires in 7 days. Requires workspace_identity.invite at the target nodeId, and roleId must be on the caller's grant ceiling; otherwise the response is 403. Returns 409 when a pending invitation for that email already exists at that node, when the email already belongs to an active member of the Environment, or when the node sits in an organization the person is not a member of. Returns the created invitation row.

Authentication

Bearer TokenAuthorization

JWT access token. Never send alongside X-API-Key: a request carrying both is refused.

Path Parameters

accountSlugstring Required

The Account's slug. An unknown one answers 404.

appSlugstring Required

The Application's slug within the Account.

envSlugstring Required

The Environment's slug within the Application.

Request body

application/json

emailstring Required
firstNamestring Optional
lastNamestring Optional
nodeIdstring Required
roleIdstring Required

Responses

application/json

  • dataWorkspaceInvitationResponseDto*

application/json

  • errorApiErrorBodyDto*

application/json

  • errorApiErrorBodyDto*

application/json

  • errorApiErrorBodyDto*

application/json

  • errorApiErrorBodyDto*

application/json

  • errorApiErrorBodyDto*

Returned object

Request
curl -X POST "https://auth.canopy-io.com/portal/v1/accounts/value/applications/value/environments/value/workspace/invitations" \
  -H "Authorization: Bearer $CANOPY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "string",
    "firstName": "string",
    "lastName": "string",
    "nodeId": "string",
    "roleId": "string"
  }'
Response
{
  "data": {
    "id": "string",
    "email": "string",
    "first_name": "string",
    "last_name": "string",
    "name": "string",
    "role_id": "string",
    "role_name": "string",
    "node_id": "string",
    "node_name": "string",
    "has_initial_assignment": false,
    "status": "pending",
    "expires_at": "2026-04-20T12:00:00.000Z",
    "invited_by": "string",
    "created_at": "2026-04-20T12:00:00.000Z"
  }
}
Related endpoints
GETResolve the caller's operational authority in the Environment
GETList identities within the caller's operational scope
GETList an identity's responsibilities within the caller's scope
GETList the identity roles the caller may grant
GETList the hierarchy locations the caller may assign at
GETList the hierarchy nodes the caller can see in this Environment
GETList identity invitations within the caller's scope
GETList scoped operational activity within the caller's scope
GETDownload the scoped activity feed as CSV
GETHow long activity history is kept for this Account
POSTResend a scoped invitation
DELETERevoke a scoped invitation
POSTGrant an identity a role at a hierarchy node
PATCHMove or re-role an existing assignment
DELETERemove an identity's role assignment
Was this page helpful?

Tell us how we can improve this guide.