# Platform rules

The slide limits, formats, aspect ratios, caption limits and link cards Turboyap enforces on each platform, generated from its source code.

Turboyap's planner enforces these limits before anything is scheduled. Formats other than the accepted ones are converted automatically. Set `fit` on `create_post` to truncate extra slides or pad/crop to a platform's aspect range. Agents get the same data from the `get_platform_rules` MCP tool or `GET /v1/platform-rules`.

- **Early access:** TikTok and Instagram. Early access means it's built and being tested. Each platform opens to early-access users as it approves Turboyap. Instagram needs Meta App Review, and public TikTok posting needs TikTok's audit.
- **Beta:** Bluesky, Telegram and Discord. Beta means early-access users can connect an account and post to it through the API today; it just hasn't been proven with a real production post yet.

| Platform | Post type | Items | Formats | Size | Aspect ratio | Caption | Link card |
|---|---|---|---|---|---|---|---|
| TikTok | image | 1 | JPEG, WebP | ≤ 20 MB, fits 1080×1920 | any | 4,000 chars, title 90 | no |
| TikTok | slideshow | 1–35 | JPEG, WebP | ≤ 20 MB, fits 1080×1920 | any | 4,000 chars, title 90 | no |
| Instagram | image | 1 | JPEG | ≤ 8 MB, 320–1440px wide | 4:5 to 1.91:1 | 2,200 chars, 30 hashtags, 20 mentions | no |
| Instagram | slideshow | 2–10 | JPEG | ≤ 8 MB, 320–1440px wide | 4:5 to 1.91:1 | 2,200 chars, 30 hashtags, 20 mentions | no |
| Bluesky (beta) | text | none (text only) | none | none | none | 300 graphemes, 3,000 bytes | yes, as app.bsky.embed.external (link card) |
| Bluesky (beta) | image | 1 | JPEG, PNG, WebP, GIF | ≤ 1 MB (1,000,000 bytes), fits 2000×2000 | any | 300 graphemes, 3,000 bytes | no |
| Bluesky (beta) | slideshow | 2–4 | JPEG, PNG, WebP, GIF | ≤ 1 MB (1,000,000 bytes), fits 2000×2000 | any | 300 graphemes, 3,000 bytes | no |
| Telegram (beta) | text | none (text only) | none | none | none | 4,096 chars | yes, as link_preview_options.url |
| Telegram (beta) | image | 1 | JPEG, PNG, WebP | ≤ 5 MB (5,000,000 bytes), fits 2560×2560 | 1:20 to 20:1 | 1,024 chars | no |
| Telegram (beta) | slideshow | 2–10 | JPEG, PNG, WebP | ≤ 5 MB (5,000,000 bytes), fits 2560×2560 | 1:20 to 20:1 | 1,024 chars | no |
| Discord (beta) | text | none (text only) | none | none | none | 2,000 chars | yes, as embed (title, url, description) |
| Discord (beta) | image | 1 | JPEG, PNG, WebP, GIF | ≤ 1 MB (1,000,000 bytes), fits 2560×2560 | any | 2,000 chars | yes, as embed (title, url, description) |
| Discord (beta) | slideshow | 2–10 | JPEG, PNG, WebP, GIF | ≤ 1 MB (1,000,000 bytes), fits 2560×2560 | any | 2,000 chars | yes, as embed (title, url, description) |

