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:
action | schedule.type |
|---|---|
PUBLISH | NOW |
SCHEDULE | ONCE or RECURRING_* |
QUEUE | QUEUE |
DRAFT | DRAFT |
SCHEDULE + NOW is rejected with 400. Use -t publish (or PUBLISH + NOW) for immediate publish.
:::
posts:create options
| Flag | Description |
|---|---|
-c, --content | Post text / caption |
-i, --accounts | Comma-separated channel IDs from accounts:list |
-d, --date | Schedule datetime in ISO 8601 (required for schedule / draft) |
-t, --type | schedule (default), draft, or publish |
--timezone | IANA timezone (default UTC) |
--post-type | post, reel, story, video, thread, pin, offer, event |
--settings | Platform-specific settings as a JSON string |
-j, --json | Path to a full post payload JSON file |
--media-file | Comma-separated local file paths to upload and attach |
--media-id | Comma-separated mediaIds from media:upload (already completed) |
--content-type | MIME type when using --media-file or --media-id (e.g. image/png) |
--profile-id | Override profile for this command |
CLI flags vs --json
CLI -t | Public API action | schedule.type |
|---|---|---|
schedule (default) | SCHEDULE | ONCE |
draft | DRAFT | DRAFT |
publish | PUBLISH | NOW |
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.
action | Working schedule.type | Result |
|---|---|---|
DRAFT | DRAFT only | Draft (not listed by MCP get-posts) |
PUBLISH | Prefer NOW | Publishes immediately (PROCESSING → PUBLISHED / FAILED). Other schedule types are ignored. |
SCHEDULE | ONCE, RECURRING_WEEKLY, RECURRING_MONTHLY, RECURRING_CUSTOM | SCHEDULED |
QUEUE | QUEUE + queueType NEXT | LAST | QUEUED (channel queue must be enabled) |
NEEDS_APPROVAL | ONCE, 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.type | details |
|---|---|
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" }
}
}
]
}
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
| Flag | Description |
|---|---|
--from | Start date (required) |
--to | End date (required) |
--status | Filter by status |
--platform | Filter by platform |
--profile-id | Override profile |
--channel-id | Filter by channel |
--json | Output 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?
| Status | Editable? | Notes |
|---|---|---|
SCHEDULED / QUEUED / NEEDS_APPROVAL | Yes | Content + reschedule. Actions: SCHEDULE, QUEUE, PUBLISH, NEEDS_APPROVAL. Schedule: NOW, ONCE, QUEUE. RECURRING_* only if current status is NEEDS_APPROVAL. |
PUBLISHED | Limited | No reschedule — text/content update on Facebook (post type), LinkedIn, YouTube (title+text), Mastodon only. Other platforms → INVALID_PLATFORM. |
FAILED | No | Use posts:retry |
PROCESSING | No | Wait 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
| Status | Behavior |
|---|---|
SCHEDULED | Cancels the scheduled publish and removes the post |
QUEUED | Removes the post from the channel queue |
PUBLISHED | Removes from Verlynk and, when supported, from the platform: Facebook, LinkedIn, X, YouTube, Pinterest, Bluesky, Mastodon, Threads. Not Instagram, TikTok, or Google Business |
FAILED / NEEDS_APPROVAL | Removes the post from Verlynk |
PROCESSING | Rejected |
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"
}
Do not put MCP-only fields (mediaUrl / mimeType) in CLI --json. Those are for MCP create-posts only.
Limitations
| Limit | Detail |
|---|---|
| Free / no plan | Schedule types NOW, ONCE, DRAFT only. Queue and recurring require a paid plan. |
| Scheduled post cap | 10 / channel (free or paid trial), 300 / channel (paid after trial) |
| List range | from/to required, max 40 days, filters on publishAt |
Soft SCHEDULE pairing | Wrong type can yield 202 with 0 posts — always verify |
| Processing lock | Cannot edit or delete PROCESSING posts |
| No soft delete | Deletes are permanent |
| MCP | Create/list only — no update/delete/retry/draft tools; no workflowId for approval |
Next steps
- Drafts — List, update, and promote draft posts
- Validate and usage — Check caption limits before publishing
- API Reference — Full Public API schemas