---
title: "Add or re-role a member"
method: POST
path: "/projects/{id}/members"
tags: ["Projects"]
---

# Add or re-role a member

`POST /projects/{id}/members`

## Request

- Base URL: `https://tasg.app/api/v1`
- URL: `https://tasg.app/api/v1/projects/{id}/members`
- Auth: HTTP bearer

Project owner only. Upserts the membership, so it also changes an existing member's role. On instances with billing enforcement enabled, adding someone new past the workspace plan's people limit returns 403; re-adding an existing person always succeeds.

## Path parameters

- `id` string, uuid, required

## Request body

- object
  - `user_id` string, uuid, required
  - `role` 'editor' | 'viewer', required: Ownership cannot be granted through the API.

## Response `201`

Added.

- object
  - `message` string, required

## Other responses

- `400`: Validation failed: the body or query did not match the schema, or a business rule was violated. `error` says which.
- `401`: Missing, invalid, expired or revoked credentials.
- `403`: Authenticated, but not allowed: not a member, insufficient project role or the API token lacks the required scope.
- `404`: Not found, or not visible to the caller (tenancy is enforced: foreign resources look identical to missing ones).
- `429`: Rate limited. Back off and retry after the window in the `RateLimit-*` headers.

---

[API](https://skmtc.dev/tasg/apis/tasg-api.md) · [All operations](https://skmtc.dev/tasg/apis/tasg-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tasg/apis/tasg-api/revisions/cd2a1dbaf5cf?raw)
