API reference

Inbox

15 endpoints, served at https://orbitwrite.com/api/v1. Each one lists the credentials it accepts, its parameters and every response it can give.

List team inboxes#

GET/api/v1/inbox/inboxes

Requires teamInbox:read. The workspace's routable inboxes with their sources and membership.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Query parameters

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

Responses

200object

The team inboxes

Response attributes
inboxesTeamInbox[]Required
Child attributes
idstringRequired
namestringRequired
descriptionstring | nullRequired
methodstringRequired
  • "manual"
  • "round_robin"
  • "balanced"
skillsEnabledbooleanRequired
awayReassignbooleanRequired
rrAssignWhenAwaybooleanRequired
positionnumberRequired

Routing order: a new conversation goes to the first team inbox, lowest position first, with a source that matches it. Set with PUT /inbox/inboxes/order.

wrapUpMinutesnumberRequired
createdAtstringRequired
updatedAtstringRequired
sourcesTeamInboxSource[]Required
Child attributes
idstringRequired
accountIdstring | nullRequired
platformstring | nullRequired
typestring | nullRequired
  • "reply"
  • "mention"
  • null
keywordsstring[]Required

Matches when the preview contains any of these, ignoring case. Empty: no keyword condition.

membersTeamInboxMember[]Required
Child attributes
userIdstringRequired
tierstringRequired
  • "primary"
  • "secondary"
capacitynumber | nullRequired
skillsstring[] | nullRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
GET /api/v1/inbox/inboxes
curl -X GET "https://orbitwrite.com/api/v1/inbox/inboxes" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY"
Response
{
  "inboxes": [
    {
      "id": "string",
      "name": "string",
      "description": "string",
      "method": "manual",
      "skillsEnabled": true,
      "awayReassign": true,
      "rrAssignWhenAway": true,
      "position": 0,
      "wrapUpMinutes": 0,
      "createdAt": "string",
      "updatedAt": "string",
      "sources": [
        {
          "id": "string",
          "accountId": "string",
          "platform": "string",
          "type": "reply",
          "keywords": [
            "string"
          ]
        }
      ],
      "members": [
        {
          "userId": "string",
          "tier": "primary",
          "capacity": 0,
          "skills": [
            "string"
          ]
        }
      ]
    }
  ]
}

Create a team inbox#

POST/api/v1/inbox/inboxes

Requires teamInbox:create (manager+). A team inbox receives what its sources claim — the first team inbox in the routing order (PUT /inbox/inboxes/order; a new one goes last) with a matching source wins — and everything else stays with the workspace's own assignment (/inbox/assignment). A source needs at least one condition: account, platform, type, or keywords.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Body application/json

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

namestringRequired

Between 1 and 120 characters.

descriptionstring | null

At most 500 characters.

methodstring
  • "manual"
  • "round_robin"
  • "balanced"
wrapUpMinutesinteger

Between 0 and 240.

sourcesobject[]

At most 50 items.

Child attributes
accountIdstring | null

At least 1 character.

platformstring | null
  • "bluesky"
  • "twitter"
  • "threads"
  • "mastodon"
  • "facebook_page"
  • "instagram"
  • "linkedin_page"
  • null
typestring | null
  • "reply"
  • "mention"
  • null
keywordsstring[] | null

At most 50 items.

membersobject[]

At most 200 items.

Child attributes
userIdstringRequired

At least 1 character.

tierstring
  • "primary"
  • "secondary"
capacityinteger | null

At least 0.

skillsstring[] | null

Responses

200TeamInbox

The created inbox

Response attributes
idstringRequired
namestringRequired
descriptionstring | nullRequired
methodstringRequired
  • "manual"
  • "round_robin"
  • "balanced"
skillsEnabledbooleanRequired
awayReassignbooleanRequired
rrAssignWhenAwaybooleanRequired
positionnumberRequired

Routing order: a new conversation goes to the first team inbox, lowest position first, with a source that matches it. Set with PUT /inbox/inboxes/order.

