Participants
Participants model a role or responsibility inside a project. They can be mapped to users, groups, organizational units, labels, metadata, and external contacts.
Endpoints
Section titled “Endpoints”| Method | Path | Required scope |
|---|---|---|
GET | /api/v1/participants | api:participants:read |
POST | /api/v1/participants | api:participants:write |
GET | /api/v1/participants/:id | api:participants:read |
PATCH | /api/v1/participants/:id | api:participants:write |
DELETE | /api/v1/participants/:id | api:participants:write |
GET | /api/v1/participants/:id/members | api:participants:read |
POST | /api/v1/participants/:id/members | api:participants:write |
DELETE | /api/v1/participants/:id/members/:directory_entry_id | api:participants:write |
List Participants
Section titled “List Participants”curl "https://roster.example.com/api/v1/participants?query=finance%20approvers&limit=10&project_id=proj_123&label=Finance&metadata.approval_limit_eur.gte=75000" \ -H "Authorization: Bearer ${ROSTER_API_KEY}"const url = new URL("https://roster.example.com/api/v1/participants");url.searchParams.set("query", "finance approvers");url.searchParams.set("limit", "10");url.searchParams.set("project_id", "proj_123");url.searchParams.set("label", "Finance");url.searchParams.set("metadata.approval_limit_eur.gte", "75000");
const response = await fetch(url, { headers: { Authorization: `Bearer ${process.env.ROSTER_API_KEY}`, },});
if (!response.ok) { throw new Error(`Participant list failed: ${response.status}`);}
const data = await response.json();import osimport requests
response = requests.get( "https://roster.example.com/api/v1/participants", params={ "query": "finance approvers", "limit": 10, "project_id": "proj_123", "label": "Finance", "metadata.approval_limit_eur.gte": 75000, }, headers={"Authorization": f"Bearer {os.environ['ROSTER_API_KEY']}"}, timeout=10,)response.raise_for_status()data = response.json()Supported filters include query, limit, project_id, project_ids,
label, labels, metadata, metadata.<key>, and
metadata.<key>.<operator>. project_id and project_ids match participants
in any requested project. label and labels require every requested label to
match; label names are case-insensitive, while label ids are exact.
Metadata keys must be snake_case. Metadata operators are eq, ne, gt,
gte, lt, and lte. Ordered metadata operators support numeric and ISO
date-time values. query searches participant display name and description.
limit accepts values from 1 to 100.
Participant reads follow project read access. A caller can list or read participants in projects they can read. Creating, updating, deleting, and changing participant members still requires project management access.
Create Participant
Section titled “Create Participant”curl -X POST "https://roster.example.com/api/v1/participants" \ -H "Authorization: Bearer ${ROSTER_API_KEY}" \ -H "Content-Type: application/json" \ -d '{ "project_id": "proj_123", "display_name": "Helios Finance Approvers", "description": "Finance and procurement approvers.", "label_ids": ["lbl_123"], "new_label_names": ["Finance"], "metadata_entries": [{ "key": "department", "value": "Finance Systems" }] }'const response = await fetch("https://roster.example.com/api/v1/participants", { method: "POST", headers: { Authorization: `Bearer ${process.env.ROSTER_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ project_id: "proj_123", display_name: "Helios Finance Approvers", description: "Finance and procurement approvers.", label_ids: ["lbl_123"], new_label_names: ["Finance"], metadata_entries: [{ key: "department", value: "Finance Systems" }], }),});
if (!response.ok) { throw new Error(`Participant creation failed: ${response.status}`);}
const data = await response.json();import osimport requests
response = requests.post( "https://roster.example.com/api/v1/participants", headers={"Authorization": f"Bearer {os.environ['ROSTER_API_KEY']}"}, json={ "project_id": "proj_123", "display_name": "Helios Finance Approvers", "description": "Finance and procurement approvers.", "label_ids": ["lbl_123"], "new_label_names": ["Finance"], "metadata_entries": [{"key": "department", "value": "Finance Systems"}], }, timeout=10,)response.raise_for_status()data = response.json()