Quickstart
Upload a video, schedule it to two accounts, then dub it into Spanish and publish each version to the right account. Each step shows the API call and the CLI equivalent.
You need an API key (see Authentication) and at least one account connected in the app. The examples assume the key is in FIFTYEIGHT_API_KEY.
1. Find your account ids
curl https://api.72-62-237-85.sslip.io/v1/accounts -H "Authorization: Bearer $FIFTYEIGHT_API_KEY"fiftyeight accounts listEach account has an id, a platform and a locale: the language it publishes in. Only connected accounts can receive posts.
2. Upload the video
Ask for an upload slot, then PUT the file bytes to upload_url with the same Content-Type, within one hour. Keep the media_id.
curl -X POST https://api.72-62-237-85.sslip.io/v1/media/uploads \
-H "Authorization: Bearer $FIFTYEIGHT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"filename": "launch.mp4", "content_type": "video/mp4"}'
# → {"media_id": "…", "upload_url": "https://…", "public_url": "https://…"}
curl -X PUT "$UPLOAD_URL" -H "Content-Type: video/mp4" --data-binary @launch.mp4fiftyeight media upload launch.mp4Already hosted somewhere public? Skip the upload and pass {"url": "https://…", "type": "video"} in the post's media instead.
3. Schedule it to two accounts
A post targets one or more accounts and uses exactly one of publish_now, scheduled_for or draft. A time without an offset is read in timezone. Send an Idempotency-Key so a retry after a network error never posts twice.
curl -X POST https://api.72-62-237-85.sslip.io/v1/posts \
-H "Authorization: Bearer $FIFTYEIGHT_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: launch-2026-12-01" \
-d '{
"content": "New drop. Link in bio.",
"media": [{"media_id": "MEDIA_ID"}],
"targets": [
{"account_id": "INSTAGRAM_ACCOUNT_ID"},
{"account_id": "TIKTOK_ACCOUNT_ID", "tiktok": {"consent": true}}
],
"scheduled_for": "2026-12-01T18:00",
"timezone": "Europe/Paris"
}'fiftyeight posts create -m MEDIA_ID -a INSTAGRAM_ACCOUNT_ID -a TIKTOK_ACCOUNT_ID \
--caption "New drop. Link in bio." --schedule 2026-12-01T18:00 --timezone Europe/Paris \
--tiktok-consent --idempotency-key launch-2026-12-01tiktok.consent: true on every TikTok target: it confirms the creator reviewed the video and agrees to publish it. Only set it after they did.Check where it stands. refresh=true asks the platforms for the latest status and post URLs:
curl "https://api.72-62-237-85.sslip.io/v1/posts/POST_ID?refresh=true" -H "Authorization: Bearer $FIFTYEIGHT_API_KEY"fiftyeight posts get POST_ID --refresh4. Dub it into Spanish
First tell Fifty Eight which language each account publishes in. Here, a Spanish Instagram account:
curl -X PATCH https://api.72-62-237-85.sslip.io/v1/accounts/SPANISH_ACCOUNT_ID \
-H "Authorization: Bearer $FIFTYEIGHT_API_KEY" -H "Content-Type: application/json" \
-d '{"locale": "es"}'fiftyeight accounts set SPANISH_ACCOUNT_ID --language esStart the dub. It runs in the background for a few minutes and uses credits: 1 per second of video, per language (check first with GET /v1/credits/estimate?seconds=45&languages=1). Subtitles are burned into each version unless you pass "subtitles": false. Pick their look with subtitle_style: a preset (pop, bold_box, karaoke, clean, minimal, classic) plus optional font, highlight, text_color, position, size and uppercase. Subtitles are timed word by word. To change the look of a ready dub without dubbing again (no credits used), call POST /v1/localizations/ID/subtitles. For face-to-camera videos, add "lipsync": true to also re-time the mouth to each voice (+1.5 credits per second of video, per language; see what costs credits).
curl -X POST https://api.72-62-237-85.sslip.io/v1/localizations \
-H "Authorization: Bearer $FIFTYEIGHT_API_KEY" -H "Content-Type: application/json" \
-d '{"media_id": "MEDIA_ID", "languages": ["es"], "caption": "New drop. Link in bio.",
"subtitle_style": {"preset": "pop", "highlight": "yellow"}}'
# Poll until "status" is "ready" (or "failed")
curl https://api.72-62-237-85.sslip.io/v1/localizations/LOCALIZATION_ID -H "Authorization: Bearer $FIFTYEIGHT_API_KEY"fiftyeight dub create MEDIA_ID -l es --caption "New drop. Link in bio." --style pop --highlight yellow --wait5. Publish each language to its accounts
Each connected account receives the version in its language. Accounts in the source language, or with no language set, receive the original unless you pass "include_original": false.
curl -X POST https://api.72-62-237-85.sslip.io/v1/localizations/LOCALIZATION_ID/publish \
-H "Authorization: Bearer $FIFTYEIGHT_API_KEY" -H "Content-Type: application/json" \
-d '{"publish_now": true}'fiftyeight dub publish LOCALIZATION_ID --nowYou get one post per language (and per brand). Follow them like any other post with GET /v1/posts/….
6. Or do it all in one call
POST /v1/posts/dubbed publishes the original and dubs it in one go. Each language version goes to its accounts on its own as soon as it is ready (or at your post's time if it is ready by then). Link accounts that are language versions of each other with POST /v1/account-groups (or Accounts › Language versions) and GET /v1/accounts/dub-targets picks the right accounts for you.
curl -X POST https://api.72-62-237-85.sslip.io/v1/posts/dubbed \
-H "Authorization: Bearer $FIFTYEIGHT_API_KEY" -H "Content-Type: application/json" \
-d '{"post": {"content": "New drop. Link in bio.", "media": [{"media_id": "MEDIA_ID"}],
"targets": [{"account_id": "FRENCH_ACCOUNT_ID"}], "publish_now": true},
"dub": {"media_id": "MEDIA_ID", "source_language": "fr", "languages": ["en", "es"],
"targets": {"en": ["ENGLISH_ACCOUNT_ID"], "es": ["SPANISH_ACCOUNT_ID"]}}}'