API reference

API reference

The 1Post API has 128 operations for posts, media, accounts, slots, the library, webhooks, results, the inbox and automation. Authenticate with a key bound to a workspace. Each entry lists its method, path, what it does, the key scope and role action it needs, its parameters and the fields of its request body.

This reference is generated from the API's own route table. Public routes are listed here; vendor callbacks and service routes are left out. There are 128 operations in 23 groups. Every request needs a key unless the table says No key; see authentication. The machine-readable document is at /openapi.json on the API host.

Posts

POST/v1/bulk/posts/approve

Approve up to 100 posts waiting in review and schedule them

Needs a role that approves (owner, admin, reviewer). A key or MCP client also needs the approval switch only the workspace owner sets. Each post is checked and scheduled on its own, so one that no longer fits is reported beside its id.

Needs a write key. Role action: post.approve.

Body fieldTypeRequired
post_idsstring[]Yes

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

POST/v1/bulk/posts/delete

Delete up to 100 unscheduled posts or scheduled posts

A post that is live on a platform is not removed there and is refused for that id only.

Needs a write key. Role action: post.create.

Body fieldTypeRequired
post_idsstring[]Yes

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

POST/v1/bulk/posts/reschedule

Move up to 100 posts to a new time

Posts are moved in the order given, spacing_min minutes apart, starting at schedule_at. Each post is its own step: one that is refused (a full day, a post already sent) is reported beside its id and the others still move. The answer lists every id.

Needs a write key. Role action: post.create.

Body fieldTypeRequired
post_idsstring[]Yes
schedule_atstringYes
spacing_minintegerNo

Errors: resultsinvalid_inputhorizonunauthorizedqueue_limitallowance_usedforbiddendaily_caprate_limitedinternal_error

GET/v1/posts

List posts, newest first, with their destinations

Needs a read key. Role action: read.

ParameterInTypeRequired
limitquerystringNo
cursorquerystringNo
statusquerystring (one of a fixed list)No
platformquerystring (one of a fixed list)No
account_idquerystringNo
tagquerystringNo
fromquerystringNo
toquerystringNo

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

POST/v1/posts

Save an unscheduled post, schedule a post or publish now to one or more accounts

Without schedule_at, publish_now or use_next_free_slot the post is saved as an unscheduled post. schedule_at is an ISO 8601 time (no offset means UTC) and wins over use_next_free_slot. A contributor's post goes to review whatever the request asks for, and a test key's post is always a dry run. Idempotency-Key is honored for 24 hours: the same key with the same request returns the first answer, with a different request it is a 409.

Needs a write key. Role action: post.create.

ParameterInTypeRequired
Idempotency-KeyheaderstringNo
Body fieldTypeRequired
textstringNo
partsobject[]No
accountsstring or object[]No
set_idstringNo
signature_idstring or nullNo
tagsstring[]No
publish_nowbooleanNo
schedule_atstringNo
use_next_free_slotbooleanNo
late_policy"skip" | "publish"No
late_window_minintegerNo
dry_runbooleanNo
review_linkbooleanNo

Errors: publishedinvalid_inputhorizonunauthorizedqueue_limitallowance_usedsubscription_requiredforbiddenreconnect_neededdaily_capno_free_slotinvalid_for_platformrate_limitedinternal_error

PATCH/v1/posts/{id}

Change part of a post before it goes out, or move it in time

Send only what changes. parts replaces the post's text and media (destinations with their own text keep it); accounts patches destinations already on the post by account_id, or adds new ones; remove_accounts drops destinations. A scheduled post is taken back to an unscheduled post, changed, validated again and scheduled at the same time, all or nothing. A post that already went out can only move, with move.choice.

Needs a write key. Role action: post.create.

ParameterInTypeRequired
idpathstringYes
Body fieldTypeRequired
partsobject[]No
accountsobject[]No
remove_accountsstring[]No
tagsstring[]No
late_policy"skip" | "publish"No
late_window_minintegerNo
schedule_atstringNo
publish_nowbooleanNo
moveobjectNo

Errors: keptinvalid_inputhorizonunauthorizedallowance_usedqueue_limitforbiddennot_founddaily_capreconnect_neededinvalid_for_platformrate_limitedinternal_error

