Members

$envless->members->invite()

Send a workspace invitation by email

php
/**
 * @param MemberInvite $body
 * @return InviteResource
 */
public function invite(array $body, int|float|null $timeout = null): array

Creates a pending invite and emails it. This does not create a member, so the returned 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 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

php
use Envless\Envless;

$envless = new Envless();

foreach ($envless->roles->listAll() as $role) {
    if ($role['systemKey'] !== 'viewer') {
        continue;
    }

    $invite = $envless->members->invite([
        'email' => 'dev@example.com',
        'roleId' => $role['id'],
    ]);

    echo "{$invite['id']} {$invite['status']} {$invite['expiresAt']}", PHP_EOL;
}

Parameters

ParameterTypeRequiredDescription
$bodyMemberInviteYesThe fields below, as one array.
$body['email']stringYesAddress to invite, normalised to lowercase by the API.
$body['roleId']stringYesRole id from the roles namespace to grant on acceptance.
$timeoutint|floatNoSeconds each attempt of this call may take, the response body included, before it throws Envless\Exception\NetworkException with isTimeout() true. Overrides the client's timeout for this call, and 0 turns the limit off.

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 TypeScript

envless.members.invite()

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