wrapUpMinutesnumberRequired
createdAtstringRequired
updatedAtstringRequired
sourcesTeamInboxSource[]Required
Child attributes
idstringRequired
accountIdstring | nullRequired
platformstring | nullRequired
typestring | nullRequired
  • "reply"
  • "mention"
  • null
keywordsstring[]Required

Matches when the preview contains any of these, ignoring case. Empty: no keyword condition.

membersTeamInboxMember[]Required
Child attributes
userIdstringRequired
tierstringRequired
  • "primary"
  • "secondary"
capacitynumber | nullRequired
skillsstring[] | nullRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
POST /api/v1/inbox/inboxes
curl -X POST "https://orbitwrite.com/api/v1/inbox/inboxes" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "string"
}'
Response
{
  "id": "string",
  "name": "string",
  "description": "string",
  "method": "manual",
  "skillsEnabled": true,
  "awayReassign": true,
  "rrAssignWhenAway": true,
  "position": 0,
  "wrapUpMinutes": 0,
  "createdAt": "string",
  "updatedAt": "string",
  "sources": [
    {
      "id": "string",
      "accountId": "string",
      "platform": "string",
      "type": "reply",
      "keywords": [
        "string"
      ]
    }
  ],
  "members": [
    {
      "userId": "string",
      "tier": "primary",
      "capacity": 0,
      "skills": [
        "string"
      ]
    }
  ]
}

Set the team inboxes' routing order#

PUT/api/v1/inbox/inboxes/order

Requires teamInbox:update (manager+). A new conversation goes to the first team inbox, in this order, with a source that matches it; anything no team inbox claims goes to the workspace's assignment. inboxIds must list every team inbox exactly once.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Query parameters

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

Body application/json

inboxIdsstring[]Required

At most 200 items.

Responses

200object

The team inboxes, in their new order

Response attributes
inboxesTeamInbox[]Required
Child attributes
idstringRequired
namestringRequired
descriptionstring | nullRequired
methodstringRequired
  • "manual"
  • "round_robin"
  • "balanced"
skillsEnabledbooleanRequired
awayReassignbooleanRequired
rrAssignWhenAwaybooleanRequired
positionnumberRequired

Routing order: a new conversation goes to the first team inbox, lowest position first, with a source that matches it. Set with PUT /inbox/inboxes/order.

wrapUpMinutesnumberRequired
createdAtstringRequired
updatedAtstringRequired
sourcesTeamInboxSource[]Required
Child attributes
idstringRequired
accountIdstring | nullRequired
platformstring | nullRequired
typestring | nullRequired
  • "reply"
  • "mention"
  • null
keywordsstring[]Required

Matches when the preview contains any of these, ignoring case. Empty: no keyword condition.

membersTeamInboxMember[]Required
Child attributes
userIdstringRequired
tierstringRequired
  • "primary"
  • "secondary"
capacitynumber | nullRequired
skillsstring[] | nullRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
PUT /api/v1/inbox/inboxes/order
curl -X PUT "https://orbitwrite.com/api/v1/inbox/inboxes/order" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "inboxIds": [
    "string"
  ]
}'
Response
{
  "inboxes": [
    {
      "id": "string",
      "name": "string",
      "description": "string",
      "method": "manual",
      "skillsEnabled": true,
      "awayReassign": true,
      "rrAssignWhenAway": true,
      "position": 0,
      "wrapUpMinutes": 0,
      "createdAt": "string",
      "updatedAt": "string",
      "sources": [
        {
          "id": "string",
          "accountId": "string",
          "platform": "string",
          "type": "reply",
          "keywords": [
            "string"
          ]
        }
      ],
      "members": [
        {
          "userId": "string",
          "tier": "primary",
          "capacity": 0,
          "skills": [
            "string"
          ]
        }
      ]
    }
  ]
}

Get my inbox availability#

GET/api/v1/inbox/status

Requires a signed-in user. The caller's own status.

Authentication

A signed-in session only. The Orbitwrite app calls this; an API key is refused.

Query parameters

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

Responses

200TeammateStatus

The caller's status

Response attributes
userIdstringRequired
statusstringRequired
  • "active"
  • "away"
  • "away_reassign"