DELETE/v1/posts/{id}

Delete an unscheduled post or cancel a schedule, for every destination or one

A destination that is live on a platform is not removed there. With account_id only that destination goes.

Needs a write key. Role action: post.create.

ParameterInTypeRequired
idpathstringYes
account_idquerystringNo

Errors: deletedinvalid_inputunauthorizedforbiddennot_foundrate_limitedinternal_error

POST/v1/posts/{id}/approve

Approve a post waiting in review and schedule it

Also schedules a post a client already approved through a review link. Needs a role that approves (owner, admin, reviewer). A key or MCP client also needs the approval switch only the workspace owner sets.

Needs a write key. Role action: post.approve.

ParameterInTypeRequired
idpathstringYes

Errors: invalid_inputunauthorizedforbiddennot_foundrate_limitedinternal_error

POST/v1/posts/{id}/cancel

Cancel every destination of a post that has not started

A destination whose publish is in flight is left to finish, and is counted in in_flight.

Needs a write key. Role action: post.create.

ParameterInTypeRequired
idpathstringYes
Body fieldTypeRequired
account_idstringNo

Errors: invalid_inputunauthorizedforbiddennot_foundrate_limitedinternal_error

POST/v1/posts/{id}/link-live

Attach the live platform post to a destination whose outcome was unknown

Send the platform's own id or the post's address. The destination becomes published and its results are collected from then on.

Needs a write key. Role action: post.publish.

ParameterInTypeRequired
idpathstringYes
Body fieldTypeRequired
account_idstringYes
platform_post_idstringNo
urlstringNo

Errors: invalid_inputunauthorizedforbiddennot_foundrate_limitedinternal_error

POST/v1/posts/{id}/retry

Send the destinations that failed again, as a new post

Only a destination known not to have published (failed) is retried. A destination in unknown may already be on the platform: check the account, then attach it with link-live or duplicate the post.

Needs a write key. Role action: post.publish.

ParameterInTypeRequired
idpathstringYes

Errors: unauthorizedforbiddennot_foundoutcome_unknownrate_limitedinternal_error

POST/v1/posts/{id}/review-links

Make a link a client opens to preview, comment on and approve a post

The link works without a 1Post login, expires after 7 days unless ttl_days says up to 30, and can be revoked. The token is in this response only.

Needs a write key. Role action: reviewlink.create.

ParameterInTypeRequired
idpathstringYes
Body fieldTypeRequired
post_idsstring[]No
ttl_daysintegerNo

Errors: invalid_inputunauthorizedforbiddennot_foundrate_limitedinternal_error

POST/v1/posts/import-csv

Schedule up to 500 posts from a spreadsheet

Send the file as text in csv. The header row names the columns: text (required), accounts (account ids, handles or platform names separated by ; or |), scheduled_at (2026-11-02T15:00; no offset is read in the workspace time zone, a Z or +02:00 is exact) or date and time (read in the workspace time zone), media_urls, and link (added to the end of the text). A row without a time is saved as an unscheduled post. A file whose columns are named differently says which is which in columns. Every row is checked against its destinations exactly as a post made by hand: with the default on_error: "abort" nothing is queued if any row is refused, with "skip" the rows that pass are queued. dry_run: true checks everything and keeps nothing (files are not fetched). Files at media_urls are brought into the library (up to 25 different addresses). Publer files import as they are (a Date column holding 2026/11/02 15:00, a Media URL column separated by commas, a Link column), and so do SocialBee files (text, imageUrls, gifUrls, videoUrls, postAtSpecificTime). Hootsuite files have no header row: add the header row scheduled_at,text,link and write the dates as 2026-11-20 09:30. Send an Idempotency-Key to repeat an import safely for 24 hours: the same file returns the posts it made, another file with the same key is a 409.

Needs a write key. Role action: post.create.

ParameterInTypeRequired
Idempotency-KeyheaderstringNo
Body fieldTypeRequired
csvstringYes
columnsobjectNo
default_account_idsstring[]No
on_error"abort" | "skip"No
dry_runbooleanNo

Errors: rowsinvalid_inputunauthorizedplan_limitforbiddenconflictqueuedcommittedrate_limitedinternal_errorprovider_unavailable

