Skip to main content

Project invites

Invite people to a project, and accept or decline an invite.

Overview

A project invite offers someone a role on a project: Read, Write, or Admin. The role sets what they can do in the project. It can go to any email address, including one with no LiveKit account yet.

The invite includes a token that identifies it when the recipient accepts or declines. Only the invited email address can answer the invite. The role takes effect only when they accept and become a project member.

An invite expires 48 hours after it's sent. An expired invite returns 400. Inviting the same address again replaces the earlier invite with a new token, role, and expiry. To change only the role, update the invite.

Listing invites needs the Read role on the project. Sending, updating, and deleting invites need the Admin role.

To call these endpoints from the CLI, use the lk project invite commands, for example lk project invite list --user-auth.

The project invite object

A pending email invite to a project. The recipient answers it with the token the invite carries.

projectIdstring

The project the invite is to (p_...).

emailstring

The email address the invite was sent to.

roleint32

Access level the invitee takes on the project: 0 invited, 1 read, 2 write, 3 admin.

inviteTokenstring

The token that identifies the invite. The invitee answers with it. Only GetInvite returns it, to the invitee who asks with it. ListInvites and UpdateInvite leave it empty. InviteMember returns the token of the invite that it creates.

expiresAttimestamp

When the invite stops working.

The project invite object

{
"projectId": string,
"email": string,
"role": int32,
"inviteToken": string,
"expiresAt": timestamp
}

List invites

GET
/v0/projects/{projectId}/invites

Lists the unexpired invites of a project, ordered by email.

Returns a list of ProjectInvite objects, with a pageInfo cursor.

Path parameters

projectId
Required
string

The project ID (p_...).

Query parameters

page.cursorstring

The cursor of the page to return: the nextCursor of the previous page. When empty, the list starts at the first item.

page.pageSizeint32

The maximum number of items to return. When 0, the list uses its default page size.

Request

curl -X GET "https://beta-api.livekit.cloud/v0/projects/${PROJECT_ID}/invites" \
-H "Authorization: Bearer $LIVEKIT_SESSION_TOKEN"

Response

{
"items": [
{
"projectId": "p_f9779j5lpvh",
"email": "dev@example.com",
"role": 2,
"inviteToken": "wTq4xK2mNb8vRc6y",
"expiresAt": "2026-01-17T01:30:15Z"
}
],
"pageInfo": {
"nextCursor": "",
"hasMore": false
}
}

Invite member

POST
/v0/projects/{projectId}/invites

Path parameters

projectId
Required
string

The project ID (p_...).

Request body

The request to invite a user to a project by email. When an invite for the email exists, the API refreshes it. The response has the invite token.

emailstring

The email address to invite.

roleint32

Access level to grant on the project: 1 read, 2 write, 3 admin.

Response fields

projectIdstring

The projectId value.

inviteTokenstring

The inviteToken value.

Request

curl -X POST "https://beta-api.livekit.cloud/v0/projects/${PROJECT_ID}/invites" \
-H "Authorization: Bearer $LIVEKIT_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"email": "dev@example.com",
"role": 2
}'

Response

{
"projectId": "p_f9779j5lpvh",
"inviteToken": "wTq4xK2mNb8vRc6y"
}

Update invite

PATCH
/v0/projects/{projectId}/invites/{email}

Returns the ProjectInvite object.

Path parameters

projectId
Required
string

The project ID (p_...).

email
Required
string

The email address of the invited person.

Request body

roleint32

Access level to set on the invite: 1 read, 2 write, 3 admin.

Request

curl -X PATCH "https://beta-api.livekit.cloud/v0/projects/${PROJECT_ID}/invites/${EMAIL}" \
-H "Authorization: Bearer $LIVEKIT_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"role": 3
}'

Response

{
"invite": {
"projectId": "p_f9779j5lpvh",
"email": "dev@example.com",
"role": 3,
"inviteToken": "wTq4xK2mNb8vRc6y",
"expiresAt": "2026-01-17T01:30:15Z"
}
}

Delete invite

DELETE
/v0/projects/{projectId}/invites/{email}

Path parameters

projectId
Required
string

The project ID (p_...).

email
Required
string

The email address of the invited person.

Request

curl -X DELETE "https://beta-api.livekit.cloud/v0/projects/${PROJECT_ID}/invites/${EMAIL}" \
-H "Authorization: Bearer $LIVEKIT_SESSION_TOKEN"

Response

{}

Get invite

GET
/v0/project-invites/{inviteToken}

Returns the ProjectInvite object.

Path parameters

inviteToken
Required
string

The invite token. The link in the invite email carries it as the t query parameter, and ListInvites returns it.

Request

curl -X GET "https://beta-api.livekit.cloud/v0/project-invites/${INVITE_TOKEN}" \
-H "Authorization: Bearer $LIVEKIT_SESSION_TOKEN"

Response

{
"invite": {
"projectId": "p_f9779j5lpvh",
"email": "dev@example.com",
"role": 2,
"inviteToken": "wTq4xK2mNb8vRc6y",
"expiresAt": "2026-01-17T01:30:15Z"
}
}

Answer invitation

POST
/v0/project-invites/{inviteToken}:answer

If accept is true, returns the ProjectMember object for the new member. If accept is false, returns an empty object.

Path parameters

inviteToken
Required
string

The invite token. The link in the invite email carries it as the t query parameter, and ListInvites returns it.

Request body

acceptboolean

True accepts the invite; false declines it.

Request

curl -X POST "https://beta-api.livekit.cloud/v0/project-invites/${INVITE_TOKEN}:answer" \
-H "Authorization: Bearer $LIVEKIT_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"accept": true
}'

Response

{
"member": {
"projectId": "p_f9779j5lpvh",
"userId": "Qm5RtWvXb8KpLn3YcZd7Hf",
"email": "dev@example.com",
"role": 2
}
}