autoAwaybooleanRequired
updatedAtstringRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
GET /api/v1/inbox/status
curl -X GET "https://orbitwrite.com/api/v1/inbox/status" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY"
Response
{
  "userId": "string",
  "status": "active",
  "autoAway": true,
  "updatedAt": "string"
}

Set inbox availability#

PUT/api/v1/inbox/status

Requires inboxStatus:update for your own status; naming another userId needs inboxStatus:manageAny (manager+) and a member of the workspace. A workspace API key has no status of its own, so it must name userId and needs inboxStatus:manageAny. Away/away_reassign gate a teammate out of automatic assignment.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Body application/json

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

userIdstring

At least 1 character.

statusstringRequired
  • "active"
  • "away"
  • "away_reassign"

Responses

200TeammateStatus

The updated status

Response attributes
userIdstringRequired
statusstringRequired
  • "active"
  • "away"
  • "away_reassign"
autoAwaybooleanRequired
updatedAtstringRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
PUT /api/v1/inbox/status
curl -X PUT "https://orbitwrite.com/api/v1/inbox/status" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "status": "active"
}'
Response
{
  "userId": "string",
  "status": "active",
  "autoAway": true,
  "updatedAt": "string"
}

Heartbeat: I'm active in the inbox#

POST/api/v1/inbox/presence

Requires a signed-in user. Records the caller as active so the auto-away sweep doesn't flag them; resuming after an auto-away clears it immediately.

Authentication

A signed-in session only. The Orbitwrite app calls this; an API key is refused.

Body application/json

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

Responses

200object

Recorded

Response attributes
okbooleanRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
POST /api/v1/inbox/presence
curl -X POST "https://orbitwrite.com/api/v1/inbox/presence" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "organizationId": "string"
}'
Response
{
  "ok": true
}

The team pool#

GET/api/v1/inbox/team

Requires inboxStatus:read. Every member with their availability and current open-conversation load.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Query parameters

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

Responses

200object

The team pool

Response attributes
membersTeamPoolMember[]Required
Child attributes
userIdstringRequired
namestringRequired
avatarUrlstring | nullRequired
statusstringRequired
  • "active"
  • "away"
  • "away_reassign"
autoAwaybooleanRequired
openCountnumberRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
GET /api/v1/inbox/team
curl -X GET "https://orbitwrite.com/api/v1/inbox/team" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY"
Response
{
  "members": [
    {
      "userId": "string",
      "name": "string",
      "avatarUrl": "string",
      "status": "active",
      "autoAway": true,
      "openCount": 0
    }
  ]
}

Get workspace inbox settings#

GET/api/v1/inbox/settings

Requires teamInbox:read. Defaults when never configured.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Query parameters

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

Responses

200InboxSettings

The settings

Response attributes
defaultMemberCapacitynumberRequired
collisionHandlingstringRequired
  • "off"
  • "warn"
  • "soft_lock"
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
GET /api/v1/inbox/settings
curl -X GET "https://orbitwrite.com/api/v1/inbox/settings" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY"
Response
{
  "defaultMemberCapacity": 0,
  "autoAwayThresholdMinutes": 0,
  "autoAwayPausesAssignment": true,
  "collisionHandling": "off"
}

Update workspace inbox settings#

PUT/api/v1/inbox/settings

Requires teamInbox:update (manager+). Partial — omitted fields stay.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Body application/json

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

defaultMemberCapacityinteger

Between 1 and 1000.

autoAwayThresholdMinutesinteger

Between 1 and 1440.

collisionHandlingstring
  • "off"
  • "warn"
  • "soft_lock"

Responses

200InboxSettings

The updated settings

Response attributes
defaultMemberCapacitynumberRequired
collisionHandlingstringRequired
  • "off"
  • "warn"
  • "soft_lock"
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
PUT /api/v1/inbox/settings
curl -X PUT "https://orbitwrite.com/api/v1/inbox/settings" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "organizationId": "string",
  "defaultMemberCapacity": 1,
  "autoAwayThresholdMinutes": 1,
  "autoAwayPausesAssignment": true,
  "collisionHandling": "off"
}'
Response
{
  "defaultMemberCapacity": 0,
  "autoAwayThresholdMinutes": 0,
  "autoAwayPausesAssignment": true,
  "collisionHandling": "off"
}

