API reference

Platforms

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

List every network's posting rules#

GET/api/v1/platforms

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.

Authentication

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

Responses

200object

One entry per platform, in the app's order

Response attributes
platformsobject[]Required
Child attributes
platformstringRequired

The platform id, as list_channels / GET /connected-accounts report it.

namestringRequired
textobjectRequired
Child attributes
maxCharsintegerRequired

Per post, or per thread item.

unitstringRequired

graphemes counts each emoji as one.

  • "chars"
  • "graphemes"
premiumMaxCharsinteger | nullRequired

The ceiling for a premium account (X Premium), when the platform has one.

premiumLabelstring | nullRequired
withMediaMaxCharsinteger | nullRequired

A tighter ceiling when the post carries media (Telegram captions).

commentMaxCharsinteger | nullRequired

The ceiling for an auto-comment, when tighter than a post.

threadsbooleanRequired

Whether a post may be a chain of items. Each item has the text limit; there is no cap on the number of items.

mediaobjectRequired
Child attributes
maxItemsintegerRequired

Attachments per post (per thread item). 0: none.

requiredbooleanRequired

A post without media is refused.

mimeTypesstring[]Required
imageobject | nullRequired

Null: no images.

Child attributes
maxBytesintegerRequired
maxGifBytesinteger | nullRequired
videoobject | nullRequired

Null: no video.

Child attributes
maxBytesintegerRequired
maxDurationSecinteger | nullRequired
minDurationSecnumber | nullRequired
minFrameRatenumber | nullRequired
exclusivebooleanRequired

A video takes the whole post: no other media beside it.

externalGifsbooleanRequired

Accepts a GIF from GIF search.

gifExclusivestring | nullRequired

A GIF takes the whole post. any: every GIF; picked: a GIF from GIF search. Null: GIFs mix with other media.

  • "any"
  • "picked"
  • null
aspectRatioobject | nullRequired

Width ÷ height. Null: unconstrained.

Child attributes
minnumber | nullRequired
maxnumber | nullRequired
preferrednumber | nullRequired
carouselMatchesFirstbooleanRequired

Every carousel slide, video included, is cropped to the first slide's shape.

documentobject | nullRequired

A single document (PDF) in place of media. Null: no documents.

Child attributes
mimeTypesstring[]Required
maxBytesinteger | nullRequired
maxPagesinteger | nullRequired
formatsobject[]Required

The postFormat values this platform offers, default first, with what each narrows. Empty: feed posts only.

Child attributes
formatstringRequired
  • "post"
  • "story"
  • "reel"
  • "short"
maxItemsintegerRequired
requiresVideobooleanRequired
publishesTextbooleanRequired

False: the text is not published (an Instagram story has no caption).

maxVideoBytesinteger | nullRequired
maxVideoDurationSecinteger | nullRequired
maxAspectRationumber | nullRequired
pollsobject | nullRequired

Null: no polls.

Child attributes
minOptionsintegerRequired
maxOptionsintegerRequired
optionMaxCharsintegerRequired
minDurationMinutesintegerRequired
maxDurationMinutesintegerRequired
quotesbooleanRequired

Accepts a quoteUrl.

repliesbooleanRequired

Accepts a replyToUrl: publishing as a reply to an existing post.

linkPreviewsbooleanRequired
replySettingsstring[]Required

Values for replySettings (who may reply). Empty: not settable.

optionsobject | nullRequired

Network-specific settings for platformOptions. Null: none.

Child attributes
keystringRequired

The key under platformOptions.

schemaobjectRequired

JSON Schema of the options object.

aiLabelobject | nullRequired

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

Child attributes
keystringRequired

The key under platformOptions.

fieldstringRequired

The boolean field under that key; set it to true to label the post.

401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
GET /api/v1/platforms
curl -X GET "https://orbitwrite.com/api/v1/platforms" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY"
Response
{
  "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"
      }
    }
  ]
}

Get one network's posting rules#

GET/api/v1/platforms/{platform}