Text posts (`type: "text"`) take no media: the caption is the post. Caption limits count UTF-16 code units (JavaScript's string length) unless the table says graphemes, which count what a reader sees as one character, so an emoji with a skin tone is one. A byte limit applies on top, to the UTF-8 text. Where a post type has a link card, pass `link` on the post; anywhere else Turboyap ignores it with a warning.

## TikTok

- **inbox mode:** Sends the post to the creator's TikTok inbox to finish in TikTok's editor (add a trending sound, then post). Works before TikTok's app audit.
- **direct mode:** Posts straight to the account. Every direct post waits for a human to approve it and choose the privacy level, whatever the autonomy level. Until Turboyap passes TikTok's audit, direct posts are private (SELF_ONLY).
- Photos are pulled from Turboyap-hosted URLs on a domain verified with TikTok.
- auto_add_music only applies to direct posts; in inbox mode you pick the sound in-app.
- TikTok requires the creator to choose the privacy level by hand on every direct post, with no default, from the options creator_info allows. Comment settings and the commercial content disclosure are chosen the same way.
- Branded content can't be private (SELF_ONLY). Photo posts have no duet or stitch.
- Rate limit: 6 post-init requests per minute per account
- Rate limit: 30 status checks per minute per account

API guides: [TikTok photo post](https://turboyap.com/api/tiktok/photo-post), [TikTok slideshow](https://turboyap.com/api/tiktok/slideshow).

Sources: [TikTok: photo post reference](https://developers.tiktok.com/doc/content-posting-api-reference-photo-post), [TikTok: media transfer guide](https://developers.tiktok.com/doc/content-posting-api-media-transfer-guide), [developers.tiktok.com: content sharing guidelines](https://developers.tiktok.com/doc/content-sharing-guidelines).

## Instagram

- JPEG only; Turboyap converts PNG/WebP automatically.
- Instagram crops every carousel image to the first image's aspect ratio, so Turboyap normalizes all slides to one ratio.
- Vertical 9:16 slides are outside Instagram's 4:5–1.91:1 range: set fit.aspect to "pad" (keeps all content) or "crop".
- Rate limit: 100 API-published posts per account per 24 hours (a carousel counts as one)

API guides: [Instagram image post](https://turboyap.com/api/instagram/image-post), [Instagram carousel](https://turboyap.com/api/instagram/carousel).

Sources: [Meta: content publishing](https://developers.facebook.com/docs/instagram-platform/content-publishing), [Meta: IG User media reference](https://developers.facebook.com/docs/instagram-platform/instagram-graph-api/reference/ig-user/media).

## Bluesky (beta)

**Beta:** you can connect a Bluesky account and post to it through the API in early access today. It hasn't been proven with a real production post yet.

- Connect with your handle and an app password (Bluesky Settings, Privacy and security, App passwords), never your main password. Turboyap stores it encrypted so it can renew the session.
- The 300-character limit counts graphemes: an emoji with a skin tone counts as one.
- Links, @mentions and #hashtags in the text become rich text. A mention that doesn't match a Bluesky account stays plain text.
- Pass `link` on a text post for a link card. Bluesky can't show a link card and images on the same post.
- Images are compressed under 1 MB: Bluesky allows 2 MB now, but self-hosted servers on older versions still enforce 1 MB. Alt text comes from `alt_text`.
- Video isn't supported yet: Turboyap's media pipeline takes images only.
- Each post's record key is derived from the post, so a retry after a lost response can't create a second post.
- Rate limit: 5,000 write points per hour and 35,000 per day per account; a post costs 3
- Rate limit: createSession: 30 per 5 minutes and 300 per day per account

API guides: [Bluesky text post](https://turboyap.com/api/bluesky/text-post), [Bluesky image post](https://turboyap.com/api/bluesky/image-post), [Bluesky multi-image post](https://turboyap.com/api/bluesky/multi-image-post).

Sources: [Bluesky: creating a post](https://bsky.network/docs/bluesky-api/creating-a-post), [Bluesky: post lexicon](https://github.com/bluesky-social/atproto/blob/main/lexicons/app/bsky/feed/post.json), [Bluesky: posts guide](https://docs.bsky.app/docs/advanced-guides/posts), [Bluesky: rate limits](https://docs.bsky.app/docs/advanced-guides/rate-limits), [AT Protocol: record keys (TID)](https://atproto.com/specs/tid).

## Telegram (beta)

**Beta:** you can connect a Telegram account and post to it through the API in early access today. It hasn't been proven with a real production post yet.

- Turboyap posts through its own bot. Add the bot as an administrator of your channel or group with permission to post, then connect the channel's @username or chat ID.
- Text posts take 4,096 characters; captions on photos and albums take 1,024.
- 2 to 10 images post as one album (sendMediaGroup), with the caption on the album.
- Pass `link` on a text post to choose which URL gets the link preview.
- Video and documents aren't supported yet: Turboyap's media pipeline takes images only.
- Rate limit: About 1 message per second in a chat, and 20 per minute in a group
- Rate limit: On a flood-control error Turboyap waits the retry_after Telegram sends

API guides: [Telegram text message](https://turboyap.com/api/telegram/text-message), [Telegram photo post](https://turboyap.com/api/telegram/photo), [Telegram album](https://turboyap.com/api/telegram/album).

Sources: [Telegram Bot API: sendMessage](https://core.telegram.org/bots/api#sendmessage), [Telegram Bot API: sendPhoto](https://core.telegram.org/bots/api#sendphoto), [Telegram Bot API: sendMediaGroup](https://core.telegram.org/bots/api#sendmediagroup), [Telegram Bot API: sending files](https://core.telegram.org/bots/api#sending-files), [Telegram bots FAQ: hitting limits](https://core.telegram.org/bots/faq#my-bot-is-hitting-limits-how-do-i-avoid-this).

## Discord (beta)

**Beta:** you can connect a Discord account and post to it through the API in early access today. It hasn't been proven with a real production post yet.

- Connect on Discord's own screen: you pick the server and channel, and Discord creates a webhook for Turboyap. No bot joins the server.
- Mentions in the text don't notify anyone: Turboyap sends an empty allowed_mentions, so an agent can't ping @everyone.
- Images go as attachments, up to 10 per message, each kept under 1 MB so the message fits Discord's 10 MiB default upload limit.
- Pass `link` to add an embed with its title and description. Discord also previews links in the text on its own.
- Forum channels aren't supported; connect a text or announcement channel.
- Rate limit: Webhook limits are set per webhook and change over time; on a 429 Turboyap waits the retry_after Discord sends

API guides: [Discord message](https://turboyap.com/api/discord/message), [Discord image message](https://turboyap.com/api/discord/image-message), [Discord multi-image message](https://turboyap.com/api/discord/multi-image-message).

Sources: [Discord: execute webhook](https://docs.discord.com/developers/resources/webhook#execute-webhook), [Discord: OAuth2 webhooks](https://docs.discord.com/developers/topics/oauth2#webhooks), [Discord: uploading files](https://docs.discord.com/developers/reference#uploading-files), [Discord: embed limits](https://docs.discord.com/developers/resources/message#embed-object-embed-limits), [Discord: rate limits](https://docs.discord.com/developers/topics/rate-limits).

Coming soon: Facebook, Threads, X, LinkedIn, YouTube and Pinterest. Their API limits are in the [social media API limits tracker](https://turboyap.com/tools/social-api-limits).
