Members

Envless.members.invite

Send a workspace invitation by email

def invite(body = nil, timeout: nil, **fields)

Creates a pending invite and emails it. This does not create a member, so the returned value is an invite_resource, not a member_resource: 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 successful return 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

ruby
require "envless/sdk"

roles = Envless.roles.list_all
viewer = roles.find { |role| role[:systemKey] == "viewer" }

if viewer
  invite = Envless.members.invite(
    email: "dev@example.com",
    roleId: viewer[:id]
  )

  puts "#{invite[:id]} #{invite[:status]} #{invite[:expiresAt]}"
end

Parameters

ParameterTypeRequiredDescription
bodymember_inviteNoThe fields below as one Hash, with Symbol or String keys, in place of the keywords.
email:StringYesAddress to invite, normalised to lowercase by the API.
roleId:StringYesRole id from the roles namespace to grant on acceptance.
timeout:Integer | Float | RationalNoSeconds each attempt of this call may take, redirects and the response body included, before it raises Envless::NetworkError with timeout? set. Overrides the client's timeout for this call, and 0 turns the limit off.

Returns

invite_resource 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 TypeScript

envless.members.invite()

The same method in @goenvless/sdk, with the same request, retries and errors.