Chainy Collaborators
Collaborators let you invite other members of a Chainy's workspace onto that specific Chainy with a role, so they can see and act on it alongside you. This feature is only available on Chainies that belong to a workspace — see the workspaceId field on Chainies.
Roles
| Role | Description |
|---|---|
owner | Full control, including managing other collaborators |
admin | Can invite, update roles, and remove other collaborators |
member | Default role for a new collaborator |
viewer | Read-only access to the Chainy |
Inviting a collaborator or changing a collaborator's role requires the caller to already be an owner or admin collaborator on the Chainy. Any collaborator can remove themselves regardless of role.
Endpoints
| Method | Path | Description | Auth | Rate Limit |
|---|---|---|---|---|
| GET | /chainies/:chainyId/collaborators | List collaborators on a Chainy | JWT + workspace membership | 60/min |
| POST | /chainies/:chainyId/collaborators | Invite a collaborator | JWT + Owner/Admin collaborator | 30/min |
| PATCH | /chainies/:chainyId/collaborators/:chainerId | Update a collaborator's role | JWT + Owner/Admin collaborator | 30/min |
| DELETE | /chainies/:chainyId/collaborators/:chainerId | Remove a collaborator | JWT + Owner/Admin collaborator, or self | 30/min |
| GET | /chainy-collaborators/mine | List your own pending invites | JWT | 60/min |
| POST | /chainy-collaborators/accept | Accept a pending invite | JWT | 30/min |
| POST | /chainy-collaborators/decline | Decline a pending invite | JWT | 30/min |
List Collaborators
Request
Use the id of a workspace-scoped Chainy as $CHAINY_ID.
Response
{
"data": [
{
"chainerId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"role": "owner",
"status": "accepted",
"invitedAt": "2026-03-17T10:00:00.000Z"
},
{
"chainerId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"role": "member",
"status": "pending",
"invitedAt": "2026-03-18T09:00:00.000Z"
}
],
"meta": { "total": 2 }
}Code Examples
curl https://api.chainabit.com/api/v1/chainies/$CHAINY_ID/collaborators \
-H "Authorization: Bearer $TOKEN"const BASE_URL = process.env.BASE_URL;
const TOKEN = process.env.TOKEN;
const chainyId = process.env.CHAINY_ID;
const response = await fetch(`${BASE_URL}/chainies/${chainyId}/collaborators`, {
headers: { Authorization: `Bearer ${TOKEN}` },
});
const { data } = await response.json();import requests, os
response = requests.get(
f"{os.environ['BASE_URL']}/chainies/{os.environ['CHAINY_ID']}/collaborators",
headers={"Authorization": f"Bearer {os.environ['TOKEN']}"},
)
data = response.json()["data"]Invite a Collaborator
Request
| Field | Type | Required | Description |
|---|---|---|---|
chainerId | string | Yes | ID of the workspace member to invite |
role | string | No | owner | admin | member | viewer. Defaults to member. |
The target must be a member of the Chainy's workspace.
Response
{
"data": {
"chainerId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"role": "member",
"status": "pending",
"invitedAt": "2026-03-18T09:00:00.000Z"
}
}Code Examples
curl -X POST https://api.chainabit.com/api/v1/chainies/$CHAINY_ID/collaborators \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "chainerId": "b2c3d4e5-f6a7-8901-bcde-f12345678901", "role": "member" }'const BASE_URL = process.env.BASE_URL;
const TOKEN = process.env.TOKEN;
const chainyId = process.env.CHAINY_ID;
const response = await fetch(`${BASE_URL}/chainies/${chainyId}/collaborators`, {
method: "POST",
headers: {
Authorization: `Bearer ${TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
chainerId: "b2c3d4e5-f6a7-8901-bcde-f12345678901",
role: "member",
}),
});
const { data } = await response.json();import requests, os
response = requests.post(
f"{os.environ['BASE_URL']}/chainies/{os.environ['CHAINY_ID']}/collaborators",
headers={"Authorization": f"Bearer {os.environ['TOKEN']}"},
json={"chainerId": "b2c3d4e5-f6a7-8901-bcde-f12345678901", "role": "member"},
)
data = response.json()["data"]Update a Collaborator's Role
Request
| Field | Type | Required | Description |
|---|---|---|---|
role | string | Yes | owner | admin | member | viewer |
Response
{
"data": {
"chainerId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"role": "admin",
"updatedAt": "2026-03-18T10:00:00.000Z"
}
}Code Examples
curl -X PATCH https://api.chainabit.com/api/v1/chainies/$CHAINY_ID/collaborators/$CHAINER_ID \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "role": "admin" }'const BASE_URL = process.env.BASE_URL;
const TOKEN = process.env.TOKEN;
const chainyId = process.env.CHAINY_ID;
const chainerId = process.env.CHAINER_ID; // from a List Collaborators response
const response = await fetch(
`${BASE_URL}/chainies/${chainyId}/collaborators/${chainerId}`,
{
method: "PATCH",
headers: {
Authorization: `Bearer ${TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ role: "admin" }),
}
);
const { data } = await response.json();import requests, os
response = requests.patch(
f"{os.environ['BASE_URL']}/chainies/{os.environ['CHAINY_ID']}/collaborators/{os.environ['CHAINER_ID']}",
headers={"Authorization": f"Bearer {os.environ['TOKEN']}"},
json={"role": "admin"},
)
data = response.json()["data"]Remove a Collaborator
Any collaborator can remove themselves; removing someone else requires owner or admin.
Request
Response
{
"data": {
"chainerId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"removedAt": "2026-03-18T11:00:00.000Z"
}
}Code Examples
curl -X DELETE https://api.chainabit.com/api/v1/chainies/$CHAINY_ID/collaborators/$CHAINER_ID \
-H "Authorization: Bearer $TOKEN"const BASE_URL = process.env.BASE_URL;
const TOKEN = process.env.TOKEN;
const chainyId = process.env.CHAINY_ID;
const chainerId = process.env.CHAINER_ID; // from a List Collaborators response
await fetch(`${BASE_URL}/chainies/${chainyId}/collaborators/${chainerId}`, {
method: "DELETE",
headers: { Authorization: `Bearer ${TOKEN}` },
});import requests, os
requests.delete(
f"{os.environ['BASE_URL']}/chainies/{os.environ['CHAINY_ID']}/collaborators/{os.environ['CHAINER_ID']}",
headers={"Authorization": f"Bearer {os.environ['TOKEN']}"},
)Your Pending Invites
These endpoints operate on the invitee's own inbox of pending collaborator invites, across all Chainies — not on a single Chainy's collaborator list.
List Your Invites
curl https://api.chainabit.com/api/v1/chainy-collaborators/mine \
-H "Authorization: Bearer $TOKEN"{
"data": [
{
"chainyId": "cm5abc123",
"role": "member",
"status": "pending",
"invitedAt": "2026-03-18T09:00:00.000Z"
}
]
}Accept an Invite
curl -X POST https://api.chainabit.com/api/v1/chainy-collaborators/accept \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "chainyId": "cm5abc123" }'Decline an Invite
curl -X POST https://api.chainabit.com/api/v1/chainy-collaborators/decline \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "chainyId": "cm5abc123" }'Declining or accepting removes the invite from your pending list.