staqlydocs
MCP

Tools reference

Look up each of the 100 MCP tools, its inputs and the scope it needs in cloud mode.

Edit on GitHub

These are the tools an agent sees once staqly is connected over MCP. You rarely call them by hand (the agent picks them from your request), but this page tells you what each one can do, which inputs it takes, and which scope an API key needs for it in cloud mode.

Example: draft, preview, schedule

The most common sequence, with the arguments an agent sends:

Find the channels: list_channels

No inputs. Returns every connected account with its id, provider, name and status.

Write the post: create_post

{ "collection": "Product updates", "content": "v1.4 is out: schedules, channels and a calendar.", "targets": [{ "channel_id": "ch_7h2kq9xw3nbvd5yhzm6a" }, { "channel_id": "ch_q2w8n5k7r3t9y4u6i1o0", "content": "v1.4 is out." }] }

The post is created as draft, with a shorter text of its own on the second channel.

Check it: preview_post

{ "post_id": "post_oalirbz67y4m4cqxq5dw" }

Returns the text each channel will carry and what its provider objects to (too long, media missing). Fix the post with update_post.

Put it on the calendar: schedule_post

{ "post_id": "post_oalirbz67y4m4cqxq5dw", "publish_at": "2026-11-03T09:00:00Z" }

Or publish_post to send it now. A failed channel is retried alone with retry_target.

A full walkthrough: Let an agent fill a collection.

Conventions

  • Scopes only matter in cloud mode (with an API key); in Staqly Community Edition the access token gives every tool.
  • Tools marked read-only are annotated as such for clients that care; tools marked destructive delete or invalidate something (data, a key, a secret).
  • Collection inputs accept an ID (col_qjuybkx6355nz4no6pqk) or the exact name.
  • Tools and REST go through the same authorization checks. Most REST operations have a tool; these have none: the browser flows (sign-in, sign-out, setup, redeeming a device link or a connect link, the OAuth start and callback of a channel), cloud accounts (sign-in methods, members and invitations: people are managed by people), the local access token, recovery key rotation (dashboard session only), developer app registration (PUT /v1/providers/{id}/app), the agent list (/v1/agents), the list of workspace exports (GET /v1/workspace/exports), job details (GET /v1/jobs/{id}, /stats, /cancel), the media editor (/v1/media-projects, /v1/ai, POST /v1/media/{id}/replace) and the billing extras (details, add-ons, X post bundles).
  • A suspended workspace (trial or paid period ended unpaid) can call read-only tools plus revoke_session, revoke_api_key, create_device_link, start_workspace_export, start_billing_checkout, open_billing_portal, delete_workspace and purge_post; other tools answer with plan_expired, like REST.

Collections

list_collections

List collections with post counts per status. Read-only · collections:read

ParameterTypeRequiredDescription
include_archivedbooleanNoInclude archived collections

get_collection

Get a collection by ID or name, with its post counts. Read-only · collections:read

ParameterTypeRequiredDescription
collectionstringYesCollection ID (col_...) or exact name

create_collection

Create a collection (e.g. "Instagram Avatar"): a group of posts with its own publishing schedules. · collections:write

ParameterTypeRequiredDescription
colorstringNoAccent colour, e.g. #7c3aed
descriptionstringNo
namestringYesCollection name
processing_timeout_secondsintegerNoHow long a post on your own automation waits for a reported result before it fails, 60-86400 seconds; without it the server default applies

update_collection

Update a collection: name, description, icon, colour, the wait for your own automation's result (processing_timeout_seconds), or archive/unarchive it (archiving an archived collection, or unarchiving an active one, is a conflict). · collections:write

ParameterTypeRequiredDescription
archivedbooleanNoTrue archives, false unarchives
collectionstringYesCollection ID (col_...) or exact name
colorstringNoAccent colour, e.g. #7c3aed
descriptionstringNoNew description
iconstringNoIcon name
namestringNoNew name
processing_timeout_secondsobjectNoHow long a post on your own automation waits for a reported result before it fails, 60-86400 seconds, or null for the server default

delete_collection

Permanently delete a collection with its posts and schedules. confirm must equal the collection name. Destructive · collections:delete (the :write scope alone is not enough)

ParameterTypeRequiredDescription
collectionstringYesCollection ID (col_...) or exact name
confirmstringYesMust be exactly the collection name

Posts

list_posts

List posts, optionally by collection, status, channel or tag. Default order is by publish time (unscheduled last); publish_after/publish_before make it the calendar; sort created_desc lists the newest first. Read-only · posts:read

