Skip to main content

Commands

What each mixpost command does, with examples. Commands in this page work on the workspace from -w or from the active profile (see Choose a workspace).

For the full list of flags of any command, run it with --help:

mixpost post schedule --help

Naming things​

You rarely need to look up an id before running a command. Wherever a command takes an account, a tag, a workspace or a media folder, you can name it the way you'd say it out loud:

WhatAccepted valuesExample
Accountnumeric id, uuid, username, display name or provider--account linkedin
Tagnumeric id, uuid or name--tag launch
Workspaceuuid, name or numeric id-w acme
Media folderuuid, name (when unique), path from the root, or root--folder Brand/Q4

The CLI looks names up in the workspace before it sends the request. If a name matches nothing, the command fails before changing anything.

Most commands have shorter aliases: ls for list, rm for delete, and plural forms such as posts, tags and accounts.

Workspaces​

mixpost workspace list

Lists the workspaces your personal key can access, most recently updated first. Use one of the uuids with -w, or save it with mixpost config set workspace <uuid>. This command doesn't need a workspace to be set.

Accounts​

List the social accounts connected to the workspace, and filter them:

mixpost account list
mixpost account list --provider instagram --provider linkedin
mixpost account list --keyword acme
mixpost account list --unauthorized # accounts that lost their connection and need reconnecting
mixpost account get <account-uuid>

Accounts are connected and reconnected in the Mixpost dashboard, not from the CLI.

Posts​

Create a post​

Without a scheduling flag, a new post is saved as a draft:

mixpost post create --text "Draft this for later" --account twitter

Add one of these flags to send it out:

FlagWhat happens
--nowpublish immediately
--at "<time>"schedule for that time
--date and --timeschedule for that date (YYYY-MM-DD) and time (HH:MM)
--queueadd to the publishing queue, to go out in the next free queue slot
# schedule for two accounts, in an explicit timezone
mixpost post create \
--text "Launching today" \
--account twitter --account linkedin \
--at "2026-09-10 15:00" --tz Europe/Chisinau

# publish now, with media and a tag (created if it doesn't exist)
mixpost post create --text "Look at this" --media 4,5 \
--account 1 --tag launch --create-tags --now

To write longer text, read it from a file, or from stdin with -:

mixpost post create --text-file announcement.md --account linkedin

Times and timezones​

A time without a timezone offset, such as "2026-09-10 15:00", is read in the timezone you pass with --tz (short for --timezone). Without --tz, it is read in the timezone set in your Mixpost user settings.

A time in RFC 3339 format with an offset, such as 2026-09-10T15:00:00+03:00, is an exact moment and is converted for you.

Threads​

Repeat --text to build a thread. Each --text is one post in the thread. --media and --link are matched to the text blocks in the same order:

mixpost post create \
--text "1/ We just shipped media folders" --media 12 \
--text "2/ Here's how they work" --media 13,14 \
--account twitter --queue

--media takes a comma-separated list of media ids for one block. --link attaches a link to a block, for Facebook and LinkedIn.

Platform options​

Some platforms have their own settings, such as a YouTube title or a Mastodon content warning. Set them with --option provider.key=value, or put them all in a JSON file with --options-file:

mixpost post create --text "Sensitive topic" --account mastodon \
--option mastodon.sensitive=true

mixpost post create --text "Release notes" --media 20 --account youtube \
--option youtube.title="Release notes for October"

Mentions in a post​

Write {{mention:<reference>}} in the text to tag a person or a brand you saved as a mention. Each account receives the handle its own network expects:

mixpost post create --text "Thanks {{mention:42}} for the review!" \
--account twitter --account bluesky

Platform requirements​

Before a post is scheduled, queued or approved, Mixpost checks it against what each of its platforms requires, such as attached media or a maximum text length. If the post doesn't meet a requirement, the command fails with exit code 6 and lists every problem, each under a key like requirements.<scope>.<provider>.<rule>. Fix them and run the command again.

Drafts are not checked, so you can save an unfinished post at any time.

List posts​

mixpost post list # newest first, one page
mixpost post list --status scheduled --all # every scheduled post
mixpost post list --account linkedin --tag campaign # matches any of the given accounts or tags
mixpost post list --keyword launch
mixpost post list --trashed
mixpost post get <post-uuid>

Statuses: draft, needs_approval, scheduled, published, failed and trash. Use --exclude-status to leave one out.

