Skip to main content

Posts

Create, schedule, publish, queue, submit for approval, update, retry, and delete posts from the CLI. Channel IDs come from accounts:list.

Create a post

# Schedule once (default -t schedule)
verlynk posts:create -c "Hello from Verlynk!" -i "<channel-id>" -d "2026-07-15T09:00:00.000Z"

# Draft
verlynk posts:create -c "Draft content" -i "<channel-id>" -d "2026-07-15T09:00:00.000Z" -t draft

# Publish now
verlynk posts:create -c "We're live!" -i "<channel-id>" -t publish

# Multi-channel
verlynk posts:create -c "Launch day!" -i "id1,id2" -d "2026-07-20T14:00:00.000Z"

# Full Public API payload (queue, recurring, approval, …)
verlynk posts:create --json ./post.json

# With a local image
verlynk posts:create --media-file ./photo.png -c "Caption" -i "<channel-id>" -d "2026-07-15T09:00:00.000Z"

:::tip Action × schedule pairing When using --json / the Public API, pair correctly:

actionschedule.type
PUBLISHNOW
SCHEDULEONCE or RECURRING_*
QUEUEQUEUE
DRAFTDRAFT

SCHEDULE + NOW is rejected with 400. Use -t publish (or PUBLISH + NOW) for immediate publish. :::

posts:create options

FlagDescription
-c, --contentPost text / caption
-i, --accountsComma-separated channel IDs from accounts:list
-d, --dateSchedule datetime in ISO 8601 (required for schedule / draft)
-t, --typeschedule (default), draft, or publish
--timezoneIANA timezone (default UTC)
--post-typepost, reel, story, video, thread, pin, offer, event
--settingsPlatform-specific settings as a JSON string
-j, --jsonPath to a full post payload JSON file
--media-fileComma-separated local file paths to upload and attach
--media-idComma-separated mediaIds from media:upload (already completed)
--content-typeMIME type when using --media-file or --media-id (e.g. image/png)
--profile-idOverride profile for this command

CLI flags vs --json

CLI -tPublic API actionschedule.type
schedule (default)SCHEDULEONCE
draftDRAFTDRAFT
publishPUBLISHNOW

Queue, recurring schedules, and NEEDS_APPROVAL require --json with the Public API body shape. See the API Reference and the agent examples.

Actions and schedules

Pair action with the matching schedule.type. The API does not always reject mismatches — wrong pairs can return HTTP 202 with zero posts.

actionWorking schedule.typeResult
DRAFTDRAFT onlyDraft (not listed by MCP get-posts)
PUBLISHPrefer NOWPublishes immediately (PROCESSINGPUBLISHED / FAILED). Other schedule types are ignored.
SCHEDULEONCE, RECURRING_WEEKLY, RECURRING_MONTHLY, RECURRING_CUSTOMSCHEDULED
QUEUEQUEUE + queueType NEXT | LASTQUEUED (channel queue must be enabled)
NEEDS_APPROVALONCE, QUEUE, RECURRING_*NEEDS_APPROVAL — top-level workflowId required

:::danger Soft pairing action: SCHEDULE with NOW, QUEUE, or DRAFT can accept the request and create no posts. Always verify with posts:list (or MCP get-posts). Prefer PUBLISH + NOW for immediate publish. :::

Schedule details shapes

schedule.typedetails
NOW{ "timezone": "UTC" }
ONCE / DRAFT{ "timezone", "utc" } — future ISO UTC, ≤ 12 months
QUEUE{ "timezone", "queueType": "NEXT" | "LAST" }
RECURRING_WEEKLY{ "daysOfWeek": ["Monday", …], "timezone", "utcStartDate", "utcEndDate" } — span ≤ 3 months
RECURRING_MONTHLY{ "dayOfMonth": 1–31, "timezone", "utcStartDate", "utcEndDate" } — span ≤ 12 months
RECURRING_CUSTOM{ "timezone", "utc": ["…"] } — 1–25 future dates

Queue example

verlynk posts:create --json ./create-queue-post.json
{
"action": "QUEUE",
"posts": [
{
"channelId": "<channel-id>",
"postType": "post",
"metaData": {
"contents": [{ "title": "", "text": "Queued post", "media": [] }]
},
"schedule": {
"type": "QUEUE",
"details": { "timezone": "UTC", "queueType": "NEXT" }
}
}
]
}

Recurring example (weekly)

{
"action": "SCHEDULE",
"posts": [
{
"channelId": "<channel-id>",
"postType": "post",
"metaData": {
"contents": [{ "title": "", "text": "Weekly update", "media": [] }]
},
"schedule": {
"type": "RECURRING_WEEKLY",
"details": {
"timezone": "Asia/Kolkata",
"daysOfWeek": ["Monday", "Wednesday"],
"utcStartDate": "2026-07-20T03:30:00.000Z",
"utcEndDate": "2026-09-20T03:30:00.000Z"
}
}
}
]
}