ParameterTypeRequiredDescription
channel_idstringNoPosts with a target on this channel
collectionstringNoCollection ID or name
cursorstringNoNext_cursor of the previous page
limitintegerNoPage size (default 50, max 200)
publish_afterstringNoRFC3339 or YYYY-MM-DD, inclusive
publish_beforestringNoRFC3339 or YYYY-MM-DD, exclusive
sortstringNoPublish_asc (default), publish_desc, created_desc, created_asc
statusstringNoDraft, scheduled, publishing, published or failed
tagstringNo

search_posts

Find posts whose content contains a text, with the same filters as list_posts. Read-only · posts:read

ParameterTypeRequiredDescription
channel_idstringNoPosts with a target on this channel
collectionstringNoCollection ID or name
cursorstringNoNext_cursor of the previous page
limitintegerNoPage size (default 50, max 200)
publish_afterstringNoRFC3339 or YYYY-MM-DD, inclusive
publish_beforestringNoRFC3339 or YYYY-MM-DD, exclusive
querystringYesText the content contains
sortstringNoPublish_asc (default), publish_desc, created_desc, created_asc
statusstringNoDraft, scheduled, publishing, published or failed
tagstringNo

get_post

Get one post with its targets (status, link, error per channel). Read-only · posts:read

ParameterTypeRequiredDescription
post_idstringYesPost ID (post_...)

create_post

