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 or a Bluesky post.

Endpoints

Media limits

Instagram image8 MiB
Decoded, per image. JPEG, PNG, and WebP in; normalized to JPEG.
Instagram carousel2–10 images
Facebook photo4 MiB
Decoded, per photo — lower than Instagram's limit. Meta rejects anything larger.
Facebook multi-photo2–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 photo20 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 thumbnail50 MB
JPEG or PNG; custom thumbnails need a verified channel.
X image5 MB
JPEG, PNG, or WebP, up to 4 per post. The file's bytes must match its content_type.
X GIF15 MB
One per post, alone.
X video512 MB
MP4 as base64 (within the 96 MiB body limit), or MP4 or MOV from a public HTTPS URL. One per post, alone.
Bluesky image20 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 video100 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 body96 MiB
Beyond this the request is rejected with 413 before parsing.
Multipart request4 GiB
Total across all parts.

Errors

Beyond the shared codes in Errors:

unsupported_feature422
You sent scheduled_date, add_to_queue, or async_upload. Scheduling is deferred.
invalid_post_settings422
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_unverified422
TikTok has not verified this deployment's media URL prefix, which every TikTok post needs.
privacy_level_unsupported422
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_limited429
TikTok is throttling the account. Retry later.
page_not_selected409
The Facebook connection exists but no Page has been chosen yet.
missing_permission403
The connection was authorized without a permission this action needs. Reconnect and approve it.
quota_exhausted429
YouTube's daily API quota, shared by every Adeli customer, is used up. The message says when it resets: midnight Pacific.
upload_limit_exceeded422
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_rejected422
YouTube refused the video's metadata, such as an unknown category_id.
x_billing_required402
The workspace has no card on file, which X needs. See X API pricing.
duplicate_post409
X refused the post because the account published the same text recently.
invalid_media422
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_unavailable503
X is unavailable to Adeli for a while. Retry later.
unsupported_media_type415
Content-Type must be application/json or multipart/form-data.