Skip to content

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

RoleDescription
ownerFull control, including managing other collaborators
adminCan invite, update roles, and remove other collaborators
memberDefault role for a new collaborator
viewerRead-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

MethodPathDescriptionAuthRate Limit
GET/chainies/:chainyId/collaboratorsList collaborators on a ChainyJWT + workspace membership60/min
POST/chainies/:chainyId/collaboratorsInvite a collaboratorJWT + Owner/Admin collaborator30/min
PATCH/chainies/:chainyId/collaborators/:chainerIdUpdate a collaborator's roleJWT + Owner/Admin collaborator30/min
DELETE/chainies/:chainyId/collaborators/:chainerIdRemove a collaboratorJWT + Owner/Admin collaborator, or self30/min
GET/chainy-collaborators/mineList your own pending invitesJWT60/min
POST/chainy-collaborators/acceptAccept a pending inviteJWT30/min
POST/chainy-collaborators/declineDecline a pending inviteJWT30/min

List Collaborators

Request

Use the id of a workspace-scoped Chainy as $CHAINY_ID.

Response

json
{
  "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

bash
curl https://api.chainabit.com/api/v1/chainies/$CHAINY_ID/collaborators \
  -H "Authorization: Bearer $TOKEN"
javascript
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();
python
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

FieldTypeRequiredDescription
chainerIdstringYesID of the workspace member to invite
rolestringNoowner | admin | member | viewer. Defaults to member.

The target must be a member of the Chainy's workspace.

Response

json
{
  "data": {
    "chainerId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
    "role": "member",
    "status": "pending",
    "invitedAt": "2026-03-18T09:00:00.000Z"
  }
}

Code Examples

bash
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" }'
javascript
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();
python
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

FieldTypeRequiredDescription
rolestringYesowner | admin | member | viewer

Response

json
{
  "data": {
    "chainerId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
    "role": "admin",
    "updatedAt": "2026-03-18T10:00:00.000Z"
  }
}

Code Examples

bash
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" }'
javascript
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();
python
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

json
{
  "data": {
    "chainerId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
    "removedAt": "2026-03-18T11:00:00.000Z"
  }
}

Code Examples

bash
curl -X DELETE https://api.chainabit.com/api/v1/chainies/$CHAINY_ID/collaborators/$CHAINER_ID \
  -H "Authorization: Bearer $TOKEN"
javascript
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}` },
});
python
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

bash
curl https://api.chainabit.com/api/v1/chainy-collaborators/mine \
  -H "Authorization: Bearer $TOKEN"
json
{
  "data": [
    {
      "chainyId": "cm5abc123",
      "role": "member",
      "status": "pending",
      "invitedAt": "2026-03-18T09:00:00.000Z"
    }
  ]
}

Accept an Invite

bash
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

bash
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.

Built with purpose.