Add a project member
Adds a colleague to the project by email address. Free and uncapped on every plan: a member adds no run, no channel, no trigger and no byte, so every cost they cause is already billed through the project's owner. Members are counted nowhere.
The address does not need an account. Inviting one that has none creates it unverified and records the membership beside it, so the invitee is already a member with status pending. Their first sign-in code — which they request themselves, from the link in the invitation — is what makes them active. There is no separate acceptance step and no invitation to expire: the address is the credential, and the invitation reached it.
An owner may grant admin or member; an admin may grant member only, so administration cannot hand out its own authority. role: owner is refused — that is the billing owner, and ownership moves only through a transfer the new owner accepts (PUT /v1/projects/{project_id}/transfer).
The invitation email is a courtesy, not the grant: if it cannot be sent the membership still stands, and the response still says pending. Requires an account-wide credential — a project-scoped key cannot grant access that would outlive its own revocation.
Request
- Base URL: https://api.naturali.ai
- URL: https://api.naturali.ai/v1/projects/{project_id}/members
- Auth: one of:
- HTTP bearer
- OAuth 2 (authorization code, authorization URL https://api.naturali.ai/authorize, token URL https://api.naturali.ai/token, scopes: mcp:access)
Request body
Example request
{
"email": "ana@acme.com",
"role": "member"
}Response
The member was added.
Example response
{
"id": "pmem_V1StGXR8Z5jdHi6B",
"project_id": "proj_V1StGXR8Z5jdHi6B",
"user_id": "user_V1StGXR8Z5jdHi6B",
"email": "ana@acme.com",
"name": "Ana Silva",
"status": "active",
"role": "owner",
"created_at": "2026-07-17T00:00:00.000Z"
}Changes
No recorded changes to this operation across all 1 revision of this API.