Skip to content

Ask an address into a company

POST
/v1/companies/{id}/members
curl --request POST \
--url https://beta-api.plune.ai/v1/companies/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/members \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "email": "[email protected]", "role": "member" }'

An owner or an admin; only an owner asks somebody in as an owner. Two outcomes, told apart by kind: an address that already has a Plune account is a member at once; any other gets an invitation — a mail names the company, the beta door lets the address through, and the sign-in turns the invitation into a membership. Being in the company opens none of its projects. Twice for the same address is 409.

id
required
string format: uuid
Media type application/json
object
email
required
string format: email
role
required

What a member of a company may do (ADR 0038). owner and admin manage its people and add them to its projects — only an owner makes, unmakes or removes an owner, and only an owner deletes it; member and reader join its projects themselves. A company role opens no project: joining one gives the project role it maps to — owner and admin → owner, member → member, reader → reader.

string
Allowed values: owner admin member reader
Examples

An address without an account — an invitation

{
"email": "[email protected]",
"role": "member"
}

Asked — kind says which of the two it became

Media type application/json
One of:

What asking an address into a company produced: a member at once when an account holds it (kind: member), else an invitation for the address to sign in with (kind: invitation).

object
kind
required
string
Allowed values: member
userId
required
string
email
required
string format: email
name

The display name (T3) — absent until the person has given one.

string
role
required

What a member of a company may do (ADR 0038). owner and admin manage its people and add them to its projects — only an owner makes, unmakes or removes an owner, and only an owner deletes it; member and reader join its projects themselves. A company role opens no project: joining one gives the project role it maps to — owner and admin → owner, member → member, reader → reader.

string
Allowed values: owner admin member reader
invitedBy

Who brought them in (a userId) — absent for the person who made the company.

string
createdAt
required
string format: date-time
Example
{
"kind": "invitation",
"id": "6f1c2b3a-0000-4000-8000-0000000000a6",
"email": "[email protected]",
"role": "member",
"createdAt": "2026-09-16T09:12:04.151Z"
}

Invalid body — an email address and one of the four roles

Media type application/json
object
error
required
string
Example generated
{
"error": "example"
}

No / invalid token or session

A member or a reader asked — or an admin asked for an owner

Media type application/json
object
error
required
string
Example
{
"error": "company owner or admin only"
}

No such company among yours

Media type application/json
object
error
required
string
Example generated
{
"error": "example"
}

Already in, or already invited

Media type application/json
object
error
required
string
Example
{
"error": "[email protected] is already in this company, or already invited"
}

Rate-limited: either the per-route throttle or a tenant quota. Retry-After carries the seconds until the window rolls over.

Media type application/json
object
error
required
string
Example generated
{
"error": "example"
}
Retry-After
integer

Seconds until the window rolls over