The nadia CLI
nadia is the Public API on the command line.
Schedule a post, drop an idea on the content board, read a channel’s numbers,
answer a comment or a DM — from your terminal, a cron job or an agent, without
writing a curl.
Installation
Section titled “Installation”npm install -g @usenadia/clinadia --helpThe published package has no runtime dependency: the SDK it calls is bundled in.
Two layers
Section titled “Two layers”- One command per API operation, generated from the API’s spec.
nadia list-channels,nadia create-post,nadia move-content… 77 of them, named after the operation. An endpoint added to the API is a command on the next release; nothing is written by hand. - Shortcuts on top, short and friendly:
nadia channels,nadia post,nadia move k1 to-shoot. Each one is a shortcut for a generated command (or a few calls chained), so every flag of the underlying command works on it too.
nadia --help # both lists, generated commands grouped by domainnadia <command> --help # flags and examples of one commandnadia schema <command> # what a command takes, as JSON (for agents)Quick start
Section titled “Quick start”# 1. Save your API key (Settings → Developers)nadia auth login
# 2. Your connected channels, and their idsnadia channels
# 3. Schedule a Reel — the local video is uploaded firstnadia post -i "$IG" -s 2026-10-02T09:00:00+02:00 \ -c "Three places in Malta" -m ./reel.mp4 \ --settings '{"post_type":"post"}'
# 4. What is coming upnadia postsShortcuts
Section titled “Shortcuts”| Shortcut | Does | Generated command |
|---|---|---|
nadia channels |
Your connected channels — their ids are what everything else takes | list-channels |
nadia post |
Schedule, publish now or draft a post; local media are uploaded first | upload-file + create-post |
nadia posts |
Your posts, a week back and four weeks ahead unless --from/--to |
list-posts |
nadia upload <file|url> |
Put a file or a URL in the media library | upload-file / upload-from-url |
nadia stats <channel> |
A channel’s metrics over the last days (--days, default 7) |
get-channel-analytics |
nadia cards |
The cards of the content board, optionally one column (--stage) |
list-contents |
nadia card <id> |
One card | get-content |
nadia idea <title> |
Drop an idea on the board (a card in IDEA) |
create-content |
nadia move <id> <stage> |
Move a card to another column | move-content |
nadia link <id> <post-group> |
Tie a card to its scheduled post | link-content-post |
nadia reply <comment-id> <message> |
Reply publicly to a comment | reply-to-comment |
nadia dm <channel> <recipient> <text> |
Send a direct message | send-direct-message |
nadia inbox <channel> |
A channel’s DM conversations | list-conversations |
nadia auth login|status|logout |
Save, check or remove your key | — |
Generated commands
Section titled “Generated commands”How a spec operation becomes a command:
| In the API | On the command line |
|---|---|
operation moveContent |
nadia move-content |
path parameters (/contents/{id}/move) |
positional arguments, in path order: nadia move-content <id> |
| query parameters | flags: --start-date 2026-10-01 |
| top-level fields of the JSON body | flags too: integrationIds → --integration-ids |
| the whole body | --body '{…}', --body @file.json or --body @- (stdin); flags are applied on top |
Values are checked against the spec before anything is sent:
- enum: case-insensitive,
to-shoot→TO_SHOOT; - array: comma-separated and/or repeated flag,
--keywords LIEN,GUIDE; - boolean:
--fuzzy,--no-fuzzy,--fuzzy false; - number: parsed, integers checked;
- nullable: the literal
nullclears the field,--hook null; - string:
@pathreads the file when it exists,--script @script.md; - file: a local path, uploaded,
nadia upload-file --file ./reel.mp4.
The domains nadia --help groups them by are the first segment of each
endpoint’s path: posts, integrations, analytics, contents (the
board), automation-flows and automation-flow-poses (the comment → DM
automations), inbox (the comments and the direct messages), webhooks,
hooks, music, and other for the endpoints that stand alone (the
uploads, find-slot, list-groups, list-notifications, the video
generation, get-channel-settings, run-channel-tool and the collected
analytics history).
A few groups you may not expect, since nothing in the app’s menus announces
them: webhooks (create-webhook, list-webhook-events…),
list-notifications (the bell of the app), the video generation
(generate-video, call-video-function) and, under inbox, the moderation
of comments (hide-comment, delete-comment).
Hooks and music
Section titled “Hooks and music”Contract for scripts
Section titled “Contract for scripts”- stdout is JSON and nothing else — pipe it into
jq. Messages go to stderr. - Exit codes:
0done,1the API refused (or never answered),2bad usage — nothing was sent. - 429 and 5xx answers are retried twice before giving up.
--dry-run, after the command name, prints the request instead of sending it, and needs no key:
nadia move --dry-run k1 to-shoot