Media

GET/v1/media

List the media library by name, type and library flag

Needs a read key. Role action: read.

ParameterInTypeRequired
limitquerystringNo
cursorquerystringNo
qquerystringNo
kindquery"image" | "gif" | "video" | "audio" | "document"No
libraryquery"true" | "false"No

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

POST/v1/media

Import a file from a public address

The address is fetched through the public-address-only fetch: private, loopback and link-local addresses are refused. Until the file is fetched its size is unknown, so the import holds room for the largest file the plan takes and the fetch stops there; to use a file's exact size, upload it instead.

Needs a write key. Role action: library.edit.

Body fieldTypeRequired
urlstringYes
namestringNo
in_librarybooleanNo

Errors: invalid_inputunauthorizedplan_limitforbiddenrate_limitedinternal_errormedia_storage_full

POST/v1/media/uploads

Get a resumable signed upload address and the media id

Upload the file to upload_url with the headers returned, directly to storage (a request body over 4.5 MB never reaches this server). When those headers include tus-resumable, run a TUS 1.0.0 upload: a POST with Upload-Length set to the file size to open it, then PATCH requests of 6 MB each (the last one shorter) to the Location it returns, sending the returned x-signature header on every request. Otherwise send the whole file in one request using method. The size is checked against the plan before the address is made, and the room is held until the address expires. A stored file larger than the declared bytes is deleted when it lands and makes no media.

Needs a write key. Role action: library.edit.

Body fieldTypeRequired
namestringYes
mimestringYes
bytesintegerYes
in_librarybooleanNo

Errors: invalid_inputunauthorizedallowance_usedplan_limitforbiddenrate_limitedinternal_errormedia_storage_full

Accounts

PATCH/v1/accounts/{id}

Disable or enable an account, or change its settings

Disabling keeps the account's history and frees a slot of the plan; enabling again needs no reconnect while the connection is still valid.

Needs a write key. Role action: workspace.manage.

ParameterInTypeRequired
idpathstringYes
Body fieldTypeRequired
disabledbooleanNo
settingsobjectNo

Errors: invalid_inputunauthorizedforbiddennot_foundrate_limitedinternal_error

DELETE/v1/accounts/{id}

Disconnect an account: its tokens are erased and its queued posts are canceled

The account keeps its history and shows as disabled. Posts already live on the platform are not touched.

Needs a write key. Role action: workspace.manage.

ParameterInTypeRequired
idpathstringYes

Errors: disconnectedunauthorizedforbiddennot_foundrate_limitedinternal_error

POST/v1/accounts/{id}/reconnect-link

Make a link a client opens to connect one broken account again

No 1Post login is needed and scheduled posts stay. It works for this account only, once, for 7 days. Only for an account that is waiting to be reconnected and connects by redirect. The link is in this response only.

Needs a write key. Role action: workspace.manage.

ParameterInTypeRequired
idpathstringYes

Errors: unauthorizedforbiddennot_foundrate_limitedinternal_error

POST/v1/accounts/connect

Get the address that connects an account by redirect

Open authorize_url in a browser signed in to the platform. The platform sends the person back to this API's callback and then to the site. The key API form of an invite link.

Needs a write key. Role action: workspace.manage.

Body fieldTypeRequired
platformstring (one of a fixed list)Yes
instancestringNo
account_idstringNo

Errors: invalid_inputunauthorizedaccount_limitforbiddenrate_limitedinternal_errorprovider_unavailable

POST/v1/accounts/connect/form

Connect an account that uses a password, token or pasted address

For Bluesky (app password), Telegram, Discord, Slack, a webhook address, WordPress, DEV, Hashnode, Lemmy and X with your own keys. The details are checked with the platform, sealed and never shown again.

Needs a write key. Role action: workspace.manage.

Body fieldTypeRequired
platformstring (one of a fixed list)Yes
fieldsobjectYes

Errors: invalid_inputunauthorizedaccount_limitforbiddenrate_limitedinternal_errorprovider_unavailable

POST/v1/invite-links

Make an expiring link a client opens to connect their own account into this workspace

No 1Post login is needed. Only platforms that connect by redirect are offered; the token is in this response only.