How the workspace assigns conversations#

GET/api/v1/inbox/assignment

Requires teamInbox:read. The method and rotation applied to every conversation no team inbox claims, plus waitingCount — how many open conversations have no owner. A workspace that has never changed it reads as the default: round robin across everyone.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Query parameters

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

Responses

200InboxAssignment

The workspace's assignment

Response attributes
methodstringRequired
  • "manual"
  • "round_robin"
  • "balanced"
allMembersbooleanRequired

The rotation is every workspace member, including people who join later. When false, members is the rotation.

membersTeamInboxMember[]Required

The named rotation. Kept while allMembers is on, so switching back restores it.

Child attributes
userIdstringRequired
tierstringRequired
  • "primary"
  • "secondary"
capacitynumber | nullRequired
skillsstring[] | nullRequired
rrAssignWhenAwaybooleanRequired
wrapUpMinutesnumberRequired
waitingCountnumberRequired

Open conversations with no owner right now.

waitingInManualobject[]Required

Of the waiting conversations, those routing files under a manual inbox, per inbox. POST /inbox/assignment/distribute can't assign these; someone pulls them.

Child attributes
inboxIdstringRequired
namestringRequired
isWorkspacebooleanRequired

The workspace inbox itself — the workspace's assignment is manual.

countintegerRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
GET /api/v1/inbox/assignment
curl -X GET "https://orbitwrite.com/api/v1/inbox/assignment" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY"
Response
{
  "method": "manual",
  "allMembers": true,
  "members": [
    {
      "userId": "string",
      "tier": "primary",
      "capacity": 0,
      "skills": [
        "string"
      ]
    }
  ],
  "rrAssignWhenAway": true,
  "wrapUpMinutes": 0,
  "waitingCount": 0,
  "waitingInManual": [
    {
      "inboxId": "string",
      "name": "string",
      "isWorkspace": true,
      "count": 0
    }
  ]
}

Set how the workspace assigns conversations#

PUT/api/v1/inbox/assignment

Requires teamInbox:update (manager+). A patch: omitted fields keep their value. allMembers:true puts every workspace member in the rotation, including people who join later; with it off, members is the rotation and must name someone while the method assigns automatically. Applies to conversations arriving after it — POST /inbox/assignment/distribute hands out the ones already waiting.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Body application/json

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

methodstring
  • "manual"
  • "round_robin"
  • "balanced"
allMembersboolean
membersobject[]

At most 200 items.

Child attributes
userIdstringRequired

At least 1 character.

tierstring
  • "primary"
  • "secondary"
capacityinteger | null

At least 0.

skillsstring[] | null
wrapUpMinutesinteger

Between 0 and 240.

Responses

200InboxAssignment

The updated assignment

Response attributes
methodstringRequired
  • "manual"
  • "round_robin"
  • "balanced"
allMembersbooleanRequired

The rotation is every workspace member, including people who join later. When false, members is the rotation.

membersTeamInboxMember[]Required

The named rotation. Kept while allMembers is on, so switching back restores it.

Child attributes
userIdstringRequired
tierstringRequired
  • "primary"
  • "secondary"
capacitynumber | nullRequired
skillsstring[] | nullRequired
rrAssignWhenAwaybooleanRequired
wrapUpMinutesnumberRequired
waitingCountnumberRequired

Open conversations with no owner right now.

waitingInManualobject[]Required

Of the waiting conversations, those routing files under a manual inbox, per inbox. POST /inbox/assignment/distribute can't assign these; someone pulls them.

Child attributes
inboxIdstringRequired
namestringRequired
isWorkspacebooleanRequired

The workspace inbox itself — the workspace's assignment is manual.

countintegerRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
PUT /api/v1/inbox/assignment
curl -X PUT "https://orbitwrite.com/api/v1/inbox/assignment" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "organizationId": "string",
  "method": "manual",
  "allMembers": true,
  "members": [
    {
      "userId": "string"
    }
  ],
  "rrAssignWhenAway": true,
  "wrapUpMinutes": 0
}'
Response
{
  "method": "manual",
  "allMembers": true,
  "members": [
    {
      "userId": "string",
      "tier": "primary",
      "capacity": 0,
      "skills": [
        "string"
      ]
    }
  ],
  "rrAssignWhenAway": true,
  "wrapUpMinutes": 0,
  "waitingCount": 0,
  "waitingInManual": [
    {
      "inboxId": "string",
      "name": "string",
      "isWorkspace": true,
      "count": 0
    }
  ]
}

Hand out the conversations already waiting#

POST/api/v1/inbox/assignment/distribute

Requires teamInbox:update (manager+). Assigns open conversations that have no owner, oldest first, through the same routing a new arrival gets — the workspace's assignment, or a team inbox's when one claims the conversation. Routing only decides a conversation when it arrives, so this is how a backlog gets owners. Up to 500 a call; waiting is how many still have none (a manual method, or nobody available, assigns nothing), and waitingInManual which of those a manual inbox holds — another call won't assign them.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Body application/json

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

Responses

200object

How many were assigned, and how many still wait

Response attributes
assignedintegerRequired
waitingintegerRequired
waitingInManualobject[]Required

Of the waiting conversations, those routing files under a manual inbox, per inbox. POST /inbox/assignment/distribute can't assign these; someone pulls them.

Child attributes
inboxIdstringRequired
namestringRequired
isWorkspacebooleanRequired

The workspace inbox itself — the workspace's assignment is manual.

countintegerRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
POST /api/v1/inbox/assignment/distribute
curl -X POST "https://orbitwrite.com/api/v1/inbox/assignment/distribute" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "organizationId": "string"
}'
Response
{
  "assigned": 0,
  "waiting": 0,
  "waitingInManual": [
    {
      "inboxId": "string",
      "name": "string",
      "isWorkspace": true,
      "count": 0
    }
  ]
}

Get a team inbox#

GET/api/v1/inbox/inboxes/{inboxId}

Requires teamInbox:read.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Path parameters

inboxIdstringRequired

At least 1 character.

Query parameters

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

Responses

200TeamInbox

The team inbox

Response attributes
idstringRequired
namestringRequired
descriptionstring | nullRequired
methodstringRequired
  • "manual"
  • "round_robin"
  • "balanced"
skillsEnabledbooleanRequired
awayReassignbooleanRequired
rrAssignWhenAwaybooleanRequired
positionnumberRequired

Routing order: a new conversation goes to the first team inbox, lowest position first, with a source that matches it. Set with PUT /inbox/inboxes/order.

wrapUpMinutesnumberRequired
createdAtstringRequired
updatedAtstringRequired
sourcesTeamInboxSource[]Required
Child attributes
idstringRequired
accountIdstring | nullRequired
platformstring | nullRequired
typestring | nullRequired
  • "reply"
  • "mention"
  • null
keywordsstring[]Required

Matches when the preview contains any of these, ignoring case. Empty: no keyword condition.

membersTeamInboxMember[]Required
Child attributes
userIdstringRequired
tierstringRequired
  • "primary"
  • "secondary"
capacitynumber | nullRequired
skillsstring[] | nullRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
404Error

The resource does not exist

Response attributes
errorstringRequired
issuesany[]
GET /api/v1/inbox/inboxes/{inboxId}
curl -X GET "https://orbitwrite.com/api/v1/inbox/inboxes/{inboxId}" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY"
Response
{
  "id": "string",
  "name": "string",
  "description": "string",
  "method": "manual",
  "skillsEnabled": true,
  "awayReassign": true,
  "rrAssignWhenAway": true,
  "position": 0,
  "wrapUpMinutes": 0,
  "createdAt": "string",
  "updatedAt": "string",
  "sources": [
    {
      "id": "string",
      "accountId": "string",
      "platform": "string",
      "type": "reply",
      "keywords": [
        "string"
      ]
    }
  ],
  "members": [
    {
      "userId": "string",
      "tier": "primary",
      "capacity": 0,
      "skills": [
        "string"
      ]
    }
  ]
}

Update a team inbox#

PATCH/api/v1/inbox/inboxes/{inboxId}

