Skip to content

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.

Terminal window
npm install -g @usenadia/cli
nadia --help

The published package has no runtime dependency: the SDK it calls is bundled in.

  • 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.
Terminal window
nadia --help # both lists, generated commands grouped by domain
nadia <command> --help # flags and examples of one command
nadia schema <command> # what a command takes, as JSON (for agents)
Terminal window
# 1. Save your API key (Settings → Developers)
nadia auth login
# 2. Your connected channels, and their ids
nadia channels
# 3. Schedule a Reel — the local video is uploaded first
nadia 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 up
nadia posts
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 —

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 null clears the field, --hook null;
  • string: @path reads 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).

  • stdout is JSON and nothing else — pipe it into jq. Messages go to stderr.
  • Exit codes: 0 done, 1 the API refused (or never answered), 2 bad 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:
Terminal window
nadia move --dry-run k1 to-shoot