The server applies every filter, so the results cover the whole workspace, not just the current page. Use --all to get every page, or --limit N to stop after N posts.

Edit a post​

mixpost post update <post-uuid> --text "Corrected text"
mixpost post update <post-uuid> --at "2026-09-11 09:00" --tz Europe/Chisinau
mixpost post update <post-uuid> --account twitter --account threads

The CLI reads the post first and applies only the flags you pass on top of it. Changing the text keeps the accounts, tags, media and schedule as they were. To replace the post with exactly what your flags describe, add --from-existing=false.

If you edit a scheduled post, it is checked against the platform requirements again.

Schedule, queue and approve​

These commands take one or more post uuids:

# schedule at the date and time already stored on the post
mixpost post schedule <post-uuid>

# publish now
mixpost post schedule <post-uuid> --now

# move it while scheduling, and give LinkedIn a later time of its own
mixpost post schedule <post-uuid> --at "2026-09-10 15:00" --tz Europe/Chisinau \
--account-at linkedin="2026-09-10 18:00"

# add to the publishing queue
mixpost post queue <post-uuid>

# approve posts that are waiting for review
mixpost post approve <post-uuid> --at "2026-09-11 09:00"

Accounts without their own --account-at time publish together with the post. Use --clear-account-times to remove all per-account times.

Delete posts​

mixpost post delete <post-uuid> # move to the trash
mixpost post delete <uuid-a> <uuid-b> --permanent # delete for good (asks first)
mixpost post delete <post-uuid> --permanent --delete-mode app_and_social --yes

--delete-mode sets where a permanent delete applies:

ModeDeletes the post from
app_onlyMixpost only (default); it stays on the social networks
app_and_socialMixpost and the social networks it was published to
social_onlythe social networks only; it stays in Mixpost

Use a JSON body​

For full control, pass the request body as JSON with -f. Any flags you add are applied on top of it, so a file can work as a template:

cat post.json | mixpost post create -f -
mixpost post create -f template.json --at "2026-09-10 15:00"

The body uses the same format as the API's Create post endpoint.

Media​

Upload​

mixpost media upload photo.jpg
mixpost media upload video.mp4 --alt-text "Product demo"
mixpost media upload https://example.com/photo.jpg
mixpost media upload *.png --folder Brand -o id
  • Local files are uploaded directly. Files larger than 8 MiB are uploaded in parts automatically. Change the size with --chunk-threshold, and the number of parts uploaded at once with --concurrency (3 by default). If an upload fails, the CLI cancels it on the server so no partial file is left behind.
  • URLs are downloaded by your Mixpost instance, not by your computer. The CLI waits until the download finishes. Pass --wait=false to return straight away, then check on it later with mixpost media status <download-id>.

post create --media takes the numeric id of each file, shown in the id column of the upload output. To upload and post in one go, take that column from the CSV output:

ids=$(mixpost media upload a.jpg b.jpg -o csv --no-headers | cut -d, -f1 | paste -sd, -)
mixpost post create --text "Two photos" --media "$ids" --account instagram --now

-o id prints the media uuids, which other media commands accept, such as media delete.

List, edit and delete​

mixpost media list
mixpost media list --type video --usage unused
mixpost media list --folder Brand/Q4 --sort name
mixpost media list --keyword logo
mixpost media get <media-uuid>

mixpost media update <media-uuid> --alt-text "Team photo"
mixpost media update <media-uuid> --name team.png --folder Brand

mixpost media delete 12 13
FilterValues
--typeimage, gif, video
--usagepublished, scheduled, draft, unused
--foldera folder, or root for files that are in no folder
--favoriteonly files you starred
--mime-typefor example image/png; repeatable
--sortnewest (default), oldest, name, size

Without --folder, the whole library is listed, across every folder. --keyword always searches the whole library, so --folder and --favorite are ignored when you use it.

Deleting a file also removes it from every post that uses it. media delete accepts numeric ids and uuids, and ids that don't exist in the workspace are skipped without an error.

Clean up every file that no post uses:

mixpost media list --usage unused --all -o id | xargs mixpost media delete --yes

Folders​

Folders organise the library without moving files: a file's URL stays the same when you move it to another folder. Folders can be nested up to five levels deep.

