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 (PROCESSING → PUBLISHED / 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​