# Posts

> List Instagram, Facebook, TikTok, YouTube, X, and Bluesky posts, and publish to all six.

Canonical: <https://www.tryadeli.com/docs/api/posts>

One endpoint publishes to every provider, but they behave differently enough to
be worth reading separately. Instagram publishes synchronously and returns
`201`, and so do X and Bluesky. TikTok and YouTube publish asynchronously and return `202` with an id you
poll.
Facebook does **both**, decided by the media: a photo or multi-photo post
returns `201` with the finished post, while a Reel or feed video returns `202`.

Editing and deleting posts are deliberately not part of the public API in v1,
except deleting an [X post](https://www.tryadeli.com/docs/api/posts/delete-x-post) or a
[Bluesky post](https://www.tryadeli.com/docs/api/posts/delete-bluesky-post).

## Endpoints

- `GET /api/v1/posts` — [List posts](https://www.tryadeli.com/docs/api/posts/list-posts.md)
- `POST /api/v1/posts` — [Publish to Instagram](https://www.tryadeli.com/docs/api/posts/publish-instagram.md)
- `POST /api/v1/posts` — [Publish to Facebook](https://www.tryadeli.com/docs/api/posts/publish-facebook.md)
- `GET /api/v1/posts/facebook/status` — [Facebook video status](https://www.tryadeli.com/docs/api/posts/get-facebook-video-status.md)
- `GET /api/v1/posts/tiktok/creator-info` — [TikTok creator info](https://www.tryadeli.com/docs/api/posts/get-tiktok-creator-info.md)
- `POST /api/v1/posts` — [Publish to TikTok](https://www.tryadeli.com/docs/api/posts/publish-tiktok.md)
- `GET /api/v1/posts/tiktok/status` — [TikTok publish status](https://www.tryadeli.com/docs/api/posts/get-tiktok-publish-status.md)
- `POST /api/v1/posts` — [Publish to YouTube](https://www.tryadeli.com/docs/api/posts/publish-youtube.md)
- `POST /api/v1/posts/youtube` — [Upload YouTube file](https://www.tryadeli.com/docs/api/posts/upload-youtube-video-file.md)
- `GET /api/v1/posts/youtube/status` — [YouTube upload status](https://www.tryadeli.com/docs/api/posts/get-youtube-upload-status.md)
- `POST /api/v1/posts` — [Publish to X](https://www.tryadeli.com/docs/api/posts/publish-x.md)
- `DELETE /api/v1/posts/x/{postId}` — [Delete X post](https://www.tryadeli.com/docs/api/posts/delete-x-post.md)
- `POST /api/v1/posts` — [Publish to Bluesky](https://www.tryadeli.com/docs/api/posts/publish-bluesky.md)
- `DELETE /api/v1/posts/bluesky/{postId}` — [Delete Bluesky post](https://www.tryadeli.com/docs/api/posts/delete-bluesky-post.md)

## Media limits

| Name                              | Type                    | Required | Description                                                                                                                                                                         |
| --------------------------------- | ----------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Instagram image`                 | `8 MiB`                 |          | Decoded, per image. JPEG, PNG, and WebP in; normalized to JPEG.                                                                                                                     |
| `Instagram carousel`              | `2–10 images`           |          |                                                                                                                                                                                     |
| `Facebook photo`                  | `4 MiB`                 |          | Decoded, per photo — lower than Instagram's limit. Meta rejects anything larger.                                                                                                    |
| `Facebook multi-photo`            | `2–10 photos`           |          |                                                                                                                                                                                     |
| `Facebook video (JSON)`           | `64 MiB`                |          | Decoded from base64, MP4 only. Use multipart for MOV or WebM.                                                                                                                       |
| `TikTok video (JSON)`             | `64 MiB`                |          | Decoded from base64, MP4 only.                                                                                                                                                      |
| `TikTok video (multipart or URL)` | `1 GB`                  |          | MP4, MOV, or WebM; 3 seconds up to the creator's maximum duration. Remote URLs must be public HTTPS, and are fetched with private-network, redirect, timeout, and size protections. |
| `TikTok photo`                    | `20 MB`                 |          | Per photo, 1–35 per post, normalized to JPEG at 1080×1920. Remote photo URLs are not accepted.                                                                                      |
| `YouTube video (URL)`             | `1 GB`                  |          | MP4, MOV, or WebM from a public HTTPS URL.                                                                                                                                          |
| `YouTube video (multipart)`       | `4 GiB`                 |          | MP4, MOV, or WebM, sent to `POST /api/v1/posts/youtube`.                                                                                                                            |
| `YouTube thumbnail`               | `50 MB`                 |          | JPEG or PNG; custom thumbnails need a verified channel.                                                                                                                             |
| `X image`                         | `5 MB`                  |          | JPEG, PNG, or WebP, up to 4 per post. The file's bytes must match its content\_type.                                                                                                |
| `X GIF`                           | `15 MB`                 |          | One per post, alone.                                                                                                                                                                |
| `X video`                         | `512 MB`                |          | MP4 as base64 (within the 96 MiB body limit), or MP4 or MOV from a public HTTPS URL. One per post, alone.                                                                           |
| `Bluesky image`                   | `20 MB in, 2 MB posted` |          | JPEG, PNG, or WebP, up to 4 per post. Larger than 2 MB is resized to JPEG; a resized PNG loses transparency.                                                                        |
| `Bluesky video`                   | `100 MB`                |          | MP4 as base64 or from a public HTTPS URL. One per post, alone. Bluesky's own length and daily limits apply, read from Bluesky at upload time.                                       |
| `JSON request body`               | `96 MiB`                |          | Beyond this the request is rejected with 413 before parsing.                                                                                                                        |
| `Multipart request`               | `4 GiB`                 |          | Total across all parts.                                                                                                                                                             |

## Errors

Beyond the shared codes in [Errors](https://www.tryadeli.com/docs/errors):

| Name                        | Type  | Required | Description                                                                                                                                                                                                                     |
| --------------------------- | ----- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `unsupported_feature`       | `422` |          | You sent `scheduled_date`, `add_to_queue`, or `async_upload`. Scheduling is deferred.                                                                                                                                           |
| `invalid_post_settings`     | `422` |          | The privacy, comment, duet, or stitch setting is not available to this creator right now, or branded content was requested without public visibility. Re-query creator info.                                                    |
| `media_url_unverified`      | `422` |          | TikTok has not verified this deployment's media URL prefix, which every TikTok post needs.                                                                                                                                      |
| `privacy_level_unsupported` | `422` |          | A TikTok video asked for a privacy level other than PUBLIC\_TO\_EVERYONE. Publish it publicly, or send it as a MEDIA\_UPLOAD draft.                                                                                             |
| `rate_limited`              | `429` |          | TikTok is throttling the account. Retry later.                                                                                                                                                                                  |
| `page_not_selected`         | `409` |          | The Facebook connection exists but no Page has been chosen yet.                                                                                                                                                                 |
| `missing_permission`        | `403` |          | The connection was authorized without a permission this action needs. Reconnect and approve it.                                                                                                                                 |
| `quota_exhausted`           | `429` |          | YouTube's daily API quota, shared by every Adeli customer, is used up. The message says when it resets: midnight Pacific.                                                                                                       |
| `upload_limit_exceeded`     | `422` |          | The YouTube channel has reached YouTube's own upload limit, or the Bluesky account has reached its daily video limit or has not verified its email. Try again later.                                                            |
| `provider_rejected`         | `422` |          | YouTube refused the video's metadata, such as an unknown category\_id.                                                                                                                                                          |
| `x_billing_required`        | `402` |          | The workspace has no card on file, which X needs. See [X API pricing](https://www.tryadeli.com/docs/pricing/x).                                                                                                                 |
| `duplicate_post`            | `409` |          | X refused the post because the account published the same text recently.                                                                                                                                                        |
| `invalid_media`             | `422` |          | A Bluesky image is not valid base64, is not a JPEG, PNG, or WebP, or cannot be resized under 2 MB. Or an X media item is not valid base64, does not match its content\_type, is over its size limit, or X could not process it. |
| `temporarily_unavailable`   | `503` |          | X is unavailable to Adeli for a while. Retry later.                                                                                                                                                                             |
| `unsupported_media_type`    | `415` |          | Content-Type must be `application/json` or `multipart/form-data`.                                                                                                                                                               |