Needs a write key. Role action: workspace.manage.

Body fieldTypeRequired
platformstring (one of a fixed list) or nullNo

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

Slots

Library

Webhooks

GET/v1/webhooks

Outgoing webhook endpoints

Owners and admins only: an address can carry a secret of its own. The signing secret is never listed.

Needs a read key. Role action: webhooks.manage.

Errors: unauthorizedforbiddenrate_limitedinternal_error

POST/v1/webhooks

Add a webhook endpoint

The address must be public and use https. The signing secret (Standard Webhooks, whsec_) is in this response only.

Needs a write key. Role action: webhooks.manage.

Body fieldTypeRequired
urlstringYes
eventsstring (one of a fixed list)[]Yes
account_idsstring[] or nullNo

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

Analytics

GET/v1/analytics/export

The posts of a range with their latest numbers, as CSV text

One row per post, newest first, up to 5,000 rows, with one column per metric. Posts imported from the account's own history are marked "published elsewhere". Cells that would run as a formula in a spreadsheet are written as text. Stored numbers only.

Needs a read key. Role action: read.

ParameterInTypeRequired
rangequery"7d" | "30d" | "all"No

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

POST/v1/analytics/refresh

Ask for fresh numbers for one published post

Read at the next collector run. 5 a day per workspace for most destinations, 50 a day on Bluesky and Mastodon, and never on X. Asking again while one is waiting costs nothing.

Needs a write key. Role action: post.create.

Body fieldTypeRequired
post_idstringYes
account_idstringYes

Errors: invalid_inputunauthorizedplan_limitforbiddenrate_limitedinternal_error

GET/v1/analytics/summary

Totals per platform, the best posts, and account cards compared with the previous period

Reads stored snapshots only; nothing is fetched from a platform on demand.

Needs a read key. Role action: read.

ParameterInTypeRequired
rangequery"7d" | "30d" | "all"No
account_idquerystringNo
daysquery"7" | "30" | "90"No

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

GET/v1/imported-posts

Posts imported from an account's own history (published elsewhere)

Up to 90 days back, read when the account was connected. They feed analytics and cannot be scheduled, edited or published again.

Needs a read key. Role action: read.

ParameterInTypeRequired
limitquerystringNo
cursorquerystringNo
account_idquerystringNo

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

Inbox

GET/v1/comments

Comments and replies gathered from the accounts

Needs a read key. Role action: read.

ParameterInTypeRequired
limitquerystringNo
cursorquerystringNo
statusquery"open" | "done" | "hidden"No
account_idquerystringNo
post_idquerystringNo

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

POST/v1/comments/{id}/labels

Set the labels on a comment (replaces the ones it had)

Send label_ids: [] to clear them. Up to 10 labels, all from this workspace.

Needs a write key. Role action: post.comment.

ParameterInTypeRequired
idpathstringYes
Body fieldTypeRequired
label_idsstring[]Yes

Errors: invalid_inputunauthorizedforbiddennot_foundrate_limitedinternal_error

POST/v1/comments/{id}/reply

Send your own reply to a comment, from the account it was left on

The reply goes out at once on the platform, so it needs a role that publishes and confirm: true. 1Post never replies on its own.

Needs a write key. Role action: post.publish.

ParameterInTypeRequired
idpathstringYes
Body fieldTypeRequired
textstringYes
confirmbooleanYes

Errors: invalid_inputunauthorizedforbiddennot_foundrate_limitedinternal_errorprovider_unavailable

Automation

POST/v1/plugs

Save a plug, off

A plug repeats or answers with fixed text you wrote; it calls no model. Switch it on with PATCH.

Needs a write key. Role action: automation.manage.

Body fieldTypeRequired
scope"connection" | "post"Yes
account_idstringNo
post_idstringNo
kind"repost" | "follow_up" | "cross_comment" | "cross_repost"Yes
threshold_likesintegerYes
textstringNo
helper_account_idsstring[]No
delay_minintegerNo

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

Account

POST/v1/connect-links/{token}/start

A client begins connecting their own account with an invite link

No key needed.

ParameterInTypeRequired
tokenpathstringYes

Errors: rate_limitedinternal_error

