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
curl https://api.72-62-237-85.sslip.io/v1/accounts -H "Authorization: Bearer $FIFTYEIGHT_API_KEY"
CLI
fiftyeight accounts list

Each 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
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.mp4
CLI (both steps)
fiftyeight media upload launch.mp4

Already 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
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"
  }'
CLI
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-01
TikTok requires tiktok.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
curl "https://api.72-62-237-85.sslip.io/v1/posts/POST_ID?refresh=true" -H "Authorization: Bearer $FIFTYEIGHT_API_KEY"
CLI
fiftyeight posts get POST_ID --refresh

4. Dub it into Spanish

First tell Fifty Eight which language each account publishes in. Here, a Spanish Instagram account:

curl
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"}'
CLI
fiftyeight accounts set SPANISH_ACCOUNT_ID --language es

Start 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
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"
CLI (waits until done)
fiftyeight dub create MEDIA_ID -l es --caption "New drop. Link in bio." --style pop --highlight yellow --wait

5. 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
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}'
CLI
fiftyeight dub publish LOCALIZATION_ID --now

You 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
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"]}}}'