API reference
2 endpoints, served at https://orbitwrite.com/api/v1. Each one lists the credentials it accepts, its parameters and every response it can give.
What each platform a channel can be connected to accepts: character limits (and the premium ceiling, for X Premium), whether threads are allowed, media limits (count, types, sizes, video length, frame rate, aspect ratio), the postFormat values it offers and what each narrows, polls, quotes, reply settings and the JSON Schema of its platformOptions. The server enforces every rule here; read it to shape a post before sending. Any credential is served, whatever its scopes.
An API key or OAuth access token as a bearer token, or a signed-in session.
200objectOne entry per platform, in the app's order
platformsobject[]RequiredplatformstringRequiredThe platform id, as list_channels / GET /connected-accounts report it.
namestringRequiredtextobjectRequiredmaxCharsintegerRequiredPer post, or per thread item.
unitstringRequiredgraphemes counts each emoji as one.
"chars""graphemes"withMediaMaxCharsinteger | nullRequiredA tighter ceiling when the post carries media (Telegram captions).
commentMaxCharsinteger | nullRequiredThe ceiling for an auto-comment, when tighter than a post.
threadsbooleanRequiredWhether a post may be a chain of items. Each item has the text limit; there is no cap on the number of items.
mediaobjectRequiredmaxItemsintegerRequiredAttachments per post (per thread item). 0: none.
requiredbooleanRequiredA post without media is refused.
mimeTypesstring[]Requiredimageobject | nullRequiredNull: no images.
maxBytesintegerRequiredmaxGifBytesinteger | nullRequiredvideoobject | nullRequiredNull: no video.
maxBytesintegerRequiredmaxDurationSecinteger | nullRequiredminDurationSecnumber | nullRequiredminFrameRatenumber | nullRequiredexclusivebooleanRequiredA video takes the whole post: no other media beside it.
externalGifsbooleanRequiredAccepts a GIF from GIF search.
gifExclusivestring | nullRequiredA GIF takes the whole post. any: every GIF; picked: a GIF from GIF search. Null: GIFs mix with other media.
"any""picked"nullaspectRatioobject | nullRequiredWidth ÷ height. Null: unconstrained.
minnumber | nullRequiredmaxnumber | nullRequiredpreferrednumber | nullRequiredcarouselMatchesFirstbooleanRequiredEvery carousel slide, video included, is cropped to the first slide's shape.
formatsobject[]RequiredThe postFormat values this platform offers, default first, with what each narrows. Empty: feed posts only.
formatstringRequired"post""story""reel""short"maxItemsintegerRequiredrequiresVideobooleanRequiredpublishesTextbooleanRequiredFalse: the text is not published (an Instagram story has no caption).
maxVideoBytesinteger | nullRequiredmaxVideoDurationSecinteger | nullRequiredmaxAspectRationumber | nullRequiredpollsobject | nullRequiredNull: no polls.
minOptionsintegerRequiredmaxOptionsintegerRequiredoptionMaxCharsintegerRequiredminDurationMinutesintegerRequiredmaxDurationMinutesintegerRequiredquotesbooleanRequiredAccepts a quoteUrl.
repliesbooleanRequiredAccepts a replyToUrl: publishing as a reply to an existing post.
linkPreviewsbooleanRequiredreplySettingsstring[]RequiredValues for replySettings (who may reply). Empty: not settable.
optionsobject | nullRequiredNetwork-specific settings for platformOptions. Null: none.
aiLabelobject | nullRequiredWhere to label a post as AI-generated, so the network shows its own AI label on it. Null: the network's API has no such label. Read the field's description in options.schema: YouTube's covers realistic altered or synthetic content only, and X's applies to posts with media.
curl -X GET "https://orbitwrite.com/api/v1/platforms" \
-H "Authorization: Bearer $ORBITWRITE_API_KEY"{
"platforms": [
{
"platform": "string",
"name": "string",
"text": {
"maxChars": 0,
"unit": "chars",
"premiumMaxChars": 0,
"premiumLabel": "string",
"withMediaMaxChars": 0,
"commentMaxChars": 0
},
"threads": true,
"media": {
"maxItems": 0,
"required": true,
"mimeTypes": [
"string"
],
"image": {
"maxBytes": 0,
"maxGifBytes": 0
},
"video": {
"maxBytes": 0,
"maxDurationSec": 0,
"minDurationSec": 0,
"minFrameRate": 0,
"exclusive": true
},
"externalGifs": true,
"gifExclusive": "any",
"aspectRatio": {
"min": 0,
"max": 0,
"preferred": 0,
"carouselMatchesFirst": true
},
"document": {
"mimeTypes": [
"string"
],
"maxBytes": 0,
"maxPages": 0
}
},
"formats": [
{
"format": "post",
"maxItems": 0,
"requiresVideo": true,
"publishesText": true,
"maxVideoBytes": 0,
"maxVideoDurationSec": 0,
"maxAspectRatio": 0
}
],
"polls": {
"minOptions": 0,
"maxOptions": 0,
"optionMaxChars": 0,
"minDurationMinutes": 0,
"maxDurationMinutes": 0
},
"quotes": true,
"replies": true,
"linkPreviews": true,
"replySettings": [
"string"
],
"options": {
"key": "string",
"schema": {}
},
"aiLabel": {
"key": "string",
"field": "string"
}
}
]
}The rules for one platform, by the id GET /connected-accounts reports (twitter, linkedin_page, instagram, …). Same shape as an entry of GET /platforms.
An API key or OAuth access token as a bearer token, or a signed-in session.
platformstringRequired200objectThe platform's rules
platformobjectRequiredplatformstringRequiredThe platform id, as list_channels / GET /connected-accounts report it.
namestringRequiredtextobjectRequiredmaxCharsintegerRequiredPer post, or per thread item.
unitstringRequiredgraphemes counts each emoji as one.
"chars""graphemes"withMediaMaxCharsinteger | nullRequiredA tighter ceiling when the post carries media (Telegram captions).
commentMaxCharsinteger | nullRequiredThe ceiling for an auto-comment, when tighter than a post.
threadsbooleanRequiredWhether a post may be a chain of items. Each item has the text limit; there is no cap on the number of items.
mediaobjectRequiredmaxItemsintegerRequiredAttachments per post (per thread item). 0: none.
requiredbooleanRequiredA post without media is refused.
mimeTypesstring[]Requiredimageobject | nullRequiredNull: no images.
maxBytesintegerRequiredmaxGifBytesinteger | nullRequiredvideoobject | nullRequiredNull: no video.
maxBytesintegerRequiredmaxDurationSecinteger | nullRequiredminDurationSecnumber | nullRequiredminFrameRatenumber | nullRequiredexclusivebooleanRequiredA video takes the whole post: no other media beside it.
externalGifsbooleanRequiredAccepts a GIF from GIF search.
gifExclusivestring | nullRequiredA GIF takes the whole post. any: every GIF; picked: a GIF from GIF search. Null: GIFs mix with other media.
"any""picked"nullaspectRatioobject | nullRequiredWidth ÷ height. Null: unconstrained.
minnumber | nullRequiredmaxnumber | nullRequiredpreferrednumber | nullRequiredcarouselMatchesFirstbooleanRequiredEvery carousel slide, video included, is cropped to the first slide's shape.
formatsobject[]RequiredThe postFormat values this platform offers, default first, with what each narrows. Empty: feed posts only.
formatstringRequired"post""story""reel""short"maxItemsintegerRequiredrequiresVideobooleanRequiredpublishesTextbooleanRequiredFalse: the text is not published (an Instagram story has no caption).
maxVideoBytesinteger | nullRequiredmaxVideoDurationSecinteger | nullRequiredmaxAspectRationumber | nullRequiredpollsobject | nullRequiredNull: no polls.
minOptionsintegerRequiredmaxOptionsintegerRequiredoptionMaxCharsintegerRequiredminDurationMinutesintegerRequiredmaxDurationMinutesintegerRequiredquotesbooleanRequiredAccepts a quoteUrl.
repliesbooleanRequiredAccepts a replyToUrl: publishing as a reply to an existing post.
linkPreviewsbooleanRequiredreplySettingsstring[]RequiredValues for replySettings (who may reply). Empty: not settable.
optionsobject | nullRequiredNetwork-specific settings for platformOptions. Null: none.
aiLabelobject | nullRequiredWhere to label a post as AI-generated, so the network shows its own AI label on it. Null: the network's API has no such label. Read the field's description in options.schema: YouTube's covers realistic altered or synthetic content only, and X's applies to posts with media.
curl -X GET "https://orbitwrite.com/api/v1/platforms/{platform}" \
-H "Authorization: Bearer $ORBITWRITE_API_KEY"{
"platform": {
"platform": "string",
"name": "string",
"text": {
"maxChars": 0,
"unit": "chars",
"premiumMaxChars": 0,
"premiumLabel": "string",
"withMediaMaxChars": 0,
"commentMaxChars": 0
},
"threads": true,
"media": {
"maxItems": 0,
"required": true,
"mimeTypes": [
"string"
],
"image": {
"maxBytes": 0,
"maxGifBytes": 0
},
"video": {
"maxBytes": 0,
"maxDurationSec": 0,
"minDurationSec": 0,
"minFrameRate": 0,
"exclusive": true
},
"externalGifs": true,
"gifExclusive": "any",
"aspectRatio": {
"min": 0,
"max": 0,
"preferred": 0,
"carouselMatchesFirst": true
},
"document": {
"mimeTypes": [
"string"
],
"maxBytes": 0,
"maxPages": 0
}
},
"formats": [
{
"format": "post",
"maxItems": 0,
"requiresVideo": true,
"publishesText": true,
"maxVideoBytes": 0,
"maxVideoDurationSec": 0,
"maxAspectRatio": 0
}
],
"polls": {
"minOptions": 0,
"maxOptions": 0,
"optionMaxChars": 0,
"minDurationMinutes": 0,
"maxDurationMinutes": 0
},
"quotes": true,
"replies": true,
"linkPreviews": true,
"replySettings": [
"string"
],
"options": {
"key": "string",
"schema": {}
},
"aiLabel": {
"key": "string",
"field": "string"
}
}
}