GET/v1/connect/{platform}/callback

Where a platform sends the person back; answers with a redirect to the site

No key needed.

ParameterInTypeRequired
platformpathstringYes

Errors: rate_limitedinternal_error

Free tools

GET/v1/public/tools/{tool}

Run a free tool (check_post, split_thread, platform_limits, build_utm_link) with query parameters

30 requests a minute and 1,000 a day per address. No key.

No key needed.

ParameterInTypeRequired
toolpathstringYes

Errors: rate_limitedinternal_error

POST/v1/public/tools/{tool}

Run a free tool with a JSON body (for long text)

No key needed.

ParameterInTypeRequired
toolpathstringYes

Errors: rate_limitedinternal_error

MCP

GET/.well-known/oauth-protected-resource/v1/mcp/oauth

RFC 9728 metadata for /v1/mcp/oauth

No key needed.

Errors: rate_limitedinternal_error

POST/v1/mcp

The MCP server: free tools with no credential, every tool with a key or an OAuth token

No key needed.

Errors: rate_limitedinternal_error

Alerts

GET/v1/alert-target

Where failure alerts go (a Slack or Discord channel)

The host and the state only; the webhook address is a secret and is never shown again.

Needs a read key. Role action: webhooks.manage.

Errors: targetunauthorizedforbiddenrate_limitedinternal_error

POST/v1/alert-target

Send failure alerts to a Slack or Discord channel

Paste an incoming webhook address from Slack (hooks.slack.com/services/...) or a Discord channel webhook (discord.com/api/webhooks/...). You are told when a post fails, may or may not have gone out, is missed, or an account needs to be connected again. Replaces any earlier target.

Needs a write key. Role action: webhooks.manage.

Body fieldTypeRequired
urlstringYes

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

Brand kits

POST/v1/brand-kits

Add a brand kit

The first kit is the primary. Every asset must be in this workspace's media library.

Needs a write key. Role action: library.edit.

Body fieldTypeRequired
namestringYes
is_primarybooleanNo
websitestring or nullNo
colorsstring[]No
fontsstring[]No
asset_idsstring[]No

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

Calendar

POST/v1/calendar/links

Make a read-only link a client opens to see the calendar

No sign-in. It shows when each post goes out, where, a short preview and the calendar notes, and changes nothing. It lasts 30 days unless you set ttl_days (up to 90). The link is in this response only.

Needs a write key. Role action: workspace.manage.

Body fieldTypeRequired
ttl_daysintegerNo

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

POST/v1/calendar/notes

Add a note to a date or range of dates

A launch, a holiday, "client away". Up to 500 characters and up to 62 days.

Needs a write key. Role action: post.create.

Body fieldTypeRequired
starts_onstringYes
ends_onstringNo
textstringYes

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

PATCH/v1/calendar/notes/{id}

Change a calendar note

You can change your own; members who edit the library can change any. Sending starts_on without ends_on makes it a one-day note.

Needs a write key. Role action: post.create.

ParameterInTypeRequired
idpathstringYes
Body fieldTypeRequired
starts_onstringNo
ends_onstringNo
textstringNo

Errors: updatedinvalid_inputunauthorizedforbiddennot_foundrate_limitedinternal_error

Developer

GET/v1/logs

The last 7 days of API requests for this workspace, with payloads and answers

For owners and admins. Tokens, passwords, keys, signing secrets, authorization headers and chat webhook addresses are replaced with [masked] before they are stored, and each payload is cut to 2,000 characters.

Needs a read key. Role action: apikeys.manage.

ParameterInTypeRequired
limitquerystringNo
cursorquerystringNo
statusquerystringNo
methodquerystring (one of a fixed list)No
key_idquerystringNo

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

Feeds

POST/v1/feeds

Turn each new item of a feed into a post

New items become unscheduled posts. Queueing them is an opt-in (mode: "queue") that needs a daily_cap you choose. The text is a template you write with {title} and {link}; nothing is written for you.

Needs a write key. Role action: automation.manage.

Body fieldTypeRequired
urlstringYes
templatestringYes
account_idsstring[]Yes
modestring (one of a fixed list)No
post_when"next_slot" | "immediate"No
daily_capintegerNo

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

