Members

envless.members.invite()

Send a workspace invitation by email

ts
invite(body: MemberInvite, options?: RequestScope): Promise<InviteResource>

Creates a pending invite and emails it. This does not create a member, so the resolved value is an InviteResource, not a MemberResource: the person becomes a member only when they accept, and until then they live in the invites namespace. Invites expire 3 days after they are sent.

roleId must be a role id from the roles namespace, the id field of a role and not its name. The owner role can never be handed out this way. The email is sent synchronously and the invite is rolled back if delivery fails, so a resolved promise means the provider accepted the message.

Seats are plan limited and pending invites count against the limit. Free and Dev workspaces allow 1 member in total, Team seats 15 and Enterprise has no seat limit, so on Free and Dev every invite fails with member.seat_limit until the workspace upgrades.

Example

ts
const roles = await envless.roles.listAll()
const viewer = roles.find((role) => role.systemKey === 'viewer')

if (viewer) {
    const invite = await envless.members.invite({ email: 'dev@example.com', roleId: viewer.id })

    console.log(invite.id, invite.status, invite.expiresAt)
}

Parameters

ParameterTypeRequiredDescription
body.emailstringYesAddress to invite, normalised to lowercase by the API.
body.roleIdstringYesRole id from the roles namespace to grant on acceptance.
options.signalAbortSignalNoCancels the request.

Returns

InviteResource with the invite id, email, status, role and expiresAt.

Worth knowing

  • Inviting the key owner themselves is rejected outright (member.self_invite).
  • A second invite to the same address fails with invite.already_pending, and an address that already belongs to a member fails with member.already_exists.
  • An unknown roleId comes back as role.not_found, and the owner role as role.owner_not_assignable.

Required scopes

members:write

Underlying endpoint

POST /members

Request and response schema, every error code, and a live playground.

In Python

envless.members.invite()

The same method in envless-sdk, the Python SDK, with the same request, retries and errors.

In Ruby

Envless.members.invite

The same method in envless-sdk, the Ruby gem, with the same request, retries and errors.

In PHP

$envless->members->invite()

The same method in envless/sdk, the PHP SDK, with the same request, retries and errors.