Skip to content
bash
socifyr post [text] [options]

The single workhorse command. Text comes from a positional argument, --file, or stdin; media from --media (local files) or --media-id (library IDs / URLs).

Options

FlagDescription
-t, --to <slugs>Required. Comma-separated connection slugs
-f, --file <path>Read caption from a text file
-m, --media <paths>Comma-separated local file paths
--media-id <refs>Comma-separated media library IDs or public URLs
--format <format>Override content format (see below)
-a, --at <iso>Schedule for a future ISO-8601 datetime
--aiUse AI to generate platform-specific captions
-w, --waitBlock until terminal state; print per-platform results
--draftSave as draft instead of publishing
--jsonOutput as JSON

Valid --format values: text_post, photo_single, photo_carousel, short_video, feed_video, story, document_post.

Text-only

bash
socifyr post "Just shipped v2.0 🚀" --to linkedin-myhandle,x-myhandle

From a file:

bash
socifyr post --file CHANGELOG.md --to linkedin-myhandle

From stdin:

bash
echo "Pipeline broke 😅" | socifyr post --to x-myhandle
cat release-notes.md | socifyr post --to linkedin-myhandle

Photo

bash
socifyr post "New product reveal" --media banner.jpg --to instagram-mybrand

Carousel — pass multiple comma-separated paths:

bash
socifyr post "Photo dump" \
  --media a.jpg,b.jpg,c.jpg,d.jpg \
  --to instagram-mybrand

Video

bash
socifyr post "Demo of v2.0" \
  --media demo.mp4 \
  --to youtube-mychannel,instagram-mybrand

As a Reel / Short:

bash
socifyr post "Quick demo" \
  --media demo.mp4 \
  --format short_video \
  --to instagram-mybrand,tiktok-me

Reusing media

Skip the upload by referencing existing library IDs (24-char hex) or public URLs:

bash
socifyr post "Same banner, new caption" \
  --media-id 6a04f715d3d7d93575e65d13 \
  --to linkedin-myhandle

socifyr post "From a CDN" \
  --media-id https://cdn.example.com/banner.png \
  --to instagram-mybrand

You can mix local files and IDs/URLs in the same call.

Scheduling

bash
socifyr post "Deploy at 9am tomorrow" \
  --to linkedin-myhandle \
  --at "2026-06-01T09:00:00Z"

Times must be ISO-8601. UTC by default; include an offset like -04:00 to use a different timezone.

Drafts

bash
socifyr post "Polish this later" \
  --media banner.jpg \
  --to instagram-mybrand \
  --draft
# ✓ Draft saved
#   ID: 6a05032a84584482ace13d5f

# Publish it later
socifyr publish 6a05032a84584482ace13d5f

AI captions

bash
socifyr post "" --media banner.jpg --to instagram-mybrand,x-myhandle --ai

The CLI calls /ai/generate-content with platforms derived from your connections.

Waiting for results

bash
socifyr post "Test cross-post" \
  --to instagram-mybrand,x-myhandle \
  --wait

# ⟳ publishing
#
#   ✓  instagram  → https://instagram.com/p/...
#   ✗  x: rate limit exceeded

Output

By default the CLI prints a short summary:

✓ Post submitted
  ID: 6a05033584584482ace13d72
  Check status: socifyr status 6a05033584584482ace13d72

--json returns the raw API response — useful for scripting:

bash
ID=$(socifyr post "Hello" --to x-myhandle --json | jq -r '.uploadId')
socifyr status "$ID" --wait