API reference
Every public endpoint, generated from the API's own code. JSON in, JSON out.
Basics
- Base URL:
https://api.72-62-237-85.sslip.io. Every path starts with/v1. - Authentication:
Authorization: Bearer fe_live_…(see Authentication). - Request bodies are JSON (
Content-Type: application/json). Ids are UUIDs. Times are ISO 8601; responses are in UTC. - Some lists take a
limit; posts can also be filtered bystatusand time range. There is no cursor pagination yet. - Dubbing and clips run in the background: create, then poll the
GETendpoint until the status isreadyorfailed. - Rate limits: no request quota today. A workspace can have at most 40 clips processing at once (
429beyond that). Please poll background jobs every 10 seconds or more. - Interactive explorer generated from the same code: https://api.72-62-237-85.sslip.io/docs.
Accounts
Workspace settings, connected social accounts and brands.
GET/v1/accounts
List Accounts
Accounts of this workspace. `include_removed=true` also lists the ones removed from it (to restore them).
API keys: allowed. Signed-in users: any member.
Parameters
brand_iduuid | nullQuery string.
include_removedbooleandefault falseQuery string.
Response 200: AccountOut[]
POST/v1/accounts/connect
Connect Account
Returns an authorization URL. Open it in the browser of the account owner.
API keys: allowed. Signed-in users: owner, admin.
Request body: ConnectRequest
Response 200: ConnectOut
Errors
402Over the plan's accounts: confirm an extra account in the dashboard (Plan & credits) or upgrade.402No active plan: choose a plan first (credits only add to a plan)403Free early access is limited to its included accounts.
GET/v1/accounts/dub-targets
Dub Targets
Which accounts get each language version: linked accounts first, else every account in that language.
API keys: allowed. Signed-in users: any member.
Parameters
sourceuuid[]default []Query string. Accounts the original post goes to
languagesstring[]default []Query string. Languages to dub into
Response 200: map<string, string[]>
POST/v1/accounts/sync
Sync Accounts
API keys: allowed. Signed-in users: any member.
Parameters
brand_iduuid | nullQuery string.
Response 200: AccountOut[]
PATCH/v1/accounts/{account_id}
Update Account
API keys: allowed. Signed-in users: any member.
Parameters
account_iduuidrequiredIn the path.
Request body: AccountUpdate
Response 200: AccountOut
Errors
404Account not found422Unknown timezone
DELETE/v1/accounts/{account_id}
Remove Account
Remove an account from this workspace. Accounts Fifty Eight connected are disconnected and no longer billed (their scheduled posts that only go to this account are cancelled: pass cancel_scheduled=true to confirm). Accounts shared with other tools are only hidden here and stay connected.
API keys: allowed. Signed-in users: any member.
Parameters
account_iduuidrequiredIn the path.
cancel_scheduledbooleandefault falseQuery string.
Response 200: AccountRemoved
GET/v1/accounts/{account_id}/pinterest-boards
Pinterest Boards
The boards of a Pinterest account, to pick where a pin goes (`pinterest.board_id` on a post target).
API keys: allowed. Signed-in users: any member.
Parameters
account_iduuidrequiredIn the path.
Response 200: PinterestBoardOut[]
GET/v1/accounts/{account_id}/removal
Removal Preview
What removing this account would do, before doing it.
API keys: allowed. Signed-in users: any member.
Parameters
account_iduuidrequiredIn the path.
Response 200: AccountRemovalPreview
POST/v1/accounts/{account_id}/restore
Restore Account
Show a hidden (shared) account again.
API keys: allowed. Signed-in users: any member.
Parameters
account_iduuidrequiredIn the path.
Response 200: AccountOut
GET/v1/brands
List Brands
API keys: allowed. Signed-in users: any member.
Response 200: BrandOut[]
POST/v1/brands
Create Brand
API keys: allowed. Signed-in users: owner, admin.
Request body: BrandCreate
Response 201: BrandOut
GET/v1/workspace
Get Workspace
The current workspace, its settings and the caller's role in it.
API keys: allowed. Signed-in users: any member.
Response 200: WorkspaceOut
PATCH/v1/workspace
Update Workspace
Change workspace settings (owner or admin). `dubbing_enabled: false` keeps the workspace to publishing and scheduling: dubbing requests are refused with 409 and the console hides dubbing.
API keys: allowed. Signed-in users: owner, admin.
Request body: WorkspaceUpdate
Response 200: OrgOut
Errors
403Only owners and admins change workspace settings
Media
Upload videos and images before you post or dub them.
POST/v1/media/uploads
Create Upload
Step 1: get an upload URL. Step 2: PUT the file to `upload_url`. Step 3: use `media_id` in a post.
API keys: allowed. Signed-in users: any member.
Request body: UploadRequest
Response 201: UploadOut
Posts
Publish now, schedule or save drafts to one or more accounts.
GET/v1/posts
List Posts
Every post of the workspace, including posts made in other tools on its accounts. The total matching count is returned in the `X-Total-Count` header, for paging with `offset`.
API keys: allowed. Signed-in users: any member.
Parameters
statusPostStatus[] | nullQuery string. One or more statuses (repeat the parameter).
startdatetime | nullQuery string. Post moment >= start (scheduled, else published, else created)
enddatetime | nullQuery string. Post moment < end
account_iduuid | nullQuery string.
platformstring | nullQuery string.
sourcestring | nullQuery string. fifty_eight: made in Fifty Eight. zernio: imported (made in another tool).
orderstringdefault "desc"Query string. asc/desc by moment, or created: newest first
limitintegerdefault 50Query string.
offsetintegerdefault 0Query string.
qstring | nullQuery string. Search in the caption
Response 200: PostOut[]
POST/v1/posts
Create Post
Publish now, schedule, or save a draft to one or more connected accounts. Send an `Idempotency-Key` header to safely retry: the same key never creates two posts. Keys starting with `zernio:` are reserved.
API keys: allowed. Signed-in users: any member. Accepts an Idempotency-Key header.
Idempotency-Key header (optional, up to 128 characters): the same key never creates two posts, so you can retry safely.
Request body: PostCreate
Response 201: PostOut
Errors
402No active plan: choose a plan first (credits only add to a plan)422Choose exactly one of publish_now, scheduled_for or draft422scheduled_for must be in the future, or has no UTC offset and no timezone422An account is disconnected, needs media, or rejects this media or caption length422TikTok requires tiktok.consent=true422All targeted accounts must belong to the same brand422Idempotency keys starting with 'zernio:' are reserved
POST/v1/posts/dubbed
Create Dubbed Post
Publish a video in its language and dub it into others: each language version goes to its own accounts as soon as it is ready (or at the post's time if ready by then). Drafts make the dubs without publishing them.
API keys: allowed. Signed-in users: any member.
Request body: DubbedPostCreate
Response 201: DubbedPostOut
POST/v1/posts/sync
Sync Posts
Import posts made in other tools on the workspace's accounts. Throttled per brand (about once a minute); `force` (owners and admins) shortens that to a few seconds. Runs on its own in the background too.
API keys: allowed. Signed-in users: any member.
Parameters
forcebooleandefault falseQuery string.
Response 200: PostSyncOut
Errors
403force is for owners and admins
GET/v1/posts/{post_id}
Get Post
API keys: allowed. Signed-in users: any member.
Parameters
post_iduuidrequiredIn the path.
refreshbooleandefault falseQuery string.
Response 200: PostOut
Errors
404Post not found
PATCH/v1/posts/{post_id}
Update Post
Edit a draft, scheduled, failed or cancelled post: caption (and per-account captions), media, accounts, time. Imported posts can be edited by owners and admins.
API keys: allowed. Signed-in users: any member.
Parameters
post_iduuidrequiredIn the path.
Request body: PostUpdate
Response 200: PostOut
Errors
403Imported posts can be edited by owners and admins only404Post, account or media not found409Published or publishing posts can't be edited409Draft/schedule switch on a post that also goes to accounts outside this workspace422A time in the past, a disconnected account, media or caption rejected by a platform422Adding a TikTok account requires tiktok_consent=true
POST/v1/posts/{post_id}/cancel
Cancel Post
API keys: allowed. Signed-in users: any member.
Parameters
post_iduuidrequiredIn the path.
Response 200: PostOut
Errors
403Imported posts can be cancelled by owners and admins only409Only draft or scheduled posts can be cancelled409The post also goes to accounts outside this workspace
POST/v1/posts/{post_id}/duplicate
Duplicate Post
Copy a post (text, media, connected accounts) into a new draft.
API keys: allowed. Signed-in users: any member.
Parameters
post_iduuidrequiredIn the path.
Request body: PostDuplicate | null
Response 201: PostOut
Errors
404Post not found422None of the post's accounts is connected, or TikTok needs tiktok_consent=true
POST/v1/posts/{post_id}/publish
Publish Post Now
Publish a draft or scheduled post right away.
API keys: allowed. Signed-in users: any member.
Parameters
post_iduuidrequiredIn the path.
Response 200: PostOut
Errors
403Imported posts can be published by owners and admins only409Only draft, scheduled or cancelled posts can be published now409The post also goes to accounts outside this workspace422An account is disconnected or rejects this media or caption
POST/v1/posts/{post_id}/retry
Retry Post
Retries only the platforms that failed.
API keys: allowed. Signed-in users: any member.
Parameters
post_iduuidrequiredIn the path.
Response 200: PostOut
Errors
403Imported posts can be retried by owners and admins only409Only failed or partially published posts can be retried
Dubbing
Dub a video into other languages and publish each version to the right accounts.
GET/v1/localizations
List Localizations
API keys: allowed. Signed-in users: any member.
Parameters
limitintegerdefault 50Query string.
Response 200: LocalizationOut[]
POST/v1/localizations
Create Localization
Dub a video into several languages. Runs in the background: poll GET /v1/localizations/{id}.
API keys: allowed. Signed-in users: any member.
Request body: LocalizationCreate
Response 201: LocalizationOut
Errors
402No active plan: choose a plan first (credits only add to a plan)402Not enough credits (the message says how many are needed, and whether an automatic top-up started)404Media not found409Dubbing is turned off for this workspace (PATCH /v1/workspace to turn it on)422Only videos can be dubbed; at most 16 languages; pick a language other than the source
GET/v1/localizations/{job_id}
Get Localization
API keys: allowed. Signed-in users: any member.
Parameters
job_iduuidrequiredIn the path.
Response 200: LocalizationOut
Errors
404Localization not found
POST/v1/localizations/{job_id}/lipsync
Lipsync Localization
Lip-sync ready languages of a dub (never included in a plan): +1.5 credits per second of video, per language (rounded up), taken now and refunded if it fails. The dubbed version stays available; poll the dub for the result.
API keys: allowed. Signed-in users: any member.
Parameters
job_iduuidrequiredIn the path.
Request body: LipsyncIn
Response 200: LocalizationOut
POST/v1/localizations/{job_id}/publish
Publish Localization
Publish each language version to the accounts whose publishing language matches.
API keys: allowed. Signed-in users: any member.
Parameters
job_iduuidrequiredIn the path.
Request body: LocalizationPublish
Response 201: PostOut[]
Errors
422No language is ready yet422No connected account matches these languages: set each account's publishing language
POST/v1/localizations/{job_id}/subtitles
Restyle Localization
Re-render the burned subtitles of a ready dub with another style. Uses no credits; poll the dub until it's ready again.
API keys: allowed. Signed-in users: any member.
Parameters
job_iduuidrequiredIn the path.
Request body: SubtitleRestyle
Response 200: LocalizationOut
Errors
404Localization not found409The dub isn't ready yet, or no language is ready422Unknown preset, font, colour, position or size
PATCH/v1/localizations/{job_id}/variants/{language}
Update Caption
API keys: allowed. Signed-in users: any member.
Parameters
job_iduuidrequiredIn the path.
languagestringrequiredIn the path.
Request body: VariantCaptionUpdate
Response 200: LocalizationOut
Errors
404Localization or language not found
Clips
Cut extracts from a long video.
GET/v1/clips
List Clips
API keys: allowed. Signed-in users: any member.
Parameters
media_iduuid | nullQuery string.
limitintegerdefault 100Query string.
Response 200: ClipOut[]
POST/v1/clips
Create Clips
Cut extracts from an uploaded video. Processed in the background: poll GET /v1/clips.
API keys: allowed. Signed-in users: any member.
Request body: ClipsCreate
Response 201: ClipOut[]
Errors
404Media not found422Only videos can be clipped; each clip is at most 180 s429Too many clips in progress
Best times
What the best-time optimizer learned per account.
GET/v1/timing
Get Timing
What the best-time optimizer has learned per account, and its latest reschedules.
API keys: allowed. Signed-in users: any member.
Response 200: TimingInsights
Automations
Comment-to-DM automations: keyword comments answered by DM or public reply.
GET/v1/automations
List Automations
Comment-to-DM automations of the workspace, with their totals.
API keys: allowed. Signed-in users: any member.
Response 200: AutomationOut[]
POST/v1/automations
Create Automation
Reply to keyword comments with a DM (Instagram, Facebook) and/or a public reply. One reply per commenter. Write up to 3 public replies in `public_replies`: one is picked at random for each comment. Optional conversation steps before the DM with the link (Instagram, Facebook): `opening_dm` (a first DM with a button), `follow_gate` (Instagram: ask them to follow first), `email_capture` (ask for their email), and `follow_up` (one more DM if the link wasn't opened). `status: draft` saves it without going live; `post_scope: next_post` waits for the account's next post.
API keys: allowed. Signed-in users: any member.
Request body: AutomationCreate
Response 201: AutomationOut
Errors
404Account not found403Story automations need the Creator plan or above, live automations the Pro plan or above409Reconnect this account first422Write a DM, a public reply, or both; DMs work on Instagram and Facebook only422A link button needs a title, an http(s) URL and a DM
GET/v1/automations/native
List Native Automations
Imported automations that already run in another tool for this workspace's accounts (linked profiles). They are billed outside Fifty Eight and never count against the auto-DM quota.
API keys: allowed. Signed-in users: any member.
Response 200: NativeAutomationOut[]
PATCH/v1/automations/native/{native_id}
Update Native Automation
Pause, resume or edit an imported automation.
API keys: allowed. Signed-in users: any member.
Parameters
native_idstringrequiredIn the path.
Request body: NativeAutomationUpdate
Response 200: NativeAutomationOut
Errors
404Automation not found on this workspace's accounts422A link button needs both a title and a URL
DELETE/v1/automations/native/{native_id}
Delete Native Automation
API keys: allowed. Signed-in users: any member.
Parameters
native_idstringrequiredIn the path.
Errors
404Automation not found on this workspace's accounts
GET/v1/automations/usage
Automation Usage
Replies used this month against the plan's quota, per-video limit and add-ons.
API keys: allowed. Signed-in users: any member.
Response 200: AutomationUsageOut
GET/v1/automations/{automation_id}
Get Automation
API keys: allowed. Signed-in users: any member.
Parameters
automation_iduuidrequiredIn the path.
Response 200: AutomationOut
Errors
404Automation not found
PATCH/v1/automations/{automation_id}
Update Automation
Change the texts, steps, keywords or post, or set the status (live, paused, draft). Only the fields sent change; a step set to null is removed.
API keys: allowed. Signed-in users: any member.
Parameters
automation_iduuidrequiredIn the path.
Request body: AutomationUpdate
Response 200: AutomationOut
Errors
404Automation not found422Invalid combination
DELETE/v1/automations/{automation_id}
Delete Automation
API keys: allowed. Signed-in users: any member.
Parameters
automation_iduuidrequiredIn the path.
Errors
404Automation not found
GET/v1/automations/{automation_id}/emails
Automation Emails
Email addresses collected by this automation, oldest first.
API keys: allowed. Signed-in users: any member.
Parameters
automation_iduuidrequiredIn the path.
Response 200: AutomationEmailOut[]
GET/v1/automations/{automation_id}/emails.csv
Automation Emails Csv
The same, as a CSV file (email, name, username, collected_at).
API keys: allowed. Signed-in users: any member.
Parameters
automation_iduuidrequiredIn the path.
GET/v1/automations/{automation_id}/events
Automation Events
Latest comments this automation saw, and what it did (sent, skipped and why, failed).
API keys: allowed. Signed-in users: any member.
Parameters
automation_iduuidrequiredIn the path.
limitintegerdefault 50Query string.
Response 200: AutomationEventOut[]
Errors
404Automation not found
GET/v1/automations/{automation_id}/history
Automation History
Everything this automation did, newest first: comments answered or skipped, and each step of each conversation (opening DM, tap, follow check, email, link, click, follow-up).
API keys: allowed. Signed-in users: any member.
Parameters
automation_iduuidrequiredIn the path.
limitintegerdefault 100Query string.
beforedatetime | nullQuery string. Older than this time, to page back
Response 200: AutomationActivityOut[]
Credits & billing
Credits (the one currency), costs, estimates, history and plans. Buying happens in the dashboard.
GET/v1/account-groups
List Groups
Accounts linked as language versions of the same presence (e.g. @atlas FR, @atlas.en EN).
API keys: allowed. Signed-in users: any member.
Response 200: AccountGroupOut[]
POST/v1/account-groups
Create Group
Link accounts as language versions. An account linked elsewhere moves to this group.
API keys: allowed. Signed-in users: any member.
Request body: AccountGroupCreate
Response 201: AccountGroupOut
GET/v1/account-groups/suggestions
Group Suggestions
Unlinked accounts that look like language versions of each other (same platform, similar username).
API keys: allowed. Signed-in users: any member.
Response 200: AccountGroupSuggestion[]
PATCH/v1/account-groups/{group_id}
Rename Group
API keys: allowed. Signed-in users: any member.
Parameters
group_iduuidrequiredIn the path.
Request body: AccountGroupUpdate
Response 200: AccountGroupOut
DELETE/v1/account-groups/{group_id}
Delete Group
Unlink every account of the group. The accounts themselves are not touched.
API keys: allowed. Signed-in users: any member.
Parameters
group_iduuidrequiredIn the path.
POST/v1/account-groups/{group_id}/members
Add Member
API keys: allowed. Signed-in users: any member.
Parameters
group_iduuidrequiredIn the path.
Request body: AccountGroupMember
Response 200: AccountGroupOut
DELETE/v1/account-groups/{group_id}/members/{account_id}
Remove Member
Unlink one account. A group left with a single account is dissolved.
API keys: allowed. Signed-in users: any member.
Parameters
group_iduuidrequiredIn the path.
account_iduuidrequiredIn the path.
GET/v1/billing/packs
List Packs
API keys: allowed. Signed-in users: any member.
Response 200: Pack[]
GET/v1/billing/plans
List Plans
API keys: allowed. Signed-in users: any member.
Response 200: PlansOut
GET/v1/billing/wallet
Get Wallet
Deprecated: see /v1/credits and /v1/credits/history. Legacy USD ledger lines (before credits).
API keys: allowed. Signed-in users: any member.
Response 200: WalletDetailOut
GET/v1/credits
Get Credits
The credit balance, what the plan adds each month, what everything costs, and the automatic top-up settings with this month's budget.
API keys: allowed. Signed-in users: any member.
Response 200: CreditOut
GET/v1/credits/estimate
Credit Estimate
What a dub will cost before starting it ("This dub: N credits").
API keys: allowed. Signed-in users: any member.
Parameters
secondsintegerrequiredQuery string. Length of the video in seconds.
languagesintegerdefault 1Query string.
lipsyncbooleandefault falseQuery string.
previewbooleandefault falseQuery string.
Response 200: CreditEstimateOut
GET/v1/credits/history
Credit History
Every credit movement, newest first, with the balance right after it, why it happened and what it is linked to (a dub, a payment, an auto-DM, a day of account fees).
API keys: allowed. Signed-in users: any member.
Parameters
limitintegerdefault 25Query string.
offsetintegerdefault 0Query string.
Response 200: CreditHistoryOut
GET/v1/subtitles
List Subtitles
API keys: allowed. Signed-in users: any member.
Parameters
limitintegerdefault 50Query string.
Response 200: SubtitleOut[]
POST/v1/subtitles
Create Subtitles
Burn subtitles into a video (its own language, plus optional translations), without dubbing. Included in every plan (no credits). Runs in the background: poll GET /v1/subtitles/{id}. With `publish`, each version publishes itself once ready.
API keys: allowed. Signed-in users: any member.
Request body: SubtitleCreate
Response 201: SubtitleOut
GET/v1/subtitles/{job_id}
Get Subtitles
Status of each language, and while waiting: the queue position and an estimated time.
API keys: allowed. Signed-in users: any member.
Parameters
job_iduuidrequiredIn the path.
Response 200: SubtitleOut
POST/v1/subtitles/{job_id}/cancel
Cancel Subtitles
Stop subtitles that haven't started burning yet.
API keys: allowed. Signed-in users: any member.
Parameters
job_iduuidrequiredIn the path.
Response 200: SubtitleOut
POST/v1/subtitles/{job_id}/confirm
Confirm Subtitles
The transcript is right: translate it (if asked) and burn every language.
API keys: allowed. Signed-in users: any member.
Parameters
job_iduuidrequiredIn the path.
Request body: SubtitleConfirm
Response 200: SubtitleOut
GET/v1/subtitles/{job_id}/transcript
Get Transcript
The transcript as short timed lines (the original language by default).
API keys: allowed. Signed-in users: any member.
Parameters
job_iduuidrequiredIn the path.
languagestring | nullQuery string.
Response 200: TranscriptOut
PATCH/v1/subtitles/{job_id}/transcript
Edit Transcript
Correct lines while the job waits for review. A line keeping its number of words keeps their timings.
API keys: allowed. Signed-in users: any member.
Parameters
job_iduuidrequiredIn the path.
Request body: TranscriptEdit
Response 200: TranscriptOut
Support
Send a request to the Fifty Eight team and follow its status.
GET/v1/support/tickets
My Tickets
Your requests in this workspace, newest first.
API keys: allowed. Signed-in users: any member.
Response 200: TicketOut[]
POST/v1/support/tickets
Create Ticket
Send a request to the Fifty Eight team. Your workspace is attached automatically.
API keys: allowed. Signed-in users: any member.
Request body: TicketIn
Response 201: TicketOut
Errors
404The attached screenshot isn't in this workspace.422Message too short, or no email to answer (API keys must send `email`).429Too many requests in the last hour.
Objects
Request and response shapes used above.
AccountGroupCreate
namestringrequiredmin length 1, max length 120account_idsuuid[]requiredmin items 2, max items 20
AccountGroupMember
account_iduuidrequired
AccountGroupOut
Accounts that are language versions of one presence (e.g. @atlas in French, @atlas.en in English).
iduuidrequirednamestringrequiredaccount_idsuuid[]requiredcreated_atdatetimerequired
AccountGroupSuggestion
namestringrequiredplatformstringrequiredaccount_idsuuid[]required
AccountGroupUpdate
namestringrequiredmin length 1, max length 120
AccountOut
iduuidrequiredbrand_iduuidrequiredplatformstringrequiredusernamestring | nullrequireddisplay_namestring | nullrequiredlocalestring | nullrequiredoptimize_timingbooleanrequiredtimezonestring | nullrequiredgroup_iduuid | nullLanguage-version group this account belongs to.
removed_atdatetime | nullSet when removed from this workspace.
AccountRemovalPreview
What removing an account does, so the confirmation can say it before anything happens.
managedbooleanrequiredTrue: disconnected at the provider and no longer billed. False: only hidden here.
scheduled_posts_only_this_accountintegerrequiredscheduled_posts_sharedintegerrequiredin_groupbooleanrequired
AccountRemoved
removedbooleanrequiredmanagedbooleanrequiredcancelled_postsintegerrequired
AccountStatus
One of: connected, disconnected, paused
AccountUpdate
Only the fields you send are changed.
localestring | nullmax length 16BCP-47, e.g. es-ES
optimize_timingboolean | nullLet Fifty Eight test and pick the best posting times for this account
timezonestring | nullmax length 64IANA zone of the audience, e.g. Europe/Paris
AutoTopupOut
enabledbooleanrequiredthreshold_creditsintegerrequiredA top-up starts when the balance falls below this.
amount_centsintegerrequiredWhat each automatic top-up charges.
amount_creditsintegerrequiredCredits each automatic top-up adds.
has_payment_methodbooleanrequiredA card is saved (after a first top-up).
pendingbooleanrequiredA top-up is being confirmed by the payment provider.
AutomationActivityOut
One step in an automation's history.
kindstringrequiredcomment_answered | comment_skipped | comment_failed | opening_sent | tapped | follow_asked | follow_confirmed | follow_unknown | email_asked | email_invalid | email_collected | link_sent | link_clicked | followup_sent | followup_skipped | expired | step_failed | bound_to_post
contact_namestring | nulldetailstring | nullcreated_atdatetimerequired
AutomationCreate
account_iduuidrequirednamestringrequiredmin length 1, max length 120trigger"comment" | "story" | "live"default "comment"comment (posts and reels), story (Instagram story replies), live (Instagram)
status"live" | "paused" | "draft" | nulllive: answers comments | paused: off | draft: saved, not live yet (incomplete texts allowed). Omitted: from `enabled`.
post_scope"any" | "post" | "next_post" | nullany: every post of the account | post: the post in platform_post_id | next_post: the next post published on the account after the automation is created (bound when it goes out). Omitted: from platform_post_id.
platform_post_idstring | nullpattern ^[A-Za-z0-9_:-][A-Za-z0-9_:.-]{0,127}$Platform id of one post; omit for every post of the account
keywordsstring[]max items 20Empty: any comment triggers it
match_mode"word" | "contains"default "word"dm_messagestring | nullmax length 640The DM with the link (Instagram, Facebook): the last DM of the conversation. {{first_name}}, {{name}}, {{username}}
button_titlestring | nullmax length 20button_urlstring | nullmax length 2000public_replystring | nullmax length 1000A single public reply under the comment (same as public_replies with one entry)
public_repliesstring[] | nullmax items 3Up to 3 different public replies under the comment: one is picked at random for each comment, so the replies under a post don't all look the same. Takes precedence over public_reply.
opening_dmOpeningDM | nullfollow_gateFollowGate | nullemail_captureEmailCapture | nullfollow_upFollowUp | nulllink_trackingbooleandefault trueCount clicks on the link button (through our redirect)
enabledbooleandefault true
AutomationEmailOut
emailstringrequiredcontact_namestring | nullrequiredcontact_usernamestring | nullrequiredcollected_atdatetimerequired
AutomationEventOut
comment_idstringrequiredplatform_post_idstring | nullrequiredcommenter_namestring | nullrequiredcomment_textstring | nullrequiredoutcomestringrequireddm_sentbooleanrequiredrepliedbooleanrequiredreply_variantinteger | nullWhich of public_replies was posted (0-based)
billedstring | nullrequirederrorstring | nullrequiredcreated_atdatetimerequired
AutomationOut
iduuidrequiredaccount_iduuidrequiredplatformstringrequiredaccount_usernamestring | nullrequirednamestringrequiredtriggerstringrequiredstatus"live" | "paused" | "draft"requiredpost_scope"any" | "post" | "next_post"requiredplatform_post_idstring | nullrequiredThe post it answers on (next_post: once bound)
bound_atdatetime | nullnext_post: when the next post was found
keywordsstring[]requiredmatch_modestringrequireddm_messagestring | nullrequiredbutton_titlestring | nullrequiredbutton_urlstring | nullrequiredpublic_replystring | nullrequiredThe first of public_replies
public_repliesstring[]requiredPublic replies; one is picked at random for each comment
opening_dmOpeningDM | nullfollow_gateFollowGate | nullemail_captureEmailCapture | nullfollow_upFollowUp | nulllink_trackingbooleandefault falseenabledbooleanrequiredstatus == live
created_atdatetimerequired
AutomationStats
matchedintegerdefault 0Comments that matched
sentintegerdefault 0Comments answered (same as runs)
dmsintegerdefault 0Comments answered with a DM
public_repliesintegerdefault 0skippedintegerdefault 0failedintegerdefault 0runsintegerdefault 0Comments answered: what counts against the quota
dms_sentintegerdefault 0Every DM sent, every step of every conversation
links_sentintegerdefault 0People who got the DM with the link
clicksintegerdefault 0People who opened the link (once per person)
ctrnumberdefault 0clicks / links_sent, 0 to 1
emailsintegerdefault 0Email addresses collected
followups_sentintegerdefault 0
AutomationUpdate
Only the fields sent change. A step set to null is removed.
namestring | nullmin length 1, max length 120status"live" | "paused" | "draft" | nulllive: answers comments | paused: off | draft: saved, not live yet (incomplete texts allowed)
post_scope"any" | "post" | "next_post" | nullany: every post of the account | post: the post in platform_post_id | next_post: the next post published on the account after the automation is created (bound when it goes out)
platform_post_idstring | nullpattern ^[A-Za-z0-9_:-][A-Za-z0-9_:.-]{0,127}$keywordsstring[] | nullmax items 20match_mode"word" | "contains" | nulldm_messagestring | nullmax length 640button_titlestring | nullmax length 20button_urlstring | nullmax length 2000public_replystring | nullmax length 1000public_repliesstring[] | nullmax items 3Up to 3 different public replies under the comment: one is picked at random for each comment, so the replies under a post don't all look the same. Takes precedence over public_reply.
opening_dmOpeningDM | nullfollow_gateFollowGate | nullemail_captureEmailCapture | nullfollow_upFollowUp | nulllink_trackingboolean | nullenabledboolean | nulltrue: live, false: paused (status wins when both sent)
AutomationUsageOut
This month's auto-DM usage against the workspace's quota.
modestringrequiredinternal | plan | credits | free
usedintegerrequiredincludedinteger | nullrequiredReplies included this month; null = unlimited
per_videointeger | nullrequiredReplies per video; null = no per-video limit
addonstring | nullLegacy Auto-DM add-on still on the plan, if any.
addon_dmsintegerdefault 0triggersstring[]requiredskipped_this_monthintegerrequiredpaid_dmsintegerdefault 0Replies past the quota this month, paid in credits.
dms_per_creditintegerdefault 20Replies past the quota paid by one credit.
credits_this_monthintegerdefault 0Credits used by auto-DMs this month.
BrandCreate
namestringrequiredmin length 1, max length 120default_localestring | nullmax length 16
BrandOut
iduuidrequirednamestringrequireddefault_localestring | nullrequiredcreated_atdatetimerequired
BudgetOut
Monthly budget: the most automatic top-ups may charge in a calendar month (UTC).
used_centsintegerrequiredlimit_centsinteger | nullrequiredNull = no limit.
reachedbooleanrequiredThe next automatic top-up would pass the budget.
ClipOut
iduuidrequiredsource_media_iduuidrequiredstart_secondsnumberrequiredend_secondsnumberrequiredverticalbooleanrequiredstatusstringrequiredmedia_iduuid | nullrequiredmedia_urlstring | nullrequirederrorstring | nullrequiredcreated_atdatetimerequired
ClipRange
startnumberrequired≥ 0.0Seconds from the start of the video
endnumberrequired> 0.0
ClipsCreate
media_iduuidrequiredverticalbooleandefault falseCrop to 9:16 for Reels, TikTok and Shorts
ConnectOut
auth_urlstringrequiredbrand_iduuidrequired
ConnectRequest
platform"instagram" | "tiktok" | "youtube" | "facebook" | "linkedin" | "twitter" | "threads" | "pinterest" | "bluesky" | "googlebusiness" | "telegram"requiredbrand_iduuid | null
CostsOut
What spends credits. 1 credit = 1 second of dubbed video in one language.
credit_price_centsintegerrequiredPrice of one credit in US cents (6 = $0.06).
dub_per_secondintegerrequiredCredits per second of video, per language.
lipsync_per_secondnumberrequiredExtra credits per second of lip-synced video, per language.
previewintegerrequiredCredits for a 15-second voice preview.
subtitles_includedbooleandefault trueSubtitles without dubbing (original or translated) are included in the plan.
dms_per_creditintegerrequiredAuto-DMs past the monthly quota paid by one credit.
account_per_monthintegerrequiredCredits a month for each account past the plan (taken daily).
topup_presetsinteger[]requiredTop-up sizes offered, in credits.
min_topup_centsintegerrequiredmax_topup_centsintegerrequired
CreditEntryOut
iduuidrequiredcreated_atdatetimerequiredreasonstringrequiredsubscription | topup | purchase | grant | adjustment | conversion | dub_reserve | dub_refund | lipsync | lipsync_refund | autodm | accounts
labelstringrequiredWhat it was, in words.
creditsintegerrequiredCredits added (positive) or used (negative).
balance_afterintegerrequiredamount_centsinteger | nullWhat a top-up charged, in US cents.
refstring | nullLinked object: the dub id (dub_reserve/dub_refund), the auto-DM event id, lipsync:<variant>, the payment (dodo:<id>), or accounts:<workspace>:<day>.
CreditEstimateOut
secondsintegerrequiredlanguagesintegerrequireddubbingintegerrequiredCredits for the dub itself.
lipsyncintegerrequiredExtra credits for lip sync.
totalintegerrequiredbalanceintegerrequiredunlimitedbooleandefault falseenoughbooleanrequiredThe balance covers it (always true for an internal workspace).
CreditHistoryOut
totalintegerrequired
CreditOut
credits_balanceintegerrequiredCredits left: plan credits and bought credits in one balance. May be below zero after daily account fees.
dub_seconds_balanceintegerrequiredDeprecated alias of credits_balance.
unlimitedbooleandefault falseInternal workspace: never charged, never blocked.
plan_credits_per_monthintegerdefault 0Credits the current plan adds each paid month.
next_plan_credits_atdatetime | nullWhen the plan adds its next credits.
accounts_past_planintegerdefault 0Connected accounts that cost credits.
accounts_pausedintegerdefault 0Accounts past the plan paused because the credits could not pay for them.
costsCostsOut | nullauto_topupAutoTopupOut | nullbudgetBudgetOut | nullcaption_translationbooleandefault falselimitsLimitsOut | nullmodestringdefault "free"walletWalletOut | nullDeprecated: see auto_topup and budget.
dubbing_enabledbooleandefault trueactivebooleandefault truelipsyncLipsyncRatesOut | null
CurrentPlan
plan_idstring | nullrequiredstatusstring | nullrequiredrenews_atdatetime | nullrequiredcan_managebooleanrequiredrolestringdefault "member"
DubPlanIn
media_iduuidrequiredThe video of the post.
source_languagestring | nullpattern ^[a-z]{2,3}(-[A-Za-z0-9]{2,8})?$Omit to auto-detect.
languagesstring[]requiredmin items 1, max items 16targetsmap<string, uuid[]>requiredFor each language, the accounts that get that language version. Every language needs one.
subtitlesbooleandefault truesubtitle_styleSubtitleStyle | nulllipsyncbooleandefault falseduration_secondsinteger | null≥ 1.0, ≤ 36000.0The video's length as measured by the client (credits check).
tiktokTikTokOptions | nullyoutube_titlestring | nullmax length 100
DubbedPostCreate
A post in its original language, plus its dubbed versions, each published to its own accounts as soon as it is ready (or at the post's time if it is ready by then).
postPostCreate | nullThe original post. Omit to only publish the dubs.
DubbedPostOut
EmailCapture
Before the link, ask for the person's email address. The reply is checked; the address is kept for this automation and can be exported as CSV. On Facebook, needs an opening DM.
messagestringdefault "What's your email address, {{first_name}}? I'll send you the link right after."min length 1, max length 640invalid_messagestringdefault "Hmm, that doesn't look like an email address. Could you send it again?"min length 1, max length 640
FacebookOptions
format"feed" | "reel" | "story"default "feed"reel: a single vertical video. story: one photo or video, 24 hours, no caption.
titlestring | nullmax length 255Reel title.
FollowGate
Instagram: before the link, check that the person follows the account. If not, this message asks them to, with a button that checks again. Needs an opening DM (Instagram only tells whether someone follows you once they have messaged you).
messagestringdefault "Almost there, {{first_name}}! Follow us first, then tap the button below."min length 1, max length 640button_titlestringdefault "I'm following"min length 1, max length 20
FollowUp
If the link wasn't opened after `delay_hours`, one more DM with the same link. Sent only within 24 hours of the person's last message (Instagram and Facebook rule).
messagestringrequiredmin length 1, max length 640{{first_name}}, {{name}}, {{username}}
delay_hoursintegerdefault 4≥ 1.0, ≤ 23.0
InstagramOptions
format"auto" | "story"default "auto"auto: images go to the feed (several make a carousel), a single video is a Reel. story: a Story (one photo or video, 24 hours, no caption).
share_to_feedbooleandefault trueReels: also show it in the feed (false: Reels tab only).
collaboratorsstring[]max items 3Up to 3 @usernames of public creator or business accounts.
paid_partnershipbooleandefault falseShow the 'Paid partnership' label.
LimitsOut
plan_idstring | nullrequiredaccountsintegerrequiredlanguagesintegerrequiredaccounts_usedintegerrequiredextra_accountsintegerdefault 0
LinkedInOptions
disable_link_previewbooleandefault false
LipsyncIn
languagesstring[] | nullmax items 16Languages to lip-sync. Omit for every ready language.
LipsyncRatesOut
Lip sync is never included in a plan: each second of lip-synced video uses `credit_multiplier` extra credits, per language (rounded up per job).
credit_multipliernumberrequiredmax_secondsintegerrequired
LocalizationCreate
media_iduuidrequiredAn uploaded video (see POST /v1/media/uploads).
languagesstring[]requiredmin items 1, max items 16BCP-47 tags to dub into, e.g. es, pt-BR, ja
source_languagestring | nullpattern ^[a-z]{2,3}(-[A-Za-z0-9]{2,8})?$Omit to auto-detect.
captionstringdefault ""max length 5000Caption to translate for each language.
subtitlesbooleandefault trueBurn each language's subtitles into its dubbed video.
lipsyncbooleandefault falseAlso lip-sync each language once dubbed: +1.5 credits per second of video, per language (rounded up per job).
subtitle_styleSubtitleStyle | nullLook of the burned subtitles. Omit for the workspace's last style (or Pop).
previewbooleandefault falseDub only the first 15 seconds into one language to hear the voice first (15 credits).
duration_secondsinteger | null≥ 1.0, ≤ 36000.0The video's length as the client measured it, so a dub the balance can't cover is refused up front. The exact cost is taken once the video is measured on our side.
LocalizationOut
iduuidrequiredsource_media_iduuidrequiredsource_languagestring | nullrequiredcaptionstringrequiredstatusstringrequiredduration_secondsinteger | nullrequirederrorstring | nullrequiredsourcestringrequiredburn_subtitlesbooleandefault falselipsyncbooleandefault falseLip sync was asked for at dub time.
subtitle_styleobject | nullStyle of the burned subtitles.
original_post_iduuid | nullPost this dub was started from, if any.
previewbooleandefault falseA 15-second sample, never published.
created_atdatetimerequiredupdated_atdatetimerequired
LocalizationPublish
account_idsuuid[] | nullLimit to these accounts. Default: every connected account.
include_originalbooleandefault trueAlso post the original video to accounts in the source language or with no language set.
publish_nowbooleandefault falsescheduled_fordatetime | nulltimezonestring | nulldraftbooleandefault falsetiktok_consentbooleandefault falsetiktok_privacy"PUBLIC_TO_EVERYONE" | "MUTUAL_FOLLOW_FRIENDS" | "FOLLOWER_OF_CREATOR" | "SELF_ONLY"default "PUBLIC_TO_EVERYONE"youtube_titlestring | nullmax length 100idempotency_keystring | nullmax length 64
MediaRef
media_iduuid | nullurlurl | nullmin length 1, max length 2083type"video" | "image" | null
NativeAutomationOut
An imported automation: it runs in another tool (set up before the accounts were linked to Fifty Eight).
idstringrequiredaccount_iduuidrequiredplatformstringrequiredaccount_usernamestring | nullrequirednamestringrequiredtriggerstringrequiredplatform_post_idstring | nullrequiredpost_titlestring | nullrequiredkeywordsstring[]requiredmatch_modestringrequireddm_messagestring | nullrequiredbutton_titlestring | nullrequiredbutton_urlstring | nullrequiredpublic_replystring | nullrequiredenabledbooleanrequiredcreated_atstring | nullrequiredruns_onstringdefault "zernio"
NativeAutomationStats
triggeredintegerdefault 0dms_sentintegerdefault 0dms_failedintegerdefault 0unique_contactsintegerdefault 0link_clicksintegerdefault 0unique_clicksintegerdefault 0
NativeAutomationUpdate
namestring | nullmin length 1, max length 120keywordsstring[] | nullmax items 20match_mode"word" | "contains" | "exact" | nulldm_messagestring | nullmax length 640button_titlestring | nullmax length 20button_urlstring | nullmax length 2000public_replystring | nullmax length 1000enabledboolean | null
OpeningDM
Two-step DM: this message goes first, with a button. The DM with the link comes when the person taps it (or answers with any message).
messagestringrequiredmin length 1, max length 640{{first_name}}, {{name}}, {{username}}
button_titlestringdefault "Send me the link"min length 1, max length 20
OrgOut
iduuidrequirednamestringrequiredcreated_atdatetimerequireddubbing_enabledbooleandefault true
Pack
idstringrequiredlabelstringrequiredsecondsintegerrequiredpricestringrequired
PinterestBoardOut
idstringrequirednamestringrequired
PinterestOptions
board_idstring | nullmax length 64Board to pin to (see pinterest-boards).
titlestring | nullmax length 100linkurl | nullmin length 1, max length 2083Where a click on the pin goes.
Plan
idstringrequiredlabelstringrequiredcreditsintegerrequiredCredits added each paid month (unused credits roll over).
secondsintegerrequiredDeprecated alias of credits.
pricestringrequiredaccountsintegerrequiredlanguagesintegerrequiredautodm_monthintegerdefault 0autodm_per_videointeger | nullautodm_triggersstring[]default []
PlansOut
PostCreate
contentstringdefault ""max length 10000publish_nowbooleandefault falsescheduled_fordatetime | nullISO 8601 with offset, or naive local time interpreted in `timezone`.
timezonestring | nullIANA zone, e.g. Europe/Paris
draftbooleandefault falsefixed_timebooleandefault falseNever let the best-time optimizer move this post (e.g. a launch at a set hour)
PostDuplicate
tiktok_consentbooleandefault falseNeeded when the copy targets a TikTok account.
PostOut
iduuidrequiredbrand_iduuidrequiredcontentstringrequiredmediaany[]requiredpublish_nowbooleanrequiredscheduled_fordatetime | nullrequiredtimezonestring | nullrequirederrorstring | nullrequiredsourcestringrequiredfixed_timebooleanrequiredcan_retrybooleanrequiredpublished_atdatetime | nullcreated_atdatetimerequiredupdated_atdatetimerequired
PostStatus
One of: draft, scheduled, publishing, published, partially_published, failed, cancelled, held
PostSyncOut
importedintegerrequiredupdatedintegerrequiredremovedintegerrequiredbrandsintegerrequired
PostUpdate
Edit a draft, scheduled, failed or cancelled post. Omitted fields stay as they are.
contentstring | nullmax length 10000The full new media list, in order.
The full new set of accounts, with their captions.
scheduled_fordatetime | nullNew time: ISO 8601 with offset, or naive local time interpreted in `timezone`.
timezonestring | nulldraftboolean | nulltrue: keep or make it a draft. false: schedule it.
fixed_timeboolean | nullNever let the best-time optimizer move this post.
SubtitleConfirm
subtitle_styleSubtitleStyle | nullChange the look before burning.
SubtitleCreate
media_iduuidrequiredAn uploaded video (see POST /v1/media/uploads).
languagestring | nullpattern ^[a-z]{2,3}(-[A-Za-z0-9]{2,8})?$Spoken language. Omit to detect it.
translate_tostring[]max items 7Also burn subtitles translated into these languages (same audio).
subtitle_styleSubtitleStyle | nullLook of the subtitles. Omit for the workspace's last style (or Pop).
reviewbooleandefault falseStop once the transcript is ready so it can be corrected (PATCH .../transcript), then POST .../confirm to burn it.
captionstringdefault ""max length 10000duration_secondsinteger | null≥ 1.0, ≤ 36000.0The video's length as the client measured it (length check).
publishSubtitlePublishPlan | nullPublish each version once it is ready.
SubtitleOut
iduuidrequiredsource_media_iduuidrequiredlanguagestring | nullrequiredlanguage_detectedbooleanrequiredstatusstringrequirederrorstring | nullrequiredsourcestringrequiredcaptionstringrequiredreviewbooleanrequiredduration_secondsinteger | nullrequiredsubtitle_styleobject | nullcreated_atdatetimerequiredupdated_atdatetimerequiredfinished_atdatetime | nullqueueSubtitleQueueOut | null
SubtitlePublishPlan
Where each subtitled version goes. `original`: the video with subtitles in its spoken language; each translated language: its own accounts (see list_language_versions). Each version publishes itself once ready.
contentstringdefault ""max length 10000Caption (translated for each other language).
languagesmap<string, TargetIn[]>Translated language -> its accounts (with their platform options).
publish_nowbooleandefault falsescheduled_fordatetime | nulltimezonestring | nulldraftbooleandefault falseMake draft posts instead of publishing.
fixed_timebooleandefault false
SubtitleQueueOut
stage"transcribe" | "burn" | nullrequiredQueue the job waits in (null: not waiting).
aheadintegerrequiredVideos that will be handled before this one in that queue.
eta_secondsinteger | nullrequiredEstimated seconds until this video is ready (recent averages).
SubtitleRestyle
SubtitleStyle
Look of the subtitles burned into each dubbed video. Every field is optional (preset defaults apply).
preset"pop" | "bold_box" | "clean" | "karaoke" | "minimal" | "classic"default "pop"pop: 2-3 big words, the spoken word pops in colour. bold_box: words on a solid colour box. clean: sentence case, soft fade. karaoke: words fill with colour as spoken. minimal: small lowercase. classic: plain line-level subtitles.
font"poppins" | "montserrat" | "anton" | "bebas" | "archivo" | "rounded" | "noto" | nullOmit for the preset's font.
highlight"indigo" | "brand" | "yellow" | "green" | "red" | "pink" | "white" | "black"default "indigo"text_color"indigo" | "brand" | "yellow" | "green" | "red" | "pink" | "white" | "black"default "white"position"bottom" | "middle" | "top"default "bottom"size"s" | "m" | "l"default "m"uppercaseboolean | nullOmit for the preset's default.
SubtitleVariantOut
languagestringrequiredoriginalbooleanrequiredstatusstringrequiredmedia_iduuid | nullrequiredmedia_urlstring | nullSubtitled video. Temporary link, kept 7 days.
captionstring | nullrequirederrorstring | nullrequiredpost_iduuid | nullpublish_notestring | null
TargetEdit
account_iduuidrequiredcontentstring | nullCaption for this account only (null: the main caption).
tiktok_consentbooleandefault falseRequired when adding a TikTok account: the creator reviewed and consents.
TargetIn
One account of a post. Platform options only apply to accounts of that platform (others ignore them).
account_iduuidrequiredcontentstring | nullOverride the caption for this account.
tiktokTikTokOptions | nullyoutube_titlestring | nullmax length 100Same as youtube.title (older name).
first_commentstring | nullmax length 5000Instagram, Facebook, LinkedIn, YouTube and Threads (500).
instagramInstagramOptions | nullyoutubeYouTubeOptions | nullpinterestPinterestOptions | nullfacebookFacebookOptions | nullxXOptions | nullX (twitter accounts).
threadsThreadsOptions | nulllinkedinLinkedInOptions | null
TargetOut
iduuidrequiredsocial_account_iduuidrequiredplatformstringrequiredcustom_contentstring | nullrequiredplatform_optionsobjectThe platform options sent for this account.
platform_post_urlstring | nullrequiredplatform_post_idstring | nullPublished posts: the post's id on the platform (use it to bind an automation).
error_messagestring | nullrequirederror_categorystring | nullrequiredpublished_atdatetime | nullmetricsobject | nullPublished posts: latest views, likes, comments, shares, saves, reach, impressions.
TargetStatus
One of: pending, publishing, published, failed, cancelled, held
ThreadsOptions
topic_tagstring | nullmin length 1, max length 50, pattern ^[^.&]+$
TicketIn
topicstringdefault "other"One of: billing, dubbing, publishing, automations, accounts, api, bug, privacy, other.
messagestringrequiredmin length 1, max length 5000media_iduuid | nullAn uploaded screenshot (see POST /v1/media/uploads).
emailstring | nullWhere we answer. Defaults to your account email.
TicketOut
numberstringrequiredtopicstringrequiredstatusstringrequiredmessagestringrequiredcreated_atdatetimerequired
TikTokOptions
privacy_level"PUBLIC_TO_EVERYONE" | "MUTUAL_FOLLOW_FRIENDS" | "FOLLOWER_OF_CREATOR" | "SELF_ONLY"default "PUBLIC_TO_EVERYONE"allow_commentbooleandefault trueallow_duetbooleandefault trueVideos only.
allow_stitchbooleandefault trueVideos only.
commercial_content"none" | "brand_organic" | "brand_content"default "none"Disclose commercial content: brand_organic (promotes your own brand) or brand_content (a paid partnership). Not allowed with privacy SELF_ONLY.
draftbooleandefault falseSend to the creator's TikTok inbox as a draft instead of publishing: the creator finishes and posts it in the TikTok app.
consentbooleandefault falseMust be true: the creator reviewed the content and agrees to publish it.
TimingAccount
account_iduuidrequiredplatformstringrequiredusernamestring | nullrequiredoptimize_timingbooleanrequiredtimezonestring | nullrequiredAudience zone; slots are computed in UTC until it is set
posts_analyzedintegerrequiredconfidencestringrequiredlearning (<15 posts), medium (<50) or high
gridnumber[][]requiredExpected lift per weekday (rows, Monday first) and time block
TimingInsights
blocksstring[]requireddaysstring[]required
TimingMoveOut
post_iduuidrequiredoriginal_atdatetimerequiredplanned_atdatetimerequiredexpected_gainnumberrequiredappliedbooleanrequirederrorstring | nullrequiredcreated_atdatetimerequiredpreviewstringrequiredtimezonestring | null
TimingSlot
labelstringrequiredweekdayintegerrequiredblockintegerrequiredliftnumberrequiredExpected performance vs the account's median, log scale (+0.3 ~ +35 %)
sdnumberrequired
TranscriptEdit
linesobject[]requiredmin items 1, max items 2000[{"index": 3, "text": "corrected words"}] (line indexes from GET).
TranscriptLine
indexintegerrequiredstartnumberrequiredendnumberrequiredtextstringrequired
TranscriptOut
languagestringrequirededitablebooleanrequiredTrue while the job waits for review (original language only).
UploadOut
media_iduuidrequiredupload_urlstringrequiredPUT the file bytes here with the same Content-Type. Valid 1 hour.
public_urlstringrequired
UploadRequest
filenamestringrequiredmin length 1, max length 255content_typestringrequiredpattern ^(video|image)/[\w.+-]+$size_bytesinteger | null> 0.0, ≤ 5368709120.0
VariantCaptionUpdate
captionstringrequiredmax length 5000
VariantOut
languagestringrequiredstatusstringrequiredmedia_iduuid | nullrequiredmedia_urlstring | nullDubbed video. Temporary link, kept 7 days.
captionstring | nullrequirederrorstring | nullrequiredlipsync_statusstring | nullpending | running | ready | failed (null: none).
lipsync_errorstring | nulllipsync_cost_secondsintegerdefault 0Credit seconds the latest lip sync attempt took.
unsynced_media_urlstring | nullThe dubbed video before lip sync, kept to compare or go back.
post_iduuid | nullPost made for this language (dubs started from a post).
publish_notestring | nullWhy this language wasn't published, or a heads-up.
WalletDetailOut
balance_centsintegerrequiredauto_topup_enabledbooleanrequiredauto_topup_threshold_centsintegerrequiredauto_topup_amount_centsintegerrequiredauto_topup_monthly_cap_centsinteger | nullauto_topup_month_centsintegerdefault 0auto_topup_cappedbooleandefault falsehas_payment_methodbooleanrequiredtopup_pendingbooleanrequired
WalletEntryOut
delta_centsintegerrequiredreasonstringrequiredcreated_atdatetimerequired
WalletOut
Deprecated: automatic top-up settings under their pre-credits names. Use `auto_topup` and `budget` on /v1/credits. `balance_cents` is the credit balance's value in US cents.
balance_centsintegerrequiredauto_topup_enabledbooleanrequiredauto_topup_threshold_centsintegerrequiredauto_topup_amount_centsintegerrequiredauto_topup_monthly_cap_centsinteger | nullauto_topup_month_centsintegerdefault 0auto_topup_cappedbooleandefault falsehas_payment_methodbooleanrequiredtopup_pendingbooleanrequired
WorkspaceOut
iduuidrequirednamestringrequiredcreated_atdatetimerequireddubbing_enabledbooleandefault truerolestringdefault "member"
WorkspaceUpdate
dubbing_enabledboolean | nullTurn dubbing on or off for this workspace.
XOptions
made_with_aibooleandefault falseLabel the post as containing AI-generated media.
YouTubeOptions
titlestring | nullmax length 100Video title (default: the caption's first line).
visibility"public" | "unlisted" | "private"default "public"category_idstringdefault "22"YouTube category id, e.g. 22 People & Blogs, 27 Education.
tagsstring[]max items 50Up to 100 characters each, 500 in all.
made_for_kidsbooleandefault falsesynthetic_mediabooleandefault falseDiscloses altered or synthetic content that looks real (YouTube may label it).
Example
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: $(uuidgen)" \
-d '{"content": "Hello", "media": [{"url": "https://example.com/v.mp4", "type": "video"}],
"targets": [{"account_id": "ACCOUNT_ID"}], "publish_now": true}'