CLI
The inklate command line — create, schedule, validate, and measure from the terminal, plus a local stdio MCP server via `inklate mcp`.
The inklate CLI is a thin client over the same guarded REST API the dashboard and MCP server use — no CLI-only behavior, no weaker validation. Terminal to published post in under a minute:
npm i -g inklate
inklate auth login # device flow: approve a short code in the browser
inklate channels connect x # OAuth consent in the browser, destinations in the terminal
inklate posts create --text "hello" --channels x --scheduled-at now
inklate posts publish <post-id> --waitOutput contract
- stdout carries the result as structured YAML — pass
--jsonfor JSON. Nothing else is ever written to stdout. - stderr carries progress, prompts, and errors for humans.
--quietsilences progress.
| Code | Name | Meaning |
|---|---|---|
0 | ok | The command succeeded. |
1 | unexpected | An unhandled or transport-level failure — retry or report it. |
2 | usage | Bad or missing arguments. Nothing was sent. |
3 | auth | No stored credential, or it was rejected. Run inklate auth login. |
4 | refusal | The platform refused on purpose — plan limit, permission, or a preflight verdict. The machine-readable refusal is on stdout. |
5 | not found | The addressed resource does not exist. |
6 | conflict | The resource changed underneath you, or its state forbids the action. |
7 | rate limited | The organization’s request budget is exhausted after the client already waited out Retry-After. Safe to re-run later — the message names the wait. |
A typed refusal (4) is not a crash: the machine-readable refusal — per-channel errors with fixes, plan-limit codes — is on stdout for the caller to act on.
Global flags
Accepted by every command:
| Flag | Description |
|---|---|
--org <value> | Organization slug to act in |
--profile <value> | Named credentials profile (default: default) |
--json | JSON output instead of YAML |
--quiet | Suppress progress output on stderr |
--yes | Skip confirmation prompts |
--no-input | Never prompt (fail instead) |
--base-url <value> | Override the API base URL |
Credentials
inklate auth login runs a device flow: it prints a short code, opens the browser to approve it, and stores an organization API key (prefix inklate_) in ~/.config/inklate/config.json (mode 0600). In CI, skip the browser entirely: set INKLATE_API_KEY, or paste a key with inklate auth set. Keys are the same ones listed under Settings → API keys — revoke there anytime.
Scheduling times
Scheduling flags accept ISO-8601 with an offset (2026-07-21T09:00:00-07:00) or a relative shorthand anchored to the server clock: 30m, 2h, 3d, 1w. Naive local times are rejected with a corrective error.
Interactivity
In a terminal, missing arguments prompt (channel pickers come from your real channel list) and destructive commands confirm. In scripts, agents, and CI — no TTY, CI set, or --no-input — the CLI never prompts: it fails with the exact flag named, and destructive commands require --yes.
inklate mcp
Runs the same binary as a local stdio MCP server bridged to your organization: every remote tool appears unchanged, and files_upload additionally accepts local file paths (the bridge uploads the bytes and returns file ids). Point Claude Code, Cursor, or any stdio MCP client at:
{ "command": "inklate", "args": ["mcp"] }Escape hatch
Any REST endpoint is callable before it has a dedicated command:
inklate api GET /posts
inklate api POST /posts --field content=hello --field 'channel_ids=["<channel-id>"]'Commands
auth — Log in and manage stored credentials
| Command | Description |
|---|---|
inklate auth login | Log in via the browser (device flow) and store an organization API key |
inklate auth set | Store an organization API key (paste flow — works everywhere, incl. CI) |
inklate auth check | Verify the stored credentials and show reachable organizations |
inklate auth logout | Remove the stored credentials for this profile |
organizations — Organizations you can act in
| Command | Description |
|---|---|
inklate organizations list | List organizations you can act in |
channels — Connected social channels, their metrics, and growth
| Command | Description |
|---|---|
inklate channels list | List publishable channels + connection health |
inklate channels creator-policy | What a channel’s creator account currently allows (TikTok) |
inklate channels connect | Connect a channel: browser OAuth consent, then destination picking |
inklate channels disconnect | Disconnect a channel (its scheduled placements stop publishing) |
inklate channels metrics | Aggregated per-day engagement for one channel |
inklate channels growth | Followers trajectory + per-day page flows for one channel |
capabilities — Per-channel capabilities + provider manifests
| Command | Description |
|---|---|
inklate capabilities | Per-channel effective capabilities + provider manifests |
posts — Create, validate, schedule, publish, and measure posts
| Command | Description |
|---|---|
inklate posts create | Create a post — draft, scheduled, or published now, in one call |
inklate posts list | List posts with their per-channel status |
inklate posts get | The post, its per-channel validation, and live publish results |
inklate posts update | Change anything — content, channels, media, labels, campaign, or the schedule |
inklate posts validate | Dry-run validation — exit 4 when the post is not ready, nothing stored |
inklate posts delete | Delete a post (—takedown also removes it from the platforms) |
inklate posts publish | Publish an existing draft now (—wait polls to a terminal state) |
inklate posts metrics | Per-channel totals + snapshot time series for one post |
files — Upload and manage the files a post attaches
| Command | Description |
|---|---|
inklate files upload | Upload local files (presign → PUT → poll) and print reusable file ids |
inklate files get | Get a file (readiness, facts, variants; optionally a signed URL) |
inklate files list | List files (keyset-paginated, newest first) |
inklate files delete | Delete a file (refused while attached to a post) |
search — Full-text search over your content
| Command | Description |
|---|---|
inklate search | Full-text search over your own content |
interactions — Ingested comments and mentions
| Command | Description |
|---|---|
inklate interactions list | Ingested comments and mentions across channels |
inklate interactions reply | Reply to an ingested comment or mention (1 Ink) |
webhooks — Webhook endpoints and deliveries
| Command | Description |
|---|---|
inklate webhooks list | List webhook endpoints |
inklate webhooks create | Register a webhook endpoint (the signing secret is shown once) |
inklate webhooks delete | Delete a webhook endpoint |
inklate webhooks rotate-secret | Rotate a webhook signing secret (the old secret stops verifying) |
inklate webhooks deliveries | Recent deliveries for a webhook endpoint |
campaigns — Campaign grouping and rollups
| Command | Description |
|---|---|
inklate campaigns list | List campaigns |
inklate campaigns create | Create a campaign |
inklate campaigns metrics | Roll up a campaign’s engagement |
approvals — Approval rules, requests, and decisions
| Command | Description |
|---|---|
inklate approvals rule | Show the organization’s approval rule |
inklate approvals set-rule | Set the organization’s approval rule |
inklate approvals requests | List approval requests |
inklate approvals request | Submit a post for approval |
inklate approvals decide | Approve or reject an approval request |
audit-logs — The organization’s audit trail
| Command | Description |
|---|---|
inklate audit-logs list | Read the audit trail (admin) |
api — Call any REST endpoint directly
| Command | Description |
|---|---|
inklate api | Call any REST endpoint directly (escape hatch) |
mcp — Run a local stdio MCP server bridged to your organization
| Command | Description |
|---|---|
inklate mcp | Run a local stdio MCP server bridged to the remote Inklate MCP |
completions — Shell completion scripts
| Command | Description |
|---|---|
inklate completions | Print a shell completion script (bash, zsh, or fish) |