mixpost media folder list # every folder, with its file count
mixpost media folder create Brand
mixpost media folder create Q4 --parent Brand
mixpost media folder update Brand --name "Brand 2026"
mixpost media folder update Brand/Q4 --parent root # move to the top level
mixpost media folder delete Brand/Q4

When you delete a folder, the files and subfolders in it move up one level. To delete the files too, add --delete-media.

Tags​

mixpost tag list
mixpost tag create --name launch --color "#60a5fa"
mixpost tag update <tag-uuid> --name "launch-2026" --color "#f97316"
mixpost tag get <tag-uuid>
mixpost tag delete <tag-uuid>

You can also create tags while creating a post, with --tag <name> --create-tags.

Mentions​

A mention stores the handle a person or brand uses on each network. When a post includes {{mention:<reference>}}, every account receives the right handle for its network. Networks the mention has no handle for receive the mention's name as plain text.

mixpost mention create --name "Ana Popescu" \
--identity bluesky=ana.bsky.social --provider-id bluesky=did:plc:abcdef123456 \
--identity twitter=anapopescu

mixpost mention list # the INSERT column is the text to paste into a post
mixpost mention list --search ana
mixpost mention get <mention-id>
FlagMeaning
--namedisplay name, also the plain text used on networks without a handle
--identitythe handle on one network, as provider=handle; repeatable
--provider-idthe network's own id for the profile, such as a DID on Bluesky or a URN on LinkedIn
--labelthe display name on one network, where it differs from --name
--avataravatar image URL

mention update keeps the handles you don't mention. --identity adds or changes one network, and --remove-identity removes one:

mixpost mention update <mention-id> --identity threads=ana.popescu
mixpost mention update <mention-id> --remove-identity twitter

If you delete a mention, posts that already use it keep its name as plain text.

Analytics​

Analytics periods are UTC days. Every role can read analytics, including Viewer.

# workspace-wide followers, growth and posting activity
mixpost analytics summary
mixpost analytics summary --period last_month
mixpost analytics summary --from 2026-01-01 --to 2026-03-31

# one account, one type of analytics
mixpost analytics account linkedin
mixpost analytics account linkedin --type content --sort-by IMPRESSION_COUNT

# how a published post performed on each account
mixpost analytics post <post-uuid>

--period accepts this_week, last_week, this_month (default), last_month, last_3_months and this_year. Use --from and --to together for a custom range.

Each platform supports different types of analytics for an account. The tabs field in the JSON response lists the ones an account supports. The available types are overview (default), engagement, content, hashtags, insights, audience, reach, video, competitors, search_terms and reviews.

The table shows the main figures. Add -o json to get the full response, including charts.

Best times to post​

# how well each hour of the week has worked, scored 0 to 100 (50 is average)
mixpost analytics posting-times --tz Europe/Chisinau

# the next best time for each account, within the next 14 days
mixpost analytics best-times --tz Europe/Chisinau
mixpost analytics best-times --account linkedin

best-times returns times that are ready to pass to post create --at with the same --tz. Accounts without enough posting history are left out.

Any endpoint​

mixpost raw calls any API endpoint, including ones the CLI doesn't have a command for. You still get the CLI's authentication, retries, output formats and error handling.

mixpost raw GET posts -q page=2
mixpost raw POST tags -d '{"name":"launch","hex_color":"#60a5fa"}'
mixpost raw PUT posts/<post-uuid> -f body.json
mixpost raw GET posts --paginate --limit 100

The path is relative to /api, and the workspace is added for you: posts becomes /api/<workspace-uuid>/posts. Paths that don't belong to a workspace, such as workspaces and ping, are recognised and left as they are. Add --no-workspace to do the same for any other path.

FlagMeaning
-d, --datarequest body
-f, --fileread the request body from a file (- for stdin)
-q, --queryquery parameter as key=value; repeatable
-H, --headerextra header as 'Name: value'; repeatable
--paginatefollow every page and merge the results
--limitstop after this many items

See the API reference for every endpoint and its parameters.

Enterprise admin API​

The Enterprise admin API (/api/panel: workspaces, users, subscriptions, receipts) has no commands of its own, but you can call it with raw using the personal key of an admin:

mixpost raw GET panel/workspaces

Ping​

mixpost ping

Checks that a self-hosted Mixpost Pro instance is reachable and that your key works. This endpoint exists only in self-hosted Pro. On Mixpost Cloud and Enterprise, use mixpost workspace list or mixpost auth status instead.