Create a post in a collection: content, media (ids from upload_media), targets (one per channel, each with an optional content override and settings: the provider's settings_fields from list_providers, as strings, e.g. X reply_settings, made_with_ai, thread_finisher, reposters as comma-separated channel ids), tags, metadata. status draft (default) or scheduled (needs publish_at, RFC3339 in the future, and a target); publish_now true publishes at once. repeat_every (1d to 6d, 1w, 2w, 1mo) schedules a copy that long after each time the post is published. thread: follow-up parts (content, media, delay_seconds) published as replies under the post on platforms that take replies (X); your own automation receives them with the request. · posts:write

ParameterTypeRequiredDescription
collectionstringYesCollection ID (col_...) or exact name
contentstringNoThe post's text
external_refstringNoYour own reference
mediastring[]NoMedia IDs (med_...) in order
metadataobjectNoFree JSON for your own use
publish_atstringNoRFC3339, in the future
publish_nowbooleanNoPublish right away
repeat_everystringNoRepeat after publishing: 1d to 6d, 1w, 2w or 1mo (empty: no repeat)
statusstringNoDraft (default) or scheduled
tagsstring[]No
targetsobject[]No
threadobject[]NoReplies published under the post, in order (at most 25): content, media, delay_seconds

update_post

Edit a draft, scheduled or failed post: content, media, targets (the full list replaces the current one), publish_at (null clears), tags, metadata, collection, repeat_every (an empty string stops repeating; edit the next scheduled copy of a repeating post to stop the chain), thread (replaces the replies; [] clears them). A published post is refused (duplicate it). Pass expected_version to refuse the edit when someone changed it meanwhile. · posts:write

ParameterTypeRequiredDescription
collectionstringNo
contentstringNo
expected_versionintegerNo
external_refstringNo
mediastring[]No
metadataobjectNo
post_idstringYesPost ID (post_...)
publish_atobjectNoRFC3339 in the future, or null to clear
repeat_everystringNo1d to 6d, 1w, 2w or 1mo; an empty string stops repeating
tagsstring[]No
threadobject[]NoReplaces the replies; [] clears them
targetsobject[]NoReplaces the whole list

schedule_post

Set when a post goes out (RFC3339, in the future) and make it scheduled; the post needs at least one target. · posts:publish

ParameterTypeRequiredDescription
post_idstringYesPost ID (post_...)
publish_atstringYesRFC3339, in the future

publish_post

Publish a draft, scheduled or failed post now. · posts:publish

ParameterTypeRequiredDescription
post_idstringYesPost ID (post_...)

cancel_post

Take a scheduled post off the schedule; it becomes a draft again. · posts:publish

ParameterTypeRequiredDescription
post_idstringYesPost ID (post_...)

duplicate_post

Copy a post (content, media, tags, metadata, targets) into a new draft. · posts:write

ParameterTypeRequiredDescription
post_idstringYesPost ID (post_...)

delete_post

Delete a post (its event history is kept). Destructive · posts:delete (the :write scope alone is not enough)

ParameterTypeRequiredDescription
post_idstringYesPost ID (post_...)

delete_posts

Delete several posts at once (up to 200; their event history is kept). Returns the deleted ids and the ids not found; what already went out stays on the platforms. Destructive · posts:delete

ParameterTypeRequiredDescription
idsstring[]YesPost IDs (post_...), up to 200

purge_post

Delete a post together with its whole history: every event about it (and their webhook deliveries), its media when no other post uses them. For removing personal data; one content-free post.purged event remains. Destructive · admin

ParameterTypeRequiredDescription
post_idstringYesPost ID (post_...)

preview_post

How each target will carry the post: the text per channel (with the channel's links mode applied), the links it removes or defangs (links_found, with a warning naming the channel) and what its provider objects to (too long, missing title...). Read-only · posts:read

ParameterTypeRequiredDescription
post_idstringYesPost ID (post_...)

get_post_metrics

A post's numbers per channel (views, likes, reposts, replies, quotes, bookmarks, link clicks where the platform gives them), read from the platform when older than ten minutes or with refresh true. available false: the platform reports none. Read-only · posts:read

ParameterTypeRequiredDescription
post_idstringYesPost ID (post_...)
refreshbooleanRead the numbers from the platforms now

report_post_metrics

Your own automation (provider custom) sends the numbers of a post it published, replacing the stored ones. · posts:publish

ParameterTypeRequiredDescription
post_idstringYesPost ID (post_...)
channel_idstringYesThe custom channel the target is on
impressions, likes, reposts, replies, quotes, bookmarks, link_clicksintegerThe numbers you have; leave out the ones you don't

A link to a read-only preview page of the post (as each channel shows it) where anyone with the link can comment without signing in. The url is returned once; expires_in_days 0 never expires. · posts:write

ParameterTypeRequiredDescription
post_idstringYesPost ID (post_...)
expires_in_daysintegerDays until the link stops working, 0 to 365 (0 never)

A post's preview links (active, expiry, revoked); the links themselves are not shown again. Read-only · posts:read

ParameterTypeRequiredDescription
post_idstringYesPost ID (post_...)

Stop a preview link from working. Destructive · posts:write

ParameterTypeRequiredDescription
post_idstringYesPost ID (post_...)
preview_idstringYesPreview link ID (prv_...)

list_post_comments

A post's feedback threads, oldest first: comments reviewers left on its preview pages (name, email) and the team's replies. A thread's first comment has parent_id empty and may mark a passage: quote, the channel's version (channel_id, empty: the shared text), part (0 the post's text, n its n-th comment), where the words are now (anchor_start/anchor_end, -1 when gone: text_changed) and resolved_at once resolved. Read-only · posts:read

ParameterTypeRequiredDescription
post_idstringYesPost ID (post_...)

reply_to_post_comment

Reply to a feedback thread of a post as the team. · posts:write

ParameterTypeRequiredDescription
post_idstringYesPost ID (post_...)
comment_idstringYesA comment of the thread (cmt_...)
bodystringYesThe reply, up to 2000 characters

resolve_post_comment

Resolve a feedback thread by its first comment (resolved false reopens it). · posts:write

ParameterTypeRequiredDescription
post_idstringYesPost ID (post_...)
comment_idstringYesThe thread's first comment (cmt_...)
resolvedbooleanFalse reopens a resolved thread; default true

get_post_history

The events of a post, newest first: created, edited, scheduled, published or failed per channel. Read-only · posts:read

ParameterTypeRequiredDescription
post_idstringYesPost ID (post_...)

retry_target

Try a failed target once more, now. · posts:publish

ParameterTypeRequiredDescription
channel_idstringYesChannel ID (ch_...)
post_idstringYesPost ID (post_...)

list_tags

List the workspace's post tags with how many posts carry each, most used first. Read-only · posts:read

No inputs.

Your own automation

list_requested_work

What people's setup asks your automation for: targets on your own automation waiting for report_publish_result (kind target, with the post and the channel) and schedules that found nothing to publish and ask for posts (kind posts; answer by creating draft posts in that collection). Oldest first. Read-only · posts:read

No inputs.

report_publish_result

Close a target on your own automation (provider custom) that waits for a result: status published with the url (and external_id), or failed with the error. Only for work you did yourself. · posts:publish

ParameterTypeRequiredDescription
channel_idstringYesThe custom channel the target is on
errorstringNoWhy it failed
external_idstringNoThe platform's id of the post
post_idstringYesPost ID (post_...)
statusstringYesPublished or failed
urlstringNoWhere the post lives now

Channels

list_providers

The platform catalog: every provider staqly can publish to, whether it is available in this build, how it connects (oauth2 in the dashboard, token here with connect_channel, none for your own automation), its limits (characters, media) and the per-post settings it takes. Read-only · channels:read

No inputs.

list_channels

List connected channels (accounts) with provider, handle, status (connected, needs_reconnect, disabled), group_id (its channel group) and activity (last published post and time, next scheduled post time, posts published in the last 30 days). Read-only · channels:read

ParameterTypeRequiredDescription
group_idstringNoOnly channels in this channel group (grp_..., see list_channel_groups)

get_channel

Get one channel with its group and activity. Credentials are never returned. Read-only · channels:read

ParameterTypeRequiredDescription
channel_idstringYesChannel ID (ch_...)

connect_channel

Connect your own automation (provider custom, no fields). X (OAuth) is connected in the dashboard. Platforms with status soon in list_providers can't be connected yet. · channels:manage

ParameterTypeRequiredDescription
fieldsobjectNoThe provider's credential_fields by key
namestringNoWhat to call the channel; defaults to the account's name
providerstringYesProvider id from list_providers with status available, e.g. custom
settingsobjectNoProvider-level defaults
group_idstringNoChannel group to put it in (grp_...); default: the Default group

update_channel

Rename a channel, change its default settings (settings replaces them; settings.links = keep, remove or defang sets what the channel does with links in a post, within its provider's link_modes: X allows only remove and defang), turn it off (status disabled) or on (connected), or reconnect a token channel with fresh fields; group_id moves it to another channel group. · channels:manage

ParameterTypeRequiredDescription
channel_idstringYesChannel ID (ch_...)
fieldsobjectNoToken platforms: fresh credential fields to reconnect
namestringNo
settingsobjectNo
statusstringNoConnected or disabled
group_idstringNoMove the channel to this channel group (grp_...; empty: Default)

list_channel_groups

List the workspace's channel groups (every channel is in exactly one; the Default group always exists) with how many channels each holds. Move a channel with update_channel group_id. Read-only · channels:read

No inputs.

create_channel_group

Create a channel group (name, unique in the workspace; optional color #rrggbb and position). · channels:manage

ParameterTypeRequiredDescription
colorstringNo#rrggbb, or empty
namestringNoWhat to call the group, unique in the workspace
positionintegerNoSort order (smaller first; Default always leads)

update_channel_group

Rename a channel group, or change its color or position. · channels:manage

ParameterTypeRequiredDescription
group_idstringYesChannel group ID (grp_...)
namestringNoWhat to call the group, unique in the workspace
colorstringNo#rrggbb, or empty
positionintegerNoSort order (smaller first; Default always leads)

delete_channel_group

Delete a channel group; its channels move to the Default group, which can't be deleted. Destructive · channels:manage

ParameterTypeRequiredDescription
group_idstringYesChannel group ID (grp_...)

delete_channel

Remove a channel; targets on it go with it. Destructive · channels:manage

ParameterTypeRequiredDescription
channel_idstringYesChannel ID (ch_...)

test_channel

Check a channel's stored credentials against its platform. Rate-limited. · channels:manage

ParameterTypeRequiredDescription
channel_idstringYesChannel ID (ch_...)

Schedules

A connect link: someone without access to Staqly (a client) opens it and connects a channel to this workspace by signing in at the platform; nothing else is reachable through it. The url is returned once. · channels:manage

ParameterTypeRequiredDescription
expires_in_hoursintegerNoHours the link works (default 168, at most 720)
group_idstringNoChannel group connected channels join (empty: Default)
max_usesintegerNoHow many channels may be connected (default 1, at most 50)
notestringNoShown to the person who opens the link
providersstring[]NoPlatform ids to offer; empty offers every available one

The workspace's connect links (status open, used, expired or revoked; uses; expiry); the links themselves are not shown again. Read-only · channels:manage

No inputs.

Stop a connect link from working; channels already connected through it stay. Destructive · channels:manage

ParameterTypeRequiredDescription
link_idstringYesConnect link ID (chl_...)

list_schedules

List a collection's (or every) publishing schedules with their next run. Read-only · schedules:manage

ParameterTypeRequiredDescription
collectionstringNoCollection ID or name; empty lists every schedule

create_schedule

Create a publishing schedule for a collection: kind once (run_at) or recurring (rule: times like ["09:00","17:00"] with optional weekdays 0-6 and tz, or every_minutes), the channels it publishes to, pick (next waiting post, selected post_ids, or all), and what to do when nothing waits (source none, agent = emit schedule.posts_requested, endpoint = POST a signed request to endpoint_url and create the posts it returns; the response carries endpoint_secret in full once, so the endpoint can verify X-Staqly-Signature). · schedules:manage

ParameterTypeRequiredDescription
channelsstring[]NoChannel IDs the chosen posts go to (a post's own targets win)
collectionstringYesCollection ID (col_...) or exact name
enabledbooleanNo
endpoint_secretstringNoSigns the request like a webhook; generated when empty (an empty string on update generates a new one); returned in full only by the call that set it
endpoint_urlstringNo
kindstringNoOnce or recurring
namestringNo
pickstringNoNext (oldest waiting draft), selected (post_ids) or all
post_idsstring[]No
ruleobjectNoRecurring: times (HH:MM) with optional weekdays (0 Sunday to 6 Saturday) and tz (IANA), or every_minutes
run_atstringNoOnce: RFC3339 in the future
sourcestringNoWhen nothing waits: none, agent (emit schedule.posts_requested) or endpoint (POST to endpoint_url)

update_schedule

Change a schedule (any field of create_schedule, enabled true/false); next_run_at is recomputed. · schedules:manage

ParameterTypeRequiredDescription
channelsstring[]NoChannel IDs the chosen posts go to (a post's own targets win)
enabledbooleanNo
endpoint_secretstringNoSigns the request like a webhook; generated when empty (an empty string on update generates a new one); returned in full only by the call that set it
endpoint_urlstringNo
kindstringNoOnce or recurring
namestringNo
pickstringNoNext (oldest waiting draft), selected (post_ids) or all
post_idsstring[]No
ruleobjectNoRecurring: times (HH:MM) with optional weekdays (0 Sunday to 6 Saturday) and tz (IANA), or every_minutes
run_atstringNoOnce: RFC3339 in the future
schedule_idstringYesSchedule ID (sch_...)
sourcestringNoWhen nothing waits: none, agent (emit schedule.posts_requested) or endpoint (POST to endpoint_url)

delete_schedule

Delete a schedule. Destructive · schedules:manage

ParameterTypeRequiredDescription
schedule_idstringYesSchedule ID (sch_...)

run_schedule

Run a schedule now (its regular next run is unchanged). · schedules:manage

ParameterTypeRequiredDescription
schedule_idstringYesSchedule ID (sch_...)

Queue

list_jobs

The background queue: publish runs, schedule runs and token refreshes with status (queued, running, done, failed, cancelled), attempts and the last error. Newest first; filter by status or kind. Read-only · posts:read

ParameterTypeRequiredDescription
cursorstringNo
kindstringNoPublish_post, publish_target, target_timeout, run_schedule or refresh_channel
limitintegerNo
statusstringNoQueued, running, done, failed or cancelled

retry_job

Queue a failed job again, now. · posts:publish

ParameterTypeRequiredDescription
job_idstringYesJob ID (job_...)

Media

upload_media

Upload a file (base64); returns a media ID to put in a post's media list. · media:write

ParameterTypeRequiredDescription
filenamestringYesFile name including the extension, e.g. avatar.png
media_base64stringYesBase64-encoded picture, video or audio file

get_media

Get a media file's metadata (type, size, name, SHA-256, URL, alt text, pixels, length); with include_content=true also its base64 content (files up to 4 MiB). Read-only · media:read

ParameterTypeRequiredDescription
include_contentbooleanNoAlso return the file as base64 (files up to 4 MiB)
media_idstringYesMedia ID (med_...)

list_media

The media library: uploaded pictures, videos and audio, newest first, with how many posts use each (uses). Filter by name (q), kind (image, video, audio), used (used or unused), folder (a folder id or root) and tag (deleted=true lists Deleted, duplicates=true identical files); sort created_desc, created_asc, size_desc or name_asc; page with offset and limit (next_offset). Read-only · media:read

ParameterTypeRequiredDescription
deletedbooleanNolist the files in Deleted (with deleted_at and purge_at) instead
duplicatesbooleanNoonly files with an identical twin, grouped by content
folderstringNoa folder ID (files directly in it) or root (the top level)
kindstringNoimage, video or other
limitintegerNopage size (default 60, max 200)
offsetintegerNonext_offset of the previous page
qstringNopart of the file name
sortstringNocreated_desc (default), created_asc, size_desc or name_asc
tagstringNofiles carrying this tag
usedstringNoused (posts carry it) or unused

update_media

Rename a media file, set its alt text (a description for people who can't see it; platforms that take alt text receive it), or set a video's width, height and duration_ms. · media:write

ParameterTypeRequiredDescription
alt_textstringNoalt text, up to 1500 characters; empty clears it
duration_msintegerNoa video's length in milliseconds
folder_idstringNomove the file: a folder ID, or empty for the top level
heightintegerNopixels
media_idstringYesthe media ID
namestringNonew file name
tagsstring[]Noreplace the file's tags
widthintegerNopixels

get_media_usage

The posts that use a media file (in their files or a comment), newest first, at most 50, with each post's title, status and publish time. Check it before deleting a file. Read-only · media:read and posts:read

ParameterTypeRequiredDescription
media_idstringYesMedia ID (med_...)

list_media_folders

The media library's virtual folders (id, parent_id, name, files directly in it), the number of files at the top level and in total, and every file tag with its count. Read-only · media:read

create_media_folder

Create a media library folder at the top level or inside another (parent_id). Names are unique among a folder's subfolders, ignoring case. · media:write

ParameterTypeRequiredDescription
namestringYesthe folder name
parent_idstringNothe folder it goes in; empty or omitted for the top level

update_media_folder

Rename a media library folder or move it under another folder (parent_id; empty = the top level). A folder can't go inside itself. · media:write

ParameterTypeRequiredDescription
folder_idstringYesthe folder ID
namestringNothe new name
parent_idstringNomove it into this folder; empty for the top level

delete_media_folder

Delete a media library folder. Its files and subfolders move up to its parent; no file is deleted. Destructive · media:write

ParameterTypeRequiredDescription
folder_idstringYesthe folder ID

organize_media

Move up to 200 media files to a folder (folder_id; empty = the top level) and/or add and remove tags on them. · media:write

ParameterTypeRequiredDescription
add_tagsstring[]Notags to add (lowercase, no #, spaces become dashes)
folder_idstringNomove them to this folder; empty for the top level; omit to leave folders alone
idsstring[]Yesmedia IDs (med_...), up to 200
remove_tagsstring[]Notags to remove

delete_media

Move a media file to Deleted, where it can be restored for 30 days before it is deleted for good (refused while a scheduled post uses it); with permanent=true delete it for good now, and posts that reference it lose that file. Destructive · posts:delete (the :write scope alone is not enough)

ParameterTypeRequiredDescription
media_idstringYesMedia ID (med_...)
permanentbooleanNodelete it for good now instead of moving it to Deleted

restore_media

Take a media file out of Deleted, back where it was. · posts:delete

ParameterTypeRequiredDescription
media_idstringYesMedia ID (med_...)

keep_media

Keep this media file of a set of identical ones (list_media with duplicates=true): posts that use a copy use this file instead, and the copies move to Deleted. Destructive · posts:delete and posts:write

ParameterTypeRequiredDescription
media_idstringYesMedia ID (med_...)

Activity log

list_events

List the activity log (posts created, scheduled, published or failed, channels connected, schedules run, settings changes), newest first, with optional filters. Read-only · events:read

ParameterTypeRequiredDescription
channel_idstringNoOnly events about this channel
collectionstringNoOnly events of this collection (ID or name)
cursorstringNoNext_cursor of the previous page
fromstringNoRFC3339 or YYYY-MM-DD, inclusive
limitintegerNoPage size (default 50, max 200)
post_idstringNoOnly events about this post
schedule_idstringNoOnly events about this schedule
tostringNoRFC3339 or YYYY-MM-DD, exclusive
typestringNoExact event type, e.g. post.published
type_prefixstringNoEvent type prefix, e.g. post.

export_events

Export the activity log as NDJSON or CSV text, oldest first; events is the number of events (lines) in this call. Output is capped at 32 KiB per call: when truncated=true, call again with the same filters and after_seq=next_after_seq for the rest (the whole log is the sum of all calls). Read-only · events:read

ParameterTypeRequiredDescription
actor_idstringNoActor ID, e.g. an API key ID
actor_typestringNoSession, api_key, local or system
after_seqintegerNoContinue a truncated export: next_after_seq of the previous call
collectionstringNoCollection ID or exact name
formatstringNoNdjson (default) or csv
fromstringNoYYYY-MM-DD or RFC3339 (inclusive)
post_idstringNoOnly events about this post (post_...)
tostringNoYYYY-MM-DD or RFC3339 (exclusive)
typestringNoExact event type, e.g. post.published
type_prefixstringNoEvent type prefix, e.g. post.

Webhooks

list_webhooks

List webhooks with their URL, events, filters and state. Read-only · webhooks:manage

No inputs.

get_webhook

Get one webhook. Read-only · webhooks:manage

ParameterTypeRequiredDescription
webhook_idstringYesWebhook ID (wh_...)

create_webhook

Create a webhook that receives signed event POSTs. The response contains the signing secret once. · webhooks:manage

ParameterTypeRequiredDescription
activebooleanNoFalse pauses deliveries
collection_idsstring[]NoOnly events from these collections (col_...); empty sends all
descriptionstringNoWhat the receiver does, shown in the dashboard
eventsstring[]NoEvent types to send, e.g. ["post.published"]; ["*"] (default) sends all
max_attemptsintegerNoDelivery attempts before giving up
timeout_msintegerNoPer-attempt timeout in milliseconds
urlstringYesHttps URL that receives the POSTs

update_webhook

Update a webhook's URL, description, events, collection filter, active flag, timeout or retry count. Setting only active to its current value is a conflict. · webhooks:manage

ParameterTypeRequiredDescription
activebooleanNoFalse pauses deliveries
collection_idsstring[]NoOnly events from these collections (col_...); empty sends all
descriptionstringNoWhat the receiver does, shown in the dashboard
eventsstring[]NoEvent types to send, e.g. ["post.published"]; ["*"] (default) sends all
max_attemptsintegerNoDelivery attempts before giving up
timeout_msintegerNoPer-attempt timeout in milliseconds
urlstringNoNew receiver URL
webhook_idstringYesWebhook ID (wh_...)

delete_webhook

Delete a webhook and stop its deliveries. Destructive · webhooks:manage

ParameterTypeRequiredDescription
webhook_idstringYesWebhook ID (wh_...)

rotate_webhook_secret

Replace a webhook's signing secret; the new secret is returned once and the old one stops working. Destructive · webhooks:manage

ParameterTypeRequiredDescription
webhook_idstringYesWebhook ID (wh_...)

test_webhook

Queue a webhook.test delivery to this webhook only. Rate-limited. · webhooks:manage

ParameterTypeRequiredDescription
webhook_idstringYesWebhook ID (wh_...)

list_webhook_deliveries

List webhook delivery attempts (status, response code, error), newest first. Read-only · webhooks:manage

ParameterTypeRequiredDescription
limitintegerNoMax deliveries (default 50, max 200)
post_idstringNoOnly deliveries of events about this post (post_...)
statusstringNoPending, succeeded or failed
webhook_idstringNoOnly deliveries of this webhook (wh_...)

retry_webhook_delivery

Re-queue a finished (succeeded or failed) webhook delivery. · webhooks:manage

ParameterTypeRequiredDescription
delivery_idstringYesDelivery ID (dlv_...)

Alerts

list_alerts

List alerts: where staqly tells people what happened (Telegram, Slack, Discord, ntfy, email). Secrets are masked. Read-only · alerts:manage

No inputs.

get_alert

Get one alert. Secrets are masked. Read-only · alerts:manage

ParameterTypeRequiredDescription
alert_idstringYesAlert ID (nch_...)

create_alert

Create an alert that tells people when posts go out or fail and when a channel needs reconnecting. · alerts:manage

ParameterTypeRequiredDescription
collection_idsstring[]NoOnly events from these collections (col_...); empty means all
configobjectNoType-specific settings. slack/discord: webhook_url (or bot_token + channel). telegram: bot_token, chat_id. ntfy: topic, server_url, access_token, priority. email: host, port, username, password, from, to (a list of addresses), tls (starttls, tls or none)
digest_window_secondsintegerNoGroup messages within this many seconds into one; 0 sends each
enabledbooleanNoFalse pauses the alert
eventsstring[]NoEvent types to tell about, e.g. ["post.published", "post.failed"]
namestringYesAlert name
typestringYesTelegram, slack, discord, ntfy or email

update_alert

Update an alert's name, config, events, collection filter, digest window or enabled flag. Setting only enabled to its current value is a conflict. · alerts:manage

ParameterTypeRequiredDescription
alert_idstringYesAlert ID (nch_...)
collection_idsstring[]NoOnly events from these collections (col_...); empty means all
configobjectNoType-specific settings. slack/discord: webhook_url (or bot_token + channel). telegram: bot_token, chat_id. ntfy: topic, server_url, access_token, priority. email: host, port, username, password, from, to (a list of addresses), tls (starttls, tls or none)
digest_window_secondsintegerNoGroup messages within this many seconds into one; 0 sends each
enabledbooleanNoFalse pauses the alert
eventsstring[]NoEvent types to tell about, e.g. ["post.published", "post.failed"]
namestringNoNew name

delete_alert

Delete an alert. Destructive · alerts:manage

ParameterTypeRequiredDescription
alert_idstringYesAlert ID (nch_...)

test_alert

Send a test message through an alert right away. Rate-limited. · alerts:manage

ParameterTypeRequiredDescription
alert_idstringYesAlert ID (nch_...)

list_alert_deliveries

List recent messages sent (or failed) through an alert, newest first. Read-only · alerts:manage

ParameterTypeRequiredDescription
alert_idstringYesAlert ID (nch_...)
limitintegerNoMax deliveries (default 50, max 200)

API keys and sessions

list_api_keys

List API keys (prefix, scopes, last use, expiry, revocation) and the available scopes. Read-only · admin

No inputs.

create_api_key

Create an API key with the given scopes (cloud only: the Community Edition has no API keys, it uses its access token). The raw key is returned once. · admin

ParameterTypeRequiredDescription
expires_atstringNoRFC3339 expiry; omit for a key that does not expire
namestringYesKey name, e.g. the agent that uses it
scopesstring[]YesScopes to grant, e.g. ["collections:read", "posts:read", "posts:write"]

revoke_api_key

Revoke an API key; it stops working immediately. Revoking a revoked key is a conflict. Destructive · admin

ParameterTypeRequiredDescription
key_idstringYesAPI key ID (key_...)

rotate_api_key

Replace an API key with a new one (same name and scopes); the old key stops working and the new raw key is returned once. Destructive · admin

ParameterTypeRequiredDescription
key_idstringYesAPI key ID (key_...)

list_sessions

List signed-in dashboard sessions (browser, created, last seen, expiry). Read-only · admin

No inputs.

revoke_session

Sign out a dashboard session. Revoking a revoked session is a conflict. Destructive · admin

ParameterTypeRequiredDescription
session_idstringYesSession ID (ses_...)

Workspace and plan

get_workspace

Get the workspace name, ID, plan and time zone. Read-only · no scope needed

No inputs.

rename_workspace

Rename the workspace and/or set its time zone (IANA name: post repeats and schedule rules without tz use it). · admin

ParameterTypeRequiredDescription
namestringNoNew workspace name
timezonestringNoIANA time zone name, e.g. Europe/Warsaw or UTC

delete_workspace

Permanently delete the workspace and everything in it (cloud only). confirm must equal the workspace name. Like REST, this needs a signed-in dashboard session, so API keys get a forbidden error. Destructive · dashboard session only (API keys get forbidden)

ParameterTypeRequiredDescription
confirmstringYesMust be exactly the workspace name

start_workspace_export

Start a ZIP export of the whole workspace (posts, channels, schedules, media, events). Poll get_workspace_export until status is ready. · admin

No inputs.

get_workspace_export

Get a workspace export's status (pending, running, ready, failed, expired) and, once ready, its download URL. Read-only · admin

ParameterTypeRequiredDescription
export_idstringYesExport ID (exp_...) from start_workspace_export

list_plans

List the cloud plans with their limits and prices. Read-only · no scope needed

No inputs.

get_usage

Get the workspace's plan, usage this period against its limits, and whether it is suspended. Read-only · no scope needed

No inputs.

get_billing

Get billing status: whether Stripe billing is enabled, the plan, the subscription status and the end of the trial or paid period. Read-only · admin

No inputs.

start_billing_checkout

Start a Stripe Checkout for a plan billed monthly or yearly and return its URL for a person to open and pay; a workspace that already pays is switched to that plan instead (prorated). Cloud with billing enabled. · admin

InputTypeRequiredDescription
planstringNostarter, plus, pro or business (default pro)
intervalstringNomonth or year (default month); yearly is 20 % off or more

open_billing_portal

Return a Stripe customer portal URL (payment method, invoices, cancel). · admin

No inputs.

Create a one-time link (valid 5 minutes) that signs another browser into the dashboard. Only for Community Edition callers (its access token, or MCP over stdio) and dashboard sessions; API keys get a forbidden error. · the Community Edition or a dashboard session (API keys get forbidden)

No inputs.

Next steps

On this page

Example: draft, preview, scheduleFind the channels: list_channelsWrite the post: create_postCheck it: preview_postPut it on the calendar: schedule_postConventionsCollectionslist_collectionsget_collectioncreate_collectionupdate_collectiondelete_collectionPostslist_postssearch_postsget_postcreate_postupdate_postschedule_postpublish_postcancel_postduplicate_postdelete_postdelete_postspurge_postpreview_postget_post_metricsreport_post_metricscreate_preview_linklist_preview_linksrevoke_preview_linklist_post_commentsreply_to_post_commentresolve_post_commentget_post_historyretry_targetlist_tagsYour own automationlist_requested_workreport_publish_resultChannelslist_providerslist_channelsget_channelconnect_channelupdate_channellist_channel_groupscreate_channel_groupupdate_channel_groupdelete_channel_groupdelete_channeltest_channelSchedulescreate_channel_linklist_channel_linksrevoke_channel_linklist_schedulescreate_scheduleupdate_scheduledelete_schedulerun_scheduleQueuelist_jobsretry_jobMediaupload_mediaget_medialist_mediaupdate_mediaget_media_usagelist_media_folderscreate_media_folderupdate_media_folderdelete_media_folderorganize_mediadelete_mediarestore_mediakeep_mediaActivity loglist_eventsexport_eventsWebhookslist_webhooksget_webhookcreate_webhookupdate_webhookdelete_webhookrotate_webhook_secrettest_webhooklist_webhook_deliveriesretry_webhook_deliveryAlertslist_alertsget_alertcreate_alertupdate_alertdelete_alerttest_alertlist_alert_deliveriesAPI keys and sessionslist_api_keyscreate_api_keyrevoke_api_keyrotate_api_keylist_sessionsrevoke_sessionWorkspace and planget_workspacerename_workspacedelete_workspacestart_workspace_exportget_workspace_exportlist_plansget_usageget_billingstart_billing_checkoutopen_billing_portalcreate_device_linkNext steps