Requires teamInbox:update (manager+). sources and members, when present, replace the existing lists.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Path parameters

inboxIdstringRequired

At least 1 character.

Body application/json

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

namestring

Between 1 and 120 characters.

descriptionstring | null

At most 500 characters.

methodstring
  • "manual"
  • "round_robin"
  • "balanced"
wrapUpMinutesinteger

Between 0 and 240.

sourcesobject[]

At most 50 items.

Child attributes
accountIdstring | null

At least 1 character.

platformstring | null
  • "bluesky"
  • "twitter"
  • "threads"
  • "mastodon"
  • "facebook_page"
  • "instagram"
  • "linkedin_page"
  • null
typestring | null
  • "reply"
  • "mention"
  • null
keywordsstring[] | null

At most 50 items.

membersobject[]

At most 200 items.

Child attributes
userIdstringRequired

At least 1 character.

tierstring
  • "primary"
  • "secondary"
capacityinteger | null

At least 0.

skillsstring[] | null

Responses

200TeamInbox

The updated inbox

Response attributes
idstringRequired
namestringRequired
descriptionstring | nullRequired
methodstringRequired
  • "manual"
  • "round_robin"
  • "balanced"
skillsEnabledbooleanRequired
awayReassignbooleanRequired
rrAssignWhenAwaybooleanRequired
positionnumberRequired

Routing order: a new conversation goes to the first team inbox, lowest position first, with a source that matches it. Set with PUT /inbox/inboxes/order.

wrapUpMinutesnumberRequired
createdAtstringRequired
updatedAtstringRequired
sourcesTeamInboxSource[]Required
Child attributes
idstringRequired
accountIdstring | nullRequired
platformstring | nullRequired
typestring | nullRequired
  • "reply"
  • "mention"
  • null
keywordsstring[]Required

Matches when the preview contains any of these, ignoring case. Empty: no keyword condition.

membersTeamInboxMember[]Required
Child attributes
userIdstringRequired
tierstringRequired
  • "primary"
  • "secondary"
capacitynumber | nullRequired
skillsstring[] | nullRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
404Error

The resource does not exist

Response attributes
errorstringRequired
issuesany[]
PATCH /api/v1/inbox/inboxes/{inboxId}
curl -X PATCH "https://orbitwrite.com/api/v1/inbox/inboxes/{inboxId}" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "organizationId": "string",
  "name": "string",
  "description": "string",
  "method": "manual",
  "skillsEnabled": true,
  "awayReassign": true,
  "rrAssignWhenAway": true,
  "wrapUpMinutes": 0,
  "sources": [
    {
      "accountId": "string",
      "platform": "bluesky",
      "type": "reply",
      "keywords": [
        "string"
      ]
    }
  ],
  "members": [
    {
      "userId": "string"
    }
  ]
}'
Response
{
  "id": "string",
  "name": "string",
  "description": "string",
  "method": "manual",
  "skillsEnabled": true,
  "awayReassign": true,
  "rrAssignWhenAway": true,
  "position": 0,
  "wrapUpMinutes": 0,
  "createdAt": "string",
  "updatedAt": "string",
  "sources": [
    {
      "id": "string",
      "accountId": "string",
      "platform": "string",
      "type": "reply",
      "keywords": [
        "string"
      ]
    }
  ],
  "members": [
    {
      "userId": "string",
      "tier": "primary",
      "capacity": 0,
      "skills": [
        "string"
      ]
    }
  ]
}

Delete a team inbox#

DELETE/api/v1/inbox/inboxes/{inboxId}

Requires teamInbox:delete (manager+). Its conversations keep their owners and go back to the workspace's own assignment.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Path parameters

inboxIdstringRequired

At least 1 character.

Body application/json

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

Responses

200object

Deleted

Response attributes
okbooleanRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
404Error

The resource does not exist

Response attributes
errorstringRequired
issuesany[]
DELETE /api/v1/inbox/inboxes/{inboxId}
curl -X DELETE "https://orbitwrite.com/api/v1/inbox/inboxes/{inboxId}" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "organizationId": "string"
}'
Response
{
  "ok": true
}