One command, a native post everywhere
posts create sends one post to every channel you pass with -c, and each network gets it in its own format. Attach media with -m, or tailor the text per channel with --file.
Schedule and publish to X, LinkedIn, Instagram, TikTok, YouTube and more with one command. Script it, cron it, or run it from CI.
$ npm install -g bulkit-cliA terminal tool that behaves the way your shell expects.
posts create sends one post to every channel you pass with -c, and each network gets it in its own format. Attach media with -m, or tailor the text per channel with --file.
Ids go to stdout and messages to stderr, so id=$(bulkit posts create …) just works. --json prints the API's objects unchanged, and stays stable between releases.
Without a terminal the CLI never prompts: anything that needs a yes fails until you pass --yes. Every kind of failure has its own exit code, and --wait holds the job until every channel is done.
Tab completes commands, flags and values like --status, with descriptions in zsh and fish. One line in your shell's startup file sets it up.
Node.js 22.12 or later. Install it globally with npm install -g bulkit-cli, or run it without installing: npx bulkit-cli --help.
Create an API key in the Bulkit app under Developers → API & Webhooks, then run bulkit auth login and paste it (input is hidden). Keys are saved in ~/.config/bulkit/config.json, readable only by you. Use --profile to keep keys for several workspaces.
Set BULKIT_API_KEY in the environment, or pipe the key into bulkit auth login --with-key. Without a terminal the CLI never prompts: anything that would ask for confirmation fails until you pass --yes. Exit codes tell your pipeline what went wrong.
Yes. A test key (bk_test_…) validates every request like a live key but never publishes and is never billed. With a live key, the CLI asks before anything public or destructive, and posts create --dry-run prints the request body without sending it.
bulkit posts list --status failed finds it, and bulkit posts publish <id> retries it: channels that already published are skipped. In scripts, pass the same --idempotency-key when you retry a create and the API won't make a duplicate.
Not yet. Publishing is asynchronous: --now and posts publish return once the post is queued. Add --wait to block until every channel has finished; the command exits 1 if any channel failed.
No. CLI calls are billed like any other action, included in your 500 monthly actions, then $0.01 each. The package itself is MIT-licensed.
$4.99/mo, 500 actions included. The CLI is free on every plan.