PATCH/v1/feeds/{id}

Change a feed, or switch it on or off

Needs a write key. Role action: automation.manage.

ParameterInTypeRequired
idpathstringYes
Body fieldTypeRequired
activebooleanNo
modestring (one of a fixed list)No
post_when"next_slot" | "immediate"No
templatestringNo
daily_capintegerNo
account_idsstring[]No

Errors: updatedinvalid_inputunauthorizedforbiddennot_foundrate_limitedinternal_error

Members

GET/v1/members

The people in the workspace and their roles

Member references (provider:subject) and roles, never an email address. Use a reference as assigned_to on a comment. Any role may read it, with a key or in the dashboard.

Needs a read key. Role action: read.

Errors: unauthorizedforbiddenrate_limitedinternal_error

Recurring

POST/v1/recurring

Make a scheduled post repeat every 1 to 31 days

The post needs a time. A post going to X needs at least two versions of the text in rotation, because X refuses repeats. Each run is written ahead as an ordinary post you can see, edit or cancel.

Needs a write key. Role action: automation.manage.

Body fieldTypeRequired
post_idstringYes
every_daysintegerYes
rotationstring[]No
max_runsinteger or nullNo
ends_atstring or nullNo

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

PATCH/v1/recurring/{id}

Change a repeating post for the next run only, or for every run after it

scope is required. The schedule, the rotation and the end change for all future runs; the text can change for the next run or all of them.

Needs a write key. Role action: automation.manage.

ParameterInTypeRequired
idpathstringYes
Body fieldTypeRequired
scope"this_run" | "all_future"Yes
every_daysintegerNo
rotationstring[]No
max_runsinteger or nullNo
ends_atstring or nullNo
partsobject[]No

Errors: updatedinvalid_inputunauthorizedforbiddennot_foundrate_limitedinternal_error

GET/v1/review/{token}

What a client sees on a review link: each post as it will go out, per destination, and the comments so far

The link works without a 1Post login until it expires (7 days unless the maker chose up to 30) or is turned off.

No key needed.

ParameterInTypeRequired
tokenpathstringYes

Errors: forbiddennot_foundconflictrate_limitedinternal_error

POST/v1/review/{token}/comments

A client leaves a comment on a post of the link

Limited to 10 writes an address and 30 a link in ten minutes. The website field is a trap for form-filling bots and must be left empty. Sending the same comment again within a minute returns the first one.

No key needed.

ParameterInTypeRequired
tokenpathstringYes
Body fieldTypeRequired
post_idstringYes
author_namestringYes
textstringYes
websitestringNo

Errors: invalid_inputforbiddennot_foundconflictrate_limitedinternal_error

POST/v1/review/{token}/decisions

A client approves a post waiting in review, or asks for changes with a note

Limited to 10 writes an address and 30 a link in ten minutes. The website field is a trap for form-filling bots and must be left empty. Sending the same comment again within a minute returns the first one.

No key needed.

ParameterInTypeRequired
tokenpathstringYes
Body fieldTypeRequired
post_idstringYes
author_namestringYes
decision"approve" | "changes"Yes
textstringNo
websitestringNo

Errors: invalid_inputforbiddennot_foundconflictrate_limitedinternal_error

Workspace

POST/v1/utm-preset

Set the UTM preset

When enabled, each link in a post gets utm_source set to the destination (or the name you give it in sources), utm_medium, and the campaign, content and term you set, at publish time. A link that already has a utm_ parameter is left as you wrote it.

Needs a write key. Role action: workspace.manage.

Body fieldTypeRequired
enabledbooleanYes
mediumstringNo
campaignstring or nullNo
contentstring or nullNo
termstring or nullNo
sourcesobjectNo

Errors: invalid_inputunauthorizedforbiddenrate_limitedinternal_error

Questions

Where is the OpenAPI document?

The API serves OpenAPI 3.1 at /openapi.json on its own host, generated from the same route table as this page.

Does every route need a key?

Every route except the free tools and the invite-link routes needs a key. The Needs column says which.

From one post to every feed

Plan the week in one sitting, keep your team in the loop, and let 1Post publish on time while you get on with the rest of your day.