Needs approval

{
"action": "NEEDS_APPROVAL",
"workflowId": "<workflow-uuid>",
"posts": [
{
"channelId": "<channel-id>",
"postType": "post",
"metaData": {
"contents": [{ "title": "", "text": "Please review", "media": [] }]
},
"schedule": {
"type": "ONCE",
"details": { "timezone": "UTC", "utc": "2026-07-25T14:00:00.000Z" }
}
}
]
}
note

MCP create-posts accepts NEEDS_APPROVAL as an action but cannot send workflowId. Use the CLI / Public API for approval workflows.

List posts

Date range is required (max 40 days). Filters use publishAt, not createdAt.

verlynk posts:list --from 2026-07-01 --to 2026-07-31
verlynk posts:list --from 2026-07-01 --to 2026-07-31 --status SCHEDULED
verlynk posts:list --from 2026-07-01 --to 2026-07-31 --platform linkedin --json
FlagDescription
--fromStart date (required)
--toEnd date (required)
--statusFilter by status
--platformFilter by platform
--profile-idOverride profile
--channel-idFilter by channel
--jsonOutput raw JSON

Get a post

verlynk posts:get <post-id>
verlynk posts:get <post-id> --profile-id <profile-uuid> --json

Update a post

verlynk posts:update <post-id> -c "Updated text" -i "<channel-id>" -d "2026-07-16T09:00:00.000Z"
verlynk posts:update <post-id> --json ./update-scheduled-post.json

When not using --json, -i / --accounts accepts a single channel ID.

--json body uses singular post (not posts[]):

{
"action": "SCHEDULE",
"post": {
"channelId": "<channel-id>",
"postType": "post",
"metaData": {
"contents": [{ "title": "", "text": "Updated caption", "media": [] }]
},
"schedule": {
"type": "ONCE",
"details": { "timezone": "UTC", "utc": "2026-07-20T09:00:00.000Z" }
}
}
}

Which statuses can you edit?

StatusEditable?Notes
SCHEDULED / QUEUED / NEEDS_APPROVALYesContent + reschedule. Actions: SCHEDULE, QUEUE, PUBLISH, NEEDS_APPROVAL. Schedule: NOW, ONCE, QUEUE. RECURRING_* only if current status is NEEDS_APPROVAL.
PUBLISHEDLimitedNo reschedule — text/content update on Facebook (post type), LinkedIn, YouTube (title+text), Mastodon only. Other platforms → INVALID_PLATFORM.
FAILEDNoUse posts:retry
PROCESSINGNoWait until finished

action: DRAFT on post update is rejected — use Drafts.

Retry a post

Only posts with postStatus: FAILED can be retried. Returns 202 then retries asynchronously.

verlynk posts:retry <post-id>
verlynk posts:retry <post-id> --profile-id <profile-uuid>

Delete a post

Hard delete (no soft delete / force flag). Requires --yes / -y.

verlynk posts:delete <post-id> --yes
StatusBehavior
SCHEDULEDCancels the scheduled publish and removes the post
QUEUEDRemoves the post from the channel queue
PUBLISHEDRemoves from Verlynk and, when supported, from the platform: Facebook, LinkedIn, X, YouTube, Pinterest, Bluesky, Mastodon, Threads. Not Instagram, TikTok, or Google Business
FAILED / NEEDS_APPROVALRemoves the post from Verlynk
PROCESSINGRejected

Media upload

Upload local files with the CLI, then attach them to posts. Requires a Public API key with posts:write.

verlynk media:upload ./photo.png --json

verlynk posts:create --media-file ./photo.png \
-c "Caption" -i "<channel-id>" -d "2026-07-15T09:00:00.000Z"

verlynk posts:create --media-id "<uuid>" --content-type image/png \
-c "Caption" -i "<channel-id>" -d "2026-07-15T09:00:00.000Z"

Media shape in --json payloads

CLI / Public API posts use mediaId, not MCP fields:

{
"mediaId": "<from media:upload>",
"fileType": "image",
"contentType": "image/png"
}
warning

Do not put MCP-only fields (mediaUrl / mimeType) in CLI --json. Those are for MCP create-posts only.

Limitations

LimitDetail
Free / no planSchedule types NOW, ONCE, DRAFT only. Queue and recurring require a paid plan.
Scheduled post cap10 / channel (free or paid trial), 300 / channel (paid after trial)
List rangefrom/to required, max 40 days, filters on publishAt
Soft SCHEDULE pairingWrong type can yield 202 with 0 posts — always verify
Processing lockCannot edit or delete PROCESSING posts
No soft deleteDeletes are permanent
MCPCreate/list only — no update/delete/retry/draft tools; no workflowId for approval

Next steps