Install
You need Node.js 20 or newer. Then run:
npm install -g https://postozo.com/downloads/postozo-cli.tgz
The package is postozo-cli 0.1.0 (6 KB, no dependencies). It adds the postozo command. Check it with postozo version. To update, run the install command again. To remove it: npm uninstall -g postozo-cli. If npm says you have no permission, use a Node version manager, or set an npm prefix in your home folder.
Sign in
postozo auth:login
The CLI shows a link and a code like GRGG-WWDV, and opens the link in your browser. Sign in to Postozo if needed, check that the code matches and press Allow. The CLI waits (it checks every 3 seconds, for up to 10 minutes) and then saves a pz_cli_ token. The token acts as you, with your role in the workspace you were signed in to. It shows in Settings, Approved Apps as "Command line", where you can revoke it.
On a server with no browser, add --no-browser and open the link on another device. For your own server: postozo auth:login --url https://your-server.
Environment variables
| Variable | What it does |
|---|---|
POSTOZO_API_KEY | Use this key (or token) instead of the saved sign-in. Best for CI: store the workspace key as a secret. |
POSTOZO_API_URL | The server address. Default https://app.postozo.com. Also used by auth:login when --url is not given. |
POSTOZO_HOME | Folder for credentials.json. Default ~/.postozo. |
export POSTOZO_API_KEY=pz_live_YOUR_KEY
postozo posts:create -c "Release 2.4 is out" -i CHANNEL_ID -t now
Commands
| Command | Options | What it does |
|---|---|---|
postozo auth:login | [--url <server>] [--no-browser] | Sign in with your browser (device code). Saves a CLI token in ~/.postozo/credentials.json (file mode 600). Default server: https://app.postozo.com. --no-browser prints the link without opening it. |
postozo auth:status | Shows the server, the start of the token and how many channels are connected. | |
postozo auth:logout | Deletes the saved sign-in. The token stays valid until you revoke it in Settings, Approved Apps. | |
postozo integrations:list | [--group <customerId>] | Your channels: id, network, name, profile and status (ok, reconnect or disabled). |
postozo integrations:groups | Your customers. | |
postozo integrations:settings | <channelId> | Rules, limit and settings of the channel's network. |
postozo integrations:trigger | <channelId> <method> -d '<json>' | Runs a network helper tool, for example a list of Pinterest boards. |
postozo posts:create | -c "text" [-c "comment"] -i <id,id> -s <date> [-t schedule|draft|now] [-m <file or URL,...>] [-d <minutes>] [--settings '<json>'] [--shortLink] or -j <post.json> | Creates a post. Repeat -c for follow-up comments. -m adds media to the -c at the same position (files are uploaded, URLs imported). -d is the wait between items. -j sends a whole POST /posts body from a file. Default type: schedule, which needs -s. |
postozo posts:list | [--startDate <ISO>] [--endDate <ISO>] [--customer <id>] | Posts between 2 dates (default: 30 days back to 30 days ahead), 1 row per channel. |
postozo posts:get | <id> | The whole post as JSON. |
postozo posts:delete | <id> | Deletes the post on every channel. |
postozo posts:retry | <id> | Retries channels that failed or could not be confirmed. |
postozo posts:status | <id> -s draft|schedule | Switches the post between draft and scheduled. |
postozo posts:settings | <id> --settings '<json>' | Merges network settings into 1 channel's post. |
postozo posts:missing | <id> | Asks the network for a post that may have gone live. |
postozo posts:connect | <id> --release-id <id> [--release-url <url>] | Links a live post you found yourself and marks it published. |
postozo analytics:platform | <channelId> [--days 7|30|90] | Statistics of a channel. |
postozo analytics:post | <postId> | Statistics of 1 published post. |
postozo upload | <file or URL> | Uploads a file, or imports it from a URL. Prints the media as JSON, with its id and path. |
postozo mcp | Runs a local MCP server on standard input and output for apps like Claude Desktop. | |
postozo version | Prints the CLI version. --version works too. |
Examples
postozo auth:login
postozo auth:status
postozo auth:logout
postozo integrations:list
postozo integrations:groups
postozo integrations:settings de53f029-255d-4104-b090-974efcca2c86
postozo integrations:trigger PINTEREST_CHANNEL_ID boards -d '{}'
postozo posts:create -c "Our autumn menu is here" -c "Book a table" -i de53f029-255d-4104-b090-974efcca2c86 -s 2026-10-01T09:30:00+05:30 -d 5
postozo posts:list --startDate 2026-10-01T00:00:00Z
postozo posts:get 98c49d36-7dfd-439b-a857-e9a8e7e3f4a2
postozo posts:delete 98c49d36-7dfd-439b-a857-e9a8e7e3f4a2
postozo posts:retry 98c49d36-7dfd-439b-a857-e9a8e7e3f4a2
postozo posts:status 98c49d36-7dfd-439b-a857-e9a8e7e3f4a2 -s draft
postozo posts:settings 5001b946-c142-4ab7-b376-188c71272521 --settings '{"title":"My video"}'
postozo posts:missing 5001b946-c142-4ab7-b376-188c71272521
postozo posts:connect 5001b946-c142-4ab7-b376-188c71272521 --release-id 1839267162345
postozo analytics:platform de53f029-255d-4104-b090-974efcca2c86 --days 30
postozo analytics:post 5001b946-c142-4ab7-b376-188c71272521
postozo upload ./photo.jpg
postozo mcp
postozo version
A post with a picture on 2 channels, published now, with a first comment 2 minutes later:
postozo posts:create -c "New opening hours from Monday" -m ./hours.jpg -c "Questions? Reply here." \
-i de53f029-255d-4104-b090-974efcca2c86,f451da5e-2cd3-4674-bbbb-dc6bc5e12b55 -t now -d 2
A whole body from a file (the same body as POST /posts):
postozo posts:create -j post.json
Network settings for every channel, or per channel id:
postozo posts:create -c "Watch our new video" -m ./video.mp4 -i YOUTUBE_CHANNEL_ID -t now \
--settings '{"title":"Autumn menu","visibility":"Public"}'
JSON output
Lists print as a table. Add --json at the end of any command to get the raw JSON answer of the API, for scripts and jq:
postozo integrations:list --json | jq -r '.[] | select(.identifier=="linkedin-page") | .id'
Put --json last: an option followed by a word takes that word as its value.
Exit codes
| Code | Meaning |
|---|---|
| 0 | Done. |
| 1 | Something failed. The message is on standard error and starts with "Error:". Examples: not signed in, the server could not be reached, the API answered with an error (its message and every rule problem are printed), a missing option, or an unknown command. |
$ postozo posts:create -c "x" -i CHANNEL_ID
Error: Add a date with -s 2026-10-01T09:30:00Z, or use -t now or -t draft
$ echo $?
1
postozo mcp for Claude Desktop
postozo mcp runs a local MCP server over standard input and output. It passes every message to https://app.postozo.com/mcp with your sign-in, so the AI gets the same tools and 2 prompts as the remote server. Sign in first with postozo auth:login, then add this to Claude Desktop's claude_desktop_config.json:
{
"mcpServers": {
"postozo": {
"command": "postozo",
"args": [
"mcp"
]
}
}
}
Or use a key instead of the sign-in:
{
"mcpServers": {
"postozo": {
"command": "postozo",
"args": [
"mcp"
],
"env": {
"POSTOZO_API_KEY": "pz_live_YOUR_KEY"
}
}
}
}
If the app cannot find postozo, give the full path that which postozo prints. Claude Desktop also supports the remote server directly; see the Claude guide.
In CI
# GitHub Actions step
- run: npm install -g https://postozo.com/downloads/postozo-cli.tgz
- run: postozo posts:create -c "Version ${{ github.ref_name }} is out" -i ${{ vars.POSTOZO_CHANNEL }} -t now
env:
POSTOZO_API_KEY: ${{ secrets.POSTOZO_API_KEY }}
Use -t draft or -t review when a person should check the post first. The API guide explains limits and errors.
Questions
Do I need the server code to use the CLI?
No. The package has 1 file and no dependencies. Install it with npm from https://postozo.com/downloads/postozo-cli.tgz. It needs Node.js 20 or newer.
Is it on the npm registry?
Not yet. Install it from our address with npm install -g and the full URL. Run the same command again to update.
Can I use it with a self-hosted server?
Yes. Sign in with postozo auth:login --url https://your-server, or set POSTOZO_API_URL.
Where is my sign-in saved?
In ~/.postozo/credentials.json, readable only by you. Set POSTOZO_HOME to use another folder.
Does postozo mcp need a separate key?
No. It uses your CLI sign-in, or POSTOZO_API_KEY when it is set.
Get your API key
Start a 7-day free trial. The API, MCP server, webhooks and CLI are in every plan.
Create your free account