CLI

The fiftyeight command wraps the REST API for terminals, scripts and CI. Same key, same rules.

Install

Needs Python 3.11 or later. From a clone of the Fifty Eight repository, with uv or pipx:

Install
uv tool install ./apps/cli      # or: pipx install ./apps/cli
fiftyeight --version

Sign in

Save your key
fiftyeight auth login   # paste the key from API & MCP; it is checked, then saved
fiftyeight auth status

The key is saved in ~/.config/fiftyeight/config.json, readable only by you. In CI or scripts, set FIFTYEIGHT_API_KEY instead: it takes precedence over the saved key, and --api-key over both. FIFTYEIGHT_API_URL or --api-url points the CLI at another API.

Examples

Schedule a local video to two accounts
fiftyeight posts create -f launch.mp4 -a ACCOUNT_1 -a ACCOUNT_2 \
  --caption-file caption.txt --schedule 2026-12-01T18:00 --timezone Europe/Paris
Dub, wait, publish each language
fiftyeight dub create -f launch.mp4 -l es -l ja --caption "New drop" --wait
fiftyeight dub publish LOCALIZATION_ID --now
Script with JSON output
POST_ID=$(fiftyeight --json posts create -m MEDIA_ID -a ACCOUNT_ID --draft | jq -r .id)
fiftyeight --json posts get "$POST_ID" | jq .status

Output and errors

  • Commands print a short, readable summary. Add --json right after fiftyeight to get the raw API response instead.
  • Errors print the API's message with its status, for example Error: 409 Cannot cancel a post that is published, and exit with status 1. A usage mistake (missing option, no key) exits with 2.

Commands

Run fiftyeight COMMAND --help for every option.

auth

CommandWhat it does
fiftyeight auth login [--key KEY] [--api-url URL]Checks the key against the API, then saves it (prompts for it if --key is omitted).
fiftyeight auth statusShows the API URL, where the key comes from, and the workspace mode.
fiftyeight auth logoutRemoves the saved key.

accounts and brands

CommandWhat it does
fiftyeight accounts list [--brand ID]Id, platform, publishing language and status of each account.
fiftyeight accounts connect PLATFORM [--brand ID]Prints a link the account owner opens to connect instagram, tiktok, youtube, facebook, linkedin, twitter, threads, pinterest or bluesky.
fiftyeight accounts sync [--brand ID]Refreshes accounts after connecting one.
fiftyeight accounts set ID [--language es] [--timezone Europe/Paris] [--optimize|--no-optimize]Publishing language (decides which dubbed version it receives), audience timezone, best-time optimizer.
fiftyeight accounts link NAME ID ID [ID…]Links accounts as language versions (e.g. @atlas FR and @atlas.en EN): dubbed versions go to the linked account of each language.
fiftyeight accounts groupsLists linked language versions.
fiftyeight accounts suggestShows unlinked accounts that look like language versions of each other.
fiftyeight accounts unlink GROUP [--account ID]Unlinks one account, or the whole group.
fiftyeight accounts remove ID [--yes]Removes an account from the workspace. Accounts Fifty Eight connected are disconnected; shared ones are only hidden. --yes confirms cancelling its scheduled posts.
fiftyeight accounts restore IDShows a hidden (shared) account again.
fiftyeight brands listLists brands.
fiftyeight brands create NAME [--locale fr]Creates a brand.

media

CommandWhat it does
fiftyeight media upload FILEUploads a video or image (type from the file extension) and prints its media id.

posts

CommandWhat it does
fiftyeight posts create -a ACCOUNT [-a ACCOUNT…] (--now | --schedule TIME | --draft) [options]Publishes, schedules or saves a draft.
fiftyeight posts list [--status scheduled] [--platform instagram] [--source zernio] [--from 2026-12-01] [--to 2026-12-31] [--oldest-first] [--limit 50] [--offset 0]Posts and their status per account, including posts made in other tools on your accounts (--source zernio). --status can be repeated.
fiftyeight posts edit ID [--caption TEXT | --caption-file F] [--schedule 2026-12-01T18:00 --timezone Europe/Paris] [--draft | --schedule-it] [--fixed-time | --movable]Edits a draft, scheduled, failed or cancelled post. Only what you pass changes.
fiftyeight posts publish IDPublishes a draft or scheduled post right away.
fiftyeight posts duplicate ID [--tiktok-consent]Copies a post into a new draft.
fiftyeight posts syncImports the latest posts made in other tools on your accounts.
fiftyeight posts get ID [--refresh]One post; --refresh asks the platforms for the latest status.
fiftyeight posts cancel IDCancels a draft or scheduled post.
fiftyeight posts retry IDRetries only the accounts that failed.
Options for posts create
-a, --account IDTarget account. Repeat for several.
-c, --caption TEXT / --caption-file FILECaption, inline or from a file.
-f, --file PATHUpload a local file first. Repeatable (carousels).
-m, --media IDMedia id from `media upload`. Repeatable.
--url URL [--url-type image]Public https media instead of an upload.
--schedule 2026-12-01T18:00 [--timezone Europe/Paris]Local time in that zone, or include an offset.
--tiktok-consent [--tiktok-privacy SELF_ONLY]Required for TikTok targets.
--youtube-title TEXTTitle for YouTube targets.
--fixed-timeThe best-time optimizer never moves this post.
--idempotency-key KEYRetry safely: the same key never creates two posts.

