API reference
9 endpoints, served at https://orbitwrite.com/api/v1. Each one lists the credentials it accepts, its parameters and every response it can give.
/api/v1/connected-accountsPOST/api/v1/connected-accounts/{accountId}/disconnectPOST/api/v1/connected-accounts/{accountId}/primaryPOST/api/v1/connected-accounts/{accountId}/default-selectedGET/api/v1/connected-accounts/{accountId}/automation-defaultsPUT/api/v1/connected-accounts/{accountId}/automation-defaultsGET/api/v1/connected-accounts/{accountId}/tiktok/creator-infoGET/api/v1/connected-accounts/{accountId}/pinterest/boardsPOST/api/v1/connected-accounts/{accountId}/pinterest/boardsEvery channel in the workspace, live and disconnected, in a stable order. Read this rather than deriving channels from a page's own data when you need one channel by id — the caller then doesn't have to already hold the list. Tokens are never returned.
An API key or OAuth access token as a bearer token, or a signed-in session.
organizationIdstringSession callers only — an API key already determines the workspace.
At least 1 character.
200ConnectedAccountListThe workspace's channels
accountsConnectedAccount[]RequiredidstringRequiredplatformstringRequiredhandlestring | nullRequiredThe channel's handle on its platform, as it was at connect time.
displayNamestring | nullRequiredavatarUrlstring | nullRequiredprofileUrlstring | nullRequiredThe channel's public profile page. Null where the platform has none (Discord, Slack) or the handle can't name one.
needsReconnectbooleanRequiredThe platform credentials are dead — the channel can't publish until it's reconnected.
inboxReconnectNeededbooleanRequiredLinkedIn Pages only: the grant predates the comment-read scope the inbox needs (r_organization_social). Publishing works; comments can't be pulled until the Page is reconnected.
defaultSelectedbooleanRequiredPre-selected when a fresh post is composed.
disconnectedbooleanRequiredDisconnected from the workspace. Disconnecting is a soft revoke so the channel's posts survive, which is why these rows are returned rather than hidden: they still have to be reachable to reconnect or to clear their content.
isPremiumbooleanRequiredX Premium, which raises the composer's character limit from 280 to 25,000.
autoEngagementDefaultsAutomationDefaults | nullRequiredStored defaults that seed the composer's auto-engagement panel for this channel; null when never configured.
commentAutoEngagementDefaultSectionRequiredenabledbooleanRequiredentriesAutoEngagementDefaultEntry[]RequiredfromAccountIdstringRequiredAt least 1 character.
delayMinutesintegerRequiredAt least 0.
likeAutoEngagementLikeDefaultSectionRequiredenabledbooleanRequiredentriesobject[]RequiredfromAccountIdstringRequiredAt least 1 character.
delayMinutesintegerRequiredAt least 0.
reactionstring"LIKE""LOVE""CELEBRATE""INSIGHTFUL""CURIOUS""SUPPORT"repostAutoEngagementDefaultSectionRequiredenabledbooleanRequiredentriesAutoEngagementDefaultEntry[]RequiredfromAccountIdstringRequiredAt least 1 character.
delayMinutesintegerRequiredAt least 0.
slackAutoEngagementDefaultSectionRequiredenabledbooleanRequiredentriesAutoEngagementDefaultEntry[]RequiredfromAccountIdstringRequiredAt least 1 character.
delayMinutesintegerRequiredAt least 0.
discordAutoEngagementDefaultSectionRequiredenabledbooleanRequiredentriesAutoEngagementDefaultEntry[]RequiredfromAccountIdstringRequiredAt least 1 character.
delayMinutesintegerRequiredAt least 0.
primaryAccountIdstring | nullRequiredThe channel whose content the composer syncs to the others, or null when the workspace hasn't set one.
curl -X GET "https://orbitwrite.com/api/v1/connected-accounts" \
-H "Authorization: Bearer $ORBITWRITE_API_KEY"{
"accounts": [
{
"id": "string",
"platform": "string",
"handle": "string",
"displayName": "string",
"avatarUrl": "string",
"profileUrl": "string",
"needsReconnect": true,
"inboxReconnectNeeded": true,
"defaultSelected": true,
"disconnected": true,
"isPremium": true,
"carouselUnavailable": true,
"canShareToInstagram": true,
"autoEngagementDefaults": {
"comment": {
"enabled": true,
"entries": [
{
"fromAccountId": "string",
"delayMinutes": 0
}
]
},
"like": {
"enabled": true,
"entries": [
{
"fromAccountId": "string",
"delayMinutes": 0,
"reaction": "LIKE"
}
]
},
"repost": {
"enabled": true,
"entries": [
{
"fromAccountId": "string",
"delayMinutes": 0
}
]
},
"slack": {
"enabled": true,
"entries": [
{
"fromAccountId": "string",
"delayMinutes": 0
}
]
},
"discord": {
"enabled": true,
"entries": [
{
"fromAccountId": "string",
"delayMinutes": 0
}
]
},
"shareToInstagram": true
}
}
],
"primaryAccountId": "string"
}Revokes the connection (clears its tokens and drops it out of every live-account query) but KEEPS the account row, so its posts, drafts, published history, analytics, and posting slots survive and reattach if the user reconnects the same handle. Set purgePosts to instead delete the content this channel authored AND remove the channel row itself. Requires account:disconnect.
A signed-in session only. The Orbitwrite app calls this; an API key is refused.
200ConnectedAccountDisconnectResultThe account was disconnected
400ErrorInvalid request
401ErrorNot signed in
403ErrorNot a member of the organization
404ErrorThe resource does not exist
curl -X POST "https://orbitwrite.com/api/v1/connected-accounts/{accountId}/disconnect" \
-H "Authorization: Bearer $ORBITWRITE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"purgePosts": true
}'{
"ok": true,
"deletedPosts": 0,
"deletedGroups": 0,
"deletedComments": 0
}Requires account:update. A disconnected channel is refused (409) — it can't publish, and the primary is what the composer syncs content from.
A signed-in session only. The Orbitwrite app calls this; an API key is refused.
accountIdstringRequiredAt least 1 character.
200ConnectedAccountMutationResultThe mutation was applied
okbooleanRequiredcurl -X POST "https://orbitwrite.com/api/v1/connected-accounts/{accountId}/primary" \
-H "Authorization: Bearer $ORBITWRITE_API_KEY"{
"ok": true
}Requires account:update.
A signed-in session only. The Orbitwrite app calls this; an API key is refused.
accountIdstringRequiredAt least 1 character.
defaultSelectedbooleanRequired200ConnectedAccountMutationResultThe mutation was applied
okbooleanRequiredcurl -X POST "https://orbitwrite.com/api/v1/connected-accounts/{accountId}/default-selected" \
-H "Authorization: Bearer $ORBITWRITE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"defaultSelected": true
}'{
"ok": true
}The stored defaults that seed the composer's auto-engagement panel for this account; null when never configured. Any member may read (account:read).
A signed-in session only. The Orbitwrite app calls this; an API key is refused.
accountIdstringRequiredAt least 1 character.
200AutomationDefaultsResultThe stored defaults
autoEngagementDefaultsAutomationDefaults | nullRequiredStored defaults that seed the composer's auto-engagement panel for this channel; null when never configured.
commentAutoEngagementDefaultSectionRequiredenabledbooleanRequiredentriesAutoEngagementDefaultEntry[]RequiredfromAccountIdstringRequiredAt least 1 character.
delayMinutesintegerRequiredAt least 0.
likeAutoEngagementLikeDefaultSectionRequiredenabledbooleanRequiredentriesobject[]RequiredfromAccountIdstringRequiredAt least 1 character.
delayMinutesintegerRequiredAt least 0.
reactionstring"LIKE""LOVE""CELEBRATE""INSIGHTFUL""CURIOUS""SUPPORT"repostAutoEngagementDefaultSectionRequiredenabledbooleanRequiredentriesAutoEngagementDefaultEntry[]RequiredfromAccountIdstringRequiredAt least 1 character.
delayMinutesintegerRequiredAt least 0.
slackAutoEngagementDefaultSectionRequiredenabledbooleanRequiredentriesAutoEngagementDefaultEntry[]RequiredfromAccountIdstringRequiredAt least 1 character.
delayMinutesintegerRequiredAt least 0.
discordAutoEngagementDefaultSectionRequiredenabledbooleanRequiredentriesAutoEngagementDefaultEntry[]RequiredfromAccountIdstringRequiredAt least 1 character.
delayMinutesintegerRequiredAt least 0.
curl -X GET "https://orbitwrite.com/api/v1/connected-accounts/{accountId}/automation-defaults" \
-H "Authorization: Bearer $ORBITWRITE_API_KEY"{
"autoEngagementDefaults": {
"comment": {
"enabled": true,
"entries": [
{
"fromAccountId": "string",
"delayMinutes": 0
}
]
},
"like": {
"enabled": true,
"entries": [
{
"fromAccountId": "string",
"delayMinutes": 0,
"reaction": "LIKE"
}
]
},
"repost": {
"enabled": true,
"entries": [
{
"fromAccountId": "string",
"delayMinutes": 0
}
]
},
"slack": {
"enabled": true,
"entries": [
{
"fromAccountId": "string",
"delayMinutes": 0
}
]
},
"discord": {
"enabled": true,
"entries": [
{
"fromAccountId": "string",
"delayMinutes": 0
}
]
},
"shareToInstagram": true
}
}Replaces the stored defaults wholesale. Requires account:update.
A signed-in session only. The Orbitwrite app calls this; an API key is refused.
accountIdstringRequiredAt least 1 character.
commentAutoEngagementDefaultSectionRequiredenabledbooleanRequiredentriesAutoEngagementDefaultEntry[]RequiredfromAccountIdstringRequiredAt least 1 character.
delayMinutesintegerRequiredAt least 0.
likeAutoEngagementLikeDefaultSectionRequiredenabledbooleanRequiredentriesobject[]RequiredfromAccountIdstringRequiredAt least 1 character.
delayMinutesintegerRequiredAt least 0.
reactionstring"LIKE""LOVE""CELEBRATE""INSIGHTFUL""CURIOUS""SUPPORT"repostAutoEngagementDefaultSectionRequiredenabledbooleanRequiredentriesAutoEngagementDefaultEntry[]RequiredfromAccountIdstringRequiredAt least 1 character.
delayMinutesintegerRequiredAt least 0.
slackAutoEngagementDefaultSectionRequiredenabledbooleanRequiredentriesAutoEngagementDefaultEntry[]RequiredfromAccountIdstringRequiredAt least 1 character.
delayMinutesintegerRequiredAt least 0.
discordAutoEngagementDefaultSectionRequiredenabledbooleanRequiredentriesAutoEngagementDefaultEntry[]RequiredfromAccountIdstringRequiredAt least 1 character.
delayMinutesintegerRequiredAt least 0.
200ConnectedAccountMutationResultThe mutation was applied
okbooleanRequiredcurl -X PUT "https://orbitwrite.com/api/v1/connected-accounts/{accountId}/automation-defaults" \
-H "Authorization: Bearer $ORBITWRITE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"comment": {
"enabled": true,
"entries": [
{
"fromAccountId": "string",
"delayMinutes": 0
}
]
},
"like": {
"enabled": true,
"entries": [
{
"fromAccountId": "string",
"delayMinutes": 0
}
]
},
"repost": {
"enabled": true,
"entries": [
{
"fromAccountId": "string",
"delayMinutes": 0
}
]
},
"slack": {
"enabled": true,
"entries": [
{
"fromAccountId": "string",
"delayMinutes": 0
}
]
},
"discord": {
"enabled": true,
"entries": [
{
"fromAccountId": "string",
"delayMinutes": 0
}
]
}
}'{
"ok": true
}Requires account:read. Returns the privacy levels TikTok will accept for this creator, their comment/Duet/Stitch settings, and their own maximum video length. TikTok requires this before every Direct Post and refuses a privacy level it didn't offer, so build the post's options from this response rather than from a hard-coded list — an app still in review is offered SELF_ONLY and nothing else. Never cached: a creator can change these between composing and publishing.
An API key or OAuth access token as a bearer token, or a signed-in session.
accountIdstringRequiredAt least 1 character.
200TikTokCreatorInfoThe creator's current publishing options
privacyLevelOptionsstring[]Required"PUBLIC_TO_EVERYONE""MUTUAL_FOLLOW_FRIENDS""FOLLOWER_OF_CREATOR""SELF_ONLY"commentDisabledbooleanRequiredduetDisabledbooleanRequiredstitchDisabledbooleanRequiredmaxVideoPostDurationSecintegerRequiredcreatorUsernamestringcreatorNicknamestringcreatorAvatarUrlstring502objectTikTok couldn't be reached
errorstringRequiredcurl -X GET "https://orbitwrite.com/api/v1/connected-accounts/{accountId}/tiktok/creator-info" \
-H "Authorization: Bearer $ORBITWRITE_API_KEY"{
"privacyLevelOptions": [
"PUBLIC_TO_EVERYONE"
],
"commentDisabled": true,
"duetDisabled": true,
"stitchDisabled": true,
"maxVideoPostDurationSec": 0,
"creatorUsername": "string",
"creatorNickname": "string",
"creatorAvatarUrl": "string"
}Requires account:read. Returns the boards this Pinterest channel can save a Pin to. A Pin is always created on a board, so a post to Pinterest needs platformOptions.pinterest.boardId set to one of these ids before it can be scheduled or published. Secret boards aren't listed. Never cached.
An API key or OAuth access token as a bearer token, or a signed-in session.
accountIdstringRequiredAt least 1 character.
200objectThe channel's boards
502objectPinterest couldn't be reached
errorstringRequiredcurl -X GET "https://orbitwrite.com/api/v1/connected-accounts/{accountId}/pinterest/boards" \
-H "Authorization: Bearer $ORBITWRITE_API_KEY"{
"boards": [
{
"id": "string",
"name": "string",
"description": "string",
"privacy": "string",
"imageUrl": "string"
}
]
}Requires account:update. Creates a public board on this Pinterest channel and returns it, ready to use as platformOptions.pinterest.boardId. The board appears on the account's Pinterest profile immediately. Secret boards can't be created. A name Pinterest won't take (one already in use, for example) is a 400 carrying Pinterest's reason.
An API key or OAuth access token as a bearer token, or a signed-in session.
accountIdstringRequiredAt least 1 character.
namestringRequiredBetween 1 and 50 characters.
descriptionstringAt most 500 characters.
201objectThe new board
502objectPinterest couldn't be reached
errorstringRequiredcurl -X POST "https://orbitwrite.com/api/v1/connected-accounts/{accountId}/pinterest/boards" \
-H "Authorization: Bearer $ORBITWRITE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "string"
}'{
"board": {
"id": "string",
"name": "string",
"description": "string",
"privacy": "string",
"imageUrl": "string"
}
}