The rules for one platform, by the id GET /connected-accounts reports (twitter, linkedin_page, instagram, …). Same shape as an entry of GET /platforms.

Authentication

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

Path parameters

platformstringRequired

Responses

200object

The platform's rules

Response attributes
platformobjectRequired
Child attributes
platformstringRequired

The platform id, as list_channels / GET /connected-accounts report it.

namestringRequired
textobjectRequired
Child attributes
maxCharsintegerRequired

Per post, or per thread item.

unitstringRequired

graphemes counts each emoji as one.

  • "chars"
  • "graphemes"
premiumMaxCharsinteger | nullRequired

The ceiling for a premium account (X Premium), when the platform has one.

premiumLabelstring | nullRequired
withMediaMaxCharsinteger | nullRequired

A tighter ceiling when the post carries media (Telegram captions).

commentMaxCharsinteger | nullRequired

The ceiling for an auto-comment, when tighter than a post.

threadsbooleanRequired

Whether a post may be a chain of items. Each item has the text limit; there is no cap on the number of items.

mediaobjectRequired
Child attributes
maxItemsintegerRequired

Attachments per post (per thread item). 0: none.

requiredbooleanRequired

A post without media is refused.

mimeTypesstring[]Required
imageobject | nullRequired

Null: no images.

Child attributes
maxBytesintegerRequired
maxGifBytesinteger | nullRequired
videoobject | nullRequired

Null: no video.

Child attributes
maxBytesintegerRequired
maxDurationSecinteger | nullRequired
minDurationSecnumber | nullRequired
minFrameRatenumber | nullRequired
exclusivebooleanRequired

A video takes the whole post: no other media beside it.

externalGifsbooleanRequired

Accepts a GIF from GIF search.

gifExclusivestring | nullRequired

A GIF takes the whole post. any: every GIF; picked: a GIF from GIF search. Null: GIFs mix with other media.

  • "any"
  • "picked"
  • null
aspectRatioobject | nullRequired

Width ÷ height. Null: unconstrained.

Child attributes
minnumber | nullRequired
maxnumber | nullRequired
preferrednumber | nullRequired
carouselMatchesFirstbooleanRequired

Every carousel slide, video included, is cropped to the first slide's shape.

documentobject | nullRequired

A single document (PDF) in place of media. Null: no documents.

Child attributes
mimeTypesstring[]Required
maxBytesinteger | nullRequired
maxPagesinteger | nullRequired
formatsobject[]Required

The postFormat values this platform offers, default first, with what each narrows. Empty: feed posts only.

Child attributes
formatstringRequired
  • "post"
  • "story"
  • "reel"
  • "short"
maxItemsintegerRequired
requiresVideobooleanRequired
publishesTextbooleanRequired

False: the text is not published (an Instagram story has no caption).

maxVideoBytesinteger | nullRequired
maxVideoDurationSecinteger | nullRequired
maxAspectRationumber | nullRequired
pollsobject | nullRequired

Null: no polls.

Child attributes
minOptionsintegerRequired
maxOptionsintegerRequired
optionMaxCharsintegerRequired
minDurationMinutesintegerRequired
maxDurationMinutesintegerRequired
quotesbooleanRequired

Accepts a quoteUrl.

repliesbooleanRequired

Accepts a replyToUrl: publishing as a reply to an existing post.

linkPreviewsbooleanRequired
replySettingsstring[]Required

Values for replySettings (who may reply). Empty: not settable.

optionsobject | nullRequired

Network-specific settings for platformOptions. Null: none.

Child attributes
keystringRequired

The key under platformOptions.

schemaobjectRequired

JSON Schema of the options object.

aiLabelobject | nullRequired

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

Child attributes
keystringRequired

The key under platformOptions.

fieldstringRequired

The boolean field under that key; set it to true to label the post.

401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
404Error

The resource does not exist

Response attributes
errorstringRequired
issuesany[]
GET /api/v1/platforms/{platform}
curl -X GET "https://orbitwrite.com/api/v1/platforms/{platform}" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY"
Response
{
  "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"
    }
  }
}