dub

CommandWhat it does
fiftyeight dub create (MEDIA_ID | -f FILE) -l LANG [-l LANG…] [options]Dubs a video into other languages in the speaker's voice.
fiftyeight dub listRecent dubs.
fiftyeight dub lipsync ID [-l LANG…] [--wait]Lip-syncs a ready dub (all languages by default): +1.5 credits per second of video, per language, refunded if it fails.
fiftyeight dub get ID [--wait]Status, video link and caption of each language.
fiftyeight dub restyle ID --style karaoke [--font …] [--wait]Re-renders a ready dub's subtitles with another style. Uses no credits.
fiftyeight dub caption ID LANG TEXTEdits one language's caption before publishing.
fiftyeight dub publish ID (--now | --schedule TIME | --draft) [options]Sends each language to the accounts that publish in it.
Options for dub create
-l, --lang esLanguage to dub into (BCP-47). Repeat for several, up to 10.
--source-language frSpoken language. Detected when omitted.
-c, --caption TEXT / --caption-file FILECaption translated for each language.
--no-subtitlesDon't burn subtitles into the videos.
--style pop|bold_box|karaoke|clean|minimal|classicLook of the subtitles (default: the workspace's last style, else pop).
--font, --highlight, --text-color, --position, --size, --uppercaseFine-tune the style: fonts poppins, montserrat, anton, bebas, archivo, rounded, noto; colours indigo, brand, yellow, green, red, pink, white, black; position bottom, middle, top; size s, m, l.
--lipsyncAlso lip-sync each language once dubbed (+1.5 credits per second of video, per language).
--wait [--timeout 1800]Wait until every language is done, showing progress.
Options for dub publish
-a, --account IDOnly these accounts. Repeatable.
--no-originalDon't post the original to source-language accounts.
--tiktok-consentRequired when TikTok accounts receive a version.
--youtube-title TEXTTitle for YouTube accounts.
--idempotency-key KEYRetry safely.

clips

CommandWhat it does
fiftyeight clips create MEDIA_ID -r 12-45 [-r 60-90…] [--vertical]Cuts clips (seconds, each at most 180 s); --vertical reframes to 9:16.
fiftyeight clips list [--media MEDIA_ID]Clips and their media ids once ready.

automations

CommandWhat it does
fiftyeight automations create --account ID --name "Free guide" -k guide --dm "Hey {{first_name}}!" --button "Get it=https://example.com"Answers comments containing the keyword with a DM and a link button. Add --reply for a public reply (repeat it up to 3 times: one is picked at random for each comment), --post ID for one post, --trigger story|live.
fiftyeight automations listYour automations with replies sent and skipped, then the imported ones.
fiftyeight automations update ID --reply "Sent you a DM!" --reply "Check your DMs, {{first_name}}"Changes the texts or keywords: --name, -k, --dm, --reply (replaces the current replies, up to 3), --no-reply.
fiftyeight automations disable IDPauses an automation (yours or an imported one). enable turns it back on, delete removes it.
fiftyeight automations usageReplies used this month against your quota and per-video limit.

credits and timing

CommandWhat it does
fiftyeight creditsCredits left, what your plan adds each month, what everything costs, automatic top-up and this month's budget.
fiftyeight credits estimate 45 -l 2 [--lipsync]What a dub will cost before starting it ("This dub: 90 credits").
fiftyeight credits history [-n 25]Credit movements, newest first, with the balance after each.
fiftyeight credits topupPoints you to Plan & credits in the dashboard: buying credits, plans and automatic top-up are done there by an owner or admin, never with an API key.
fiftyeight timingBest posting times learned per account.
The CLI only calls the public API: anything it does, your own code can do with the same requests. See the API reference.