Buffer MCP Server
Buffer MCP Server exposes 41 tools (24 reads, 17 confirmation-gated mutations) for managing Buffer social accounts, posts, content items, ideas, templates, tags and analytics over Buffer's current GraphQL API.
Account & channel discovery:
get_account,get_channel,get_channels,get_configuration,get_daily_posting_limitsto find organizations, channels, and per-channel capability and posting limits.Read posts:
get_post,get_postsfor single posts or filtered/paginated lists by status, channel, tags, dates or type.Publish & edit posts:
create_post,edit_post,delete_post,move_post_in_queuefor scheduling (queue, next, custom time, shareNow) with drafts, approvals and per-platform metadata.Content items:
get_content_item(s),create_content_item,create_content_item_draft,update_content_item,update_content_item_draft,delete_content_item, plusadd_post_to_content_item,remove_post_from_content_item,promote_content_item_draft_to_posts.Ideas:
create_idea,get_ideas,get_idea_groups.Templates:
create_post_template,get_post_template(s),update_post_template,delete_post_template.Tags:
get_tag,get_tags_v2.Analytics:
get_aggregated_post_metricsfor organization metrics over a date range, optionally filtered by channel or tag.Instagram audio:
get_instagram_audio,get_search_instagram_audio,get_trending_instagram_audio.Generic GraphQL:
graphql_query(query only) andgraphql_mutation(single root field, confirmation required) for experimental/newer roots.Helpers:
list_accounts,preview_operation,query_pages(bounded 1-5 page reads),get_operation_schemafor local schema/field discovery without a request.Safety model: all 17 mutations require explicit confirmation, support read-only mode, private account profiles, upstream field selection, local payload files, and no automatic retries.
Provides tools for interacting with Buffer's GraphQL API, enabling account and channel discovery, post scheduling and publishing, content item/draft management, post templates, and analytics through reads and confirmation-gated mutations.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Buffer MCP Serverlist my scheduled posts for the next week with minimal fields"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Buffer MCP Server & CLI
Buffer MCP server and CLI for Codex and AI agents. 41 tools for current GraphQL account, channels, posts, content items, templates and analytics, with private accounts and explicit operation approval. One shared implementation supplies both binaries and a desktop bundle.
Built and maintained by Navid Moazzez. Built on Slipway, which turns one definition of each tool into the MCP server and the CLI. The complete guide is on navid.me.
The terminal illustrates real command names and approval flow. It is not a recording of a provider account run. Buffer already has official CLI and hosted MCP products; their current schemas, field selection and supported workflows are compared below.
Requires Node 22+ and eligible Buffer API access for account operations. Validation: fixture tests, schema validation and protocol/artifact discovery are separate from provider-account outcomes and desktop GUI outcomes, which remain unverified. Section 7 has the measured token costs; no success rate is invented.
Two ways to use it
Command line
npm install -g @thenavidm/buffer-mcp-cli@latest
buffer-cli
buffer-cli get-account --fields id --agent
buffer-cli schema create-post
buffer-cli create-post --payload-file /absolute/private/approved-post.json --account work --confirm --agentMCP server, for your AI app
codex mcp add buffer -- npx -y @thenavidm/buffer-mcp-cli@latestConfigure private credentials first. Ask: “Read scheduled posts for this exact organization with minimal fields; do not create or change any posts.” Full setup is in INSTALL.md.
Which one
Where you work | Surface |
Codex or shell agent | Shared CLI, local MCP or both |
Desktop chat | Compatible local MCP or desktop bundle |
Scripts / CI | CLI or MCP client |
Remote-only client | Official Buffer hosted MCP |
Related MCP server: socialclaw
Features
Capability | CLI | MCP |
Account / channel discovery | get-account / get-channel | get_account / get_channel |
Deliberate publishing | create-post / edit-post | create_post / edit_post |
Content item / draft work | create-content-item / create-content-item-draft | create_content_item / create_content_item_draft |
Template workflows | get-post-templates / create-post-template | get_post_templates / create_post_template |
Bounded cursor reads | query-pages | query_pages |
Local validation / fields | preview-operation / get-operation-schema | preview_operation / get_operation_schema |
Profiles and policy | list-accounts / --account / --confirm | list_accounts / account / confirm |
Generic current GraphQL | graphql-query / graphql-mutation | graphql_query / graphql_mutation |
Contents
Number | Section | What it covers |
1 | What you can ask it | |
2 | Quick install | |
3 | Set up Buffer access | |
4 | Connect your client | |
5 | Check it works | |
6 | Output, flags and exit codes | |
7 | Measured in Claude Code and Codex | |
8 | Every tool and argument | |
9 | Publishing, content items and analytics | |
10 | Pagination, retries and local input files | |
11 | Several private accounts | |
12 | Writing safely | |
13 | How the two surfaces work | |
14 | Privacy and data handling | |
15 | Environment variables | |
16 | Updates and removal | |
17 | Troubleshooting | |
18 | API coverage and comparisons | |
19 | Versions | |
20 | FAQ |
1. What you can ask it
Identify my account's accessible organizations and connected channels before choosing a target.
Read scheduled posts for one organization with minimal fields and a five-page maximum.
Preview a complete post input locally before approving shareNow, customScheduled or a queue change.
Create only the draft or approved post requested by the human, then inspect its returned ID/status.
Review content items and attached channel drafts before promoting them to posts.
Read and manage the selected post template with its documented visibility.
Read permitted aggregate metrics for the chosen date window.
Delete only the exact post/content item/template requested, after explicit confirmation.
Actual stdio discovery supplies 41 tools: 24 reads and 17 confirmation-gated mutations. Thirty-five named operations come from Buffer's published current CLI schemas, with generic query/mutation, account labels, operation schema inspection, local preview and bounded read pagination. Current experimental snippets/tag mutations remain generic requests with provider validation.
2. Quick install
npm install -g @thenavidm/buffer-mcp-cli@latest
buffer-cli --version
buffer-cli login
buffer-cli doctor
buffer-cli toolsManual CLI/MCP requires Node 22+. The versioned buffer-2.0.0.mcpb bundles production dependencies for a compatible desktop host. Follow INSTALL.md for complete private setup.
codex mcp add buffer -- npx -y @thenavidm/buffer-mcp-cli@latest
codex mcp list3. Set up Buffer access
Private API key and account access
Sign in to the intended account's API settings. Create the API key needed for this task and review that client's current quota.
Save it privately as BUFFER_API_KEY, or in a regular token-only file outside every repository and configure its absolute BUFFER_TOKEN_FILE path. BUFFER_API_TOKEN remains a compatibility alias; API_KEY takes precedence when both are supplied.
Run buffer-cli doctor. Then deliberately run doctor --network: it requests only account { id } and prints diagnostic success, never the account ID or provider content.
Read get-account with minimal fields, then inspect account.organizations and choose the exact organization/channel for the task. Use get_operation_schema to discover actual selectable paths.
Review the native input, platform metadata and publishing mode. Preview locally, then confirm only the precise operation the human requested. Successful creation is not proof that a social network published the post.
API keys authenticate through Authorization: Bearer at the fixed https://api.buffer.com endpoint. Personal API keys act across every organization accessible to that account; an organization input/default does not restrict the key. Provider roles, publishing policies and connected-channel grants still apply. Named local profiles route credentials and defaults; they cannot narrow provider authorization.
OAuth access tokens already granted to an app can use the same private credential path. The wrapper does not register apps, open consent, implement PKCE exchange, save refresh tokens or renew expiry. Follow OAuth for current PKCE and organization-specific app grants. PAT and OAuth permissions differ. Analytics uses PAT insightsRead access; current OAuth grants cannot request that analytics scope.
Current OAuth scopes in the provider's authentication guide:
Scope | Purpose |
posts:read | Read posts and queues |
posts:write | Create and manage posts |
ideas:read | Read ideas |
ideas:write | Create and manage ideas |
account:read | Read account information |
account:write | Manage permitted account settings |
offline_access | Request a refresh token from the issuer; this wrapper does not refresh it |
Request only the grant needed for the intended workflow. A refresh token is not a Bearer API credential. PAT insightsRead analytics is separate from the current OAuth scope list.
Use a private 0700 directory and 0600 regular token-only file on macOS/Linux. Windows users must restrict the file's ACL to their own user; POSIX checks do not establish Windows ACL protection. Files cannot be symlinks or exceed 64 KiB. File credentials override environment keys and are cached until restart. No automatic .env loader, browser credential harvesting or global official CLI configuration is used.
Plans, quotas and query limits
This AGPL wrapper is free. Buffer plans, posting limits, social-network permissions and API quotas are separate. Current API limits document these per-client rolling windows:
Plan | API keys / app clients | 15 minutes | 24 hours | 30 days |
Free | 1 / 1 | 100 | 250 | 3000 |
Essentials | 3 / 3 | 100 | 250 | 7500 |
Team | 5 / 5 | 100 | 500 | 15000 |
Official MCP connections share a rate-limit bucket with personal keys; connecting another assistant does not create extra quota. RateLimit and Retry-After headers are returned with successful data; inspect your API settings' live usage. Quotas and query-complexity rules can change; the provider's returned policy takes precedence. The local 200 ms pacing is per profile/process, not a provider quota reservation. Labels sharing a key and several processes still share upstream limits.
Every ordinary command sends one request. query_pages is capped at five pages and 100 records requested per page locally; the provider can reject a smaller or differently constrained query. No request retries automatically, including reads, HTTP 200 GraphQL errors, HTTP 429 or timeouts. Wait for the provider's indicated reset, inspect account state, and make a deliberate retry. A transport timeout can leave a mutation completed remotely.
Local request JSON cap is 1 MiB, document cap 64 KiB/10000 parsed tokens, response cap 5 MiB and default timeout 30 seconds. These limits do not raise upstream query-depth, complexity, array, scheduling or social-network limits. Media URLs must be reachable by Buffer and meet platform constraints; local filesystem paths are not uploaded by this wrapper.
Revocation and rotation
Revoke/rotate the intended key in Buffer API settings or revoke the OAuth app grant through provider controls, update private local configuration and restart. Package uninstall does not revoke the key, disconnect a channel, delete hosted data or unschedule posts. Never send keys, private account exports, signed media links or raw error responses to public issues.
4. Connect your client
INSTALL.md gives Codex-first setup plus optional Claude Code, Claude Desktop bundle/manual routes, Cursor, VS Code/Copilot, Windsurf, Zed, Gemini CLI, Cline and Docker. The same package runs on Node 22+ in macOS/Linux/native Windows. GUI apps and remote development environments need their own accessible private configuration.
Local MCP launches command npx with arguments -y and @thenavidm/buffer-mcp-cli@latest over stdio. This package has no HTTP relay. A remote-only client uses the separately maintained official https://mcp.buffer.com/mcp service. npm ships SKILL.md but does not automatically register an agent skill. Install that shipped file through the client's supported mechanism.
Client-level approvals and local confirm=true are separate. A returned post or instruction in provider content never grants permission to publish. Read-only mode removes mutation discovery and also refuses a direct hidden-tool call.
5. Check it works
buffer-cli --version
buffer-cli doctor
buffer-cli doctor --network
buffer-cli list-accounts --agent
buffer-cli get-account --fields id --agent
buffer-cli get-operation-schema --operation posts --agentBare CLI, tools, schemas/help, local account labels and previews need no provider grant. doctor checks configuration presence; only doctor --network validates the minimal account request. A successful read establishes that request and token, not every post/platform or role. Full MCP discovery exposes 41 tools; read-only exposes 24. Invalid input/refused actions exit 2; missing credentials exit 10. Do not publish a real post just to test installation.
6. Output, flags and exit codes
Both surfaces return structured JSON, including native GraphQL data and available rate-limit headers. Connection data remains native edges/node/pageInfo; query_pages returns bounded page responses with continuation state.
buffer-cli create-post --help
buffer-cli schema create-post
buffer-cli get-post --id SELECTED_POST --fields id --fields status --agent --select data.post.id,data.post.statusFlag | Meaning |
--agent | Compact JSON and no prompts; never confirms a write |
--json / --compact | JSON output and compact spacing |
--select a,b.c | Keep selected output paths after receipt |
--fields id --fields status | Native upstream field selection for supported named operations |
--payload / --payload-file | Complete native input JSON or regular private file; do not mix with input fields |
--account NAME | Select one private profile |
--confirm | Approve the exact requested mutation, subject to enabled policies |
--help / schema COMMAND | Actual discovered flags and full input schema |
Exit | Meaning |
0 | Successful local result or provider response |
1 | Unexpected error |
2 | Usage, invalid input or a refused mutation, an unknown command or a hidden write |
3 | Not found |
4 | Authentication or forbidden permission |
5 | Provider/GraphQL/typed mutation/network failure |
7 | Rate limit or quota failure |
10 | Nothing configured or invalid private profile/token configuration |
GraphQL can fail inside HTTP 200. errors arrays fail even with partial data; typed mutation error unions fail rather than reporting success. Named mutations require a recognized successful result type. Acceptance/status from Buffer is not an assertion that a downstream social network completed publishing.
7. MCP or CLI and token cost
CLI and MCP are built by Slipway from each tool's one definition, so they share discovery, validation, handlers, accounts and one write guard, and no second provider implementation can drift.
Measured on 2026-10-05 against 2.0.1, the same day, with Claude Code 2.1.286 on Claude Opus 5.5 (one short prompt with and without the server connected, the difference read from the API's own usage figures) and Codex 0.159.3 on gpt-6.1-sol:
Cost | 2.0.1 | 3.0.0 |
Claude Code, every tool loaded, every message | 112,029 | 60,720 |
Claude Code's default, tool search, every message | 737 | 740 |
| 3,477 | 3,535 |
Codex over the CLI, one task, median of five | 113,353 | 111,104 |
Codex over MCP, the same task, median of five | 48,471 | 48,492 |
The task was "find the command that schedules a post to a channel, and the flags it requires". Every tool loaded costs less because each write's native input appeared twice, as its own fields and inside payload, and 3.0.0 writes each repeated part once under $defs. Over the CLI, every 3.0.0 run asked which (476 characters) where 2.0.1's read the full command list (8,096), and create-post's schema printed in 33,734 characters instead of 116,294. Over MCP, Codex prints its own TypeScript rendering of the tool list, cut to about 10,000 tokens; that rendering is 426 tokens longer on 3.0.0 (21,946 against 21,520), because Codex leaves the argument descriptions out of a tool whose schema is large, and sharing the repeats brought create_idea under that size. SKILL.md costs 58 more because it now says how approval works over MCP and lists every exit code; tool search differs by 3 tokens.
Upstream fields can reduce requested provider data, and --select reduces the result a model sees after receipt. The CLI does not cost nothing: its help and output reach the model like anything else.
8. Every tool and argument
The following sections come from actual stdio discovery. Native input schemas and field-selection trees are reused from the reviewed published official CLI, with strict nested property checks. Required native fields are validated after payload/profile-default routing; they need not appear as top-level required flags because payload is an alternative.
Tool | Native operation | Policy |
|
| Read |
|
| Confirm exact mutation |
|
| Read |
|
| Read |
|
| Read |
|
| Read |
|
| Read |
|
| Read |
|
| Confirm exact mutation |
|
| Confirm exact mutation |
|
| Confirm exact mutation |
|
| Confirm exact mutation |
|
| Confirm exact mutation |
|
| Read |
|
| Confirm exact mutation |
|
| Confirm exact mutation |
|
| Confirm exact mutation |
|
| Confirm exact mutation |
|
| Read |
|
| Read |
|
| Read |
|
| Confirm exact mutation |
|
| Read |
|
| Read |
|
| Read |
|
| Read |
|
| Confirm exact mutation |
|
| Confirm exact mutation |
|
| Read |
|
| Read |
|
| Read |
|
| Read |
|
| Confirm exact mutation |
|
| Confirm exact mutation |
|
| Confirm exact mutation |
| Local/helper or parsed GraphQL | Read |
| Local/helper or parsed GraphQL | Read |
| Local/helper or parsed GraphQL | Confirm exact mutation |
| Local/helper or parsed GraphQL | Read |
| Local/helper or parsed GraphQL | Read |
| Local/helper or parsed GraphQL | Read |
get_account
buffer-cli get-account
Argument | Required | Type | Details |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
Native input requirements: No required native input fields. Use individual fields or complete payload/payload_file.
Default upstream fields: id, email, organizations.id, organizations.channelCount, timezone. Inspect get_operation_schema for every selectable path.
add_post_to_content_item
buffer-cli add-post-to-content-item
Argument | Required | Type | Details |
| No; body and guard rules apply | string | The content item to add the post to. |
| No; body and guard rules apply | string | The post to add. The post must already exist. The post and the content item must belong to the same organization. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | boolean | Set true only when the user asked for exactly this action. |
Native input requirements: id, postId. Use individual fields or complete payload/payload_file.
Default upstream fields: __typename, contentItem.id, contentItem.accountId, contentItem.allowedActions, contentItem.author.id, contentItem.author.avatar, contentItem.author.email, contentItem.author.isDeleted, contentItem.author.name, contentItem.author.urn, contentItem.body.__typename, contentItem.body.id, contentItem.body.aiAssisted, contentItem.body.assets.__typename, contentItem.body.assets.id, contentItem.body.assets.mimeType, contentItem.body.assets.source, contentItem.body.assets.thumbnail, contentItem.body.assets.type, contentItem.body.text, contentItem.organizationId, contentItem.tags.id, contentItem.tags.color, contentItem.tags.colorName, contentItem.tags.isLocked, contentItem.tags.name, contentItem.targetDate, contentItem.title, contentItem.createdAt, post.id, post.allowedActions, post.assets.__typename, post.assets.id, post.assets.mimeType, post.assets.source, post.assets.thumbnail, post.assets.type, post.author.id, post.author.avatar, post.author.email, post.author.isDeleted, post.author.name, post.author.urn, post.channel.id, post.channel.allowedActions, post.channel.avatar, post.channel.descriptor, post.channel.displayName, post.channel.externalLink, post.channel.hasActiveMemberDevice, post.channel.isDisconnected, post.channel.isLocked, post.channel.isNew, post.channel.isQueuePaused, post.channel.metadata.__typename, post.channel.metadata.defaultToReminders, post.channel.metadata.maxCharacters, post.channel.metadata.serverUrl, post.channel.metadata.subscriptionType, post.channel.metadata.shouldShowLinkedinAnalyticsRefreshBanner, post.channel.metadata.businessPortfolioId, post.channel.metadata.lastSubscribedAt, post.channel.metadata.phoneNumberId, post.channel.metadata.wabaId, post.channel.name, post.channel.organizationId, post.channel.products, post.channel.scopes, post.channel.service, post.channel.serviceId, post.channel.showTrendingTopicSuggestions, post.channel.timezone, post.channel.type, post.channel.createdAt, post.channel.updatedAt, post.channelId, post.channelService, post.contentItemId, post.dueAt, post.error.message, post.error.rawError, post.error.supportUrl, post.externalLink, post.ideaId, post.isCustomScheduled, post.metadata.__typename, post.metadata.firstComment, post.metadata.isAiGenerated, post.metadata.link, post.metadata.shouldShareToFeed, post.metadata.type, post.metadata.title, post.metadata.threadCount, post.metadata.url, post.metadata.details.__typename, post.metadata.details.button, post.metadata.details.link, post.metadata.details.code, post.metadata.details.endDate, post.metadata.details.startDate, post.metadata.details.terms, post.metadata.details.title, post.metadata.details.endTime, post.metadata.details.isFullDayEvent, post.metadata.details.startTime, post.metadata.embeddable, post.metadata.license, post.metadata.madeForKids, post.metadata.notifySubscribers, post.metadata.privacy, post.metadata.spoilerText, post.metadata.locationId, post.metadata.locationName, post.metadata.topic, post.metrics.description, post.metrics.name, post.metrics.type, post.metrics.unit, post.metrics.value, post.metricsUpdatedAt, post.notes.id, post.notes.allowedActions, post.notes.text, post.notes.type, post.notes.createdAt, post.notes.updatedAt, post.notificationStatus, post.schedulingType, post.sentAt, post.sharedNow, post.shareMode, post.status, post.tags.id, post.tags.color, post.tags.colorName, post.tags.isLocked, post.tags.name, post.text, post.via, post.createdAt, post.updatedAt, message. Inspect get_operation_schema for every selectable path.
get_aggregated_post_metrics
buffer-cli get-aggregated-post-metrics
Argument | Required | Type | Details |
| No; body and guard rules apply | array | Optional list of channel IDs to filter by. When omitted (null), the aggregate spans every channel in the organization the actor has insights access to. When set to an empty array, no channels match and the result is empty. Items: string. |
| No; body and guard rules apply | string | End of the aggregation window. Consumers typically pass UTC midnight of the last calendar day in the window (the backend treats the range as inclusive of that day), for example |
| No; body and guard rules apply | string | The organization ID |
| No; body and guard rules apply | string | Start of the aggregation window. Consumers typically pass UTC midnight of the first calendar day in the window, for example |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
Native input requirements: endDateTime, organizationId, startDateTime. Use individual fields or complete payload/payload_file.
Default upstream fields: metrics.type, metrics.name, metrics.value, metrics.unit, metricsUpdatedAt. Inspect get_operation_schema for every selectable path.
get_channel
buffer-cli get-channel
Argument | Required | Type | Details |
| No; body and guard rules apply | string | The ID of the channel to be retrieved |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
Native input requirements: id. Use individual fields or complete payload/payload_file.
Default upstream fields: id, displayName, service, timezone, serviceId. Inspect get_operation_schema for every selectable path.
get_channels
buffer-cli get-channels
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | The Organization id to fetch channels for |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
Native input requirements: organizationId. Use individual fields or complete payload/payload_file.
Default upstream fields: id, name, service. Inspect get_operation_schema for every selectable path.
get_configuration
buffer-cli get-configuration
Argument | Required | Type | Details |
| No; body and guard rules apply | string | The organization to return configuration for. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
Native input requirements: organizationId. Use individual fields or complete payload/payload_file.
Default upstream fields: channels.authorizationStatus.feature, channels.authorizationStatus.reason, channels.authorizationStatus.status, channels.channelId, channels.channelType, channels.content.configurationContentTypes, channels.content.rules.__typename, channels.content.rules.property, channels.content.rules.max, channels.content.rules.min, channels.content.rules.maxLength, channels.content.rules.conflictsWith, channels.content.rules.requires, channels.content.rules.maxMegabytes, channels.content.rules.maxDurationSeconds, channels.content.rules.allowedFormats, channels.content.supportedProperties, channels.engagement.engagementType, channels.engagement.metadata.__typename, channels.engagement.metadata.hasUserRating, channels.engagement.metadata.permanentNote, channels.engagement.supportedAiFeatures, channels.service, services.channelType, services.content.configurationContentTypes, services.content.rules.__typename, services.content.rules.property, services.content.rules.max, services.content.rules.min, services.content.rules.maxLength, services.content.rules.conflictsWith, services.content.rules.requires, services.content.rules.maxMegabytes, services.content.rules.maxDurationSeconds, services.content.rules.allowedFormats, services.content.supportedProperties, services.engagement.engagementType, services.engagement.metadata.__typename, services.engagement.metadata.hasUserRating, services.engagement.metadata.permanentNote, services.engagement.supportedAiFeatures, services.service. Inspect get_operation_schema for every selectable path.
get_content_item
buffer-cli get-content-item
Argument | Required | Type | Details |
| No; body and guard rules apply | string | The unique identifier of the content item to fetch. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
Native input requirements: id. Use individual fields or complete payload/payload_file.
Default upstream fields: id, accountId, allowedActions, author.id, author.avatar, author.email, author.isDeleted, author.name, author.urn, body.__typename, body.id, body.aiAssisted, body.assets.__typename, body.assets.id, body.assets.mimeType, body.assets.source, body.assets.thumbnail, body.assets.type, body.text, body.posts.id, body.posts.allowedActions, body.posts.assets.__typename, body.posts.assets.id, body.posts.assets.mimeType, body.posts.assets.source, body.posts.assets.thumbnail, body.posts.assets.type, body.posts.channelId, body.posts.channelService, body.posts.contentItemId, body.posts.dueAt, body.posts.externalLink, body.posts.ideaId, body.posts.isCustomScheduled, body.posts.metadata.__typename, body.posts.metadata.firstComment, body.posts.metadata.isAiGenerated, body.posts.metadata.link, body.posts.metadata.shouldShareToFeed, body.posts.metadata.type, body.posts.metadata.title, body.posts.metadata.threadCount, body.posts.metadata.url, body.posts.metadata.details.__typename, body.posts.metadata.details.button, body.posts.metadata.details.link, body.posts.metadata.details.code, body.posts.metadata.details.endDate, body.posts.metadata.details.startDate, body.posts.metadata.details.terms, body.posts.metadata.details.title, body.posts.metadata.details.endTime, body.posts.metadata.details.isFullDayEvent, body.posts.metadata.details.startTime, body.posts.metadata.embeddable, body.posts.metadata.license, body.posts.metadata.madeForKids, body.posts.metadata.notifySubscribers, body.posts.metadata.privacy, body.posts.metadata.spoilerText, body.posts.metadata.locationId, body.posts.metadata.locationName, body.posts.metadata.topic, body.posts.metricsUpdatedAt, body.posts.notificationStatus, body.posts.schedulingType, body.posts.sentAt, body.posts.sharedNow, body.posts.shareMode, body.posts.status, body.posts.text, body.posts.via, body.posts.createdAt, body.posts.updatedAt, organizationId, tags.id, tags.color, tags.colorName, tags.isLocked, tags.name, targetDate, title, createdAt. Inspect get_operation_schema for every selectable path.
get_content_items
buffer-cli get-content-items
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | Organization to list content items for. The caller must be a member of this organization. |
| No; body and guard rules apply | array | Sorting to apply, each entry breaking ties in the one before it. Defaults to newest first. A pagination cursor is only valid for the sort that produced it, so reset |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | integer | Local page-size cap 100, default 25; provider may impose additional query limits. minimum: |
| No; body and guard rules apply | string | Opaque cursor from pageInfo.endCursor. One page per ordinary call. maxLength: |
Native input requirements: organizationId. Use individual fields or complete payload/payload_file.
Default upstream fields: items.id, items.accountId, items.allowedActions, items.author.id, items.author.avatar, items.author.email, items.author.isDeleted, items.author.name, items.author.urn, items.body.__typename, items.body.id, items.body.aiAssisted, items.body.assets.__typename, items.body.assets.id, items.body.assets.mimeType, items.body.assets.source, items.body.assets.thumbnail, items.body.assets.type, items.body.text, items.organizationId, items.tags.id, items.tags.color, items.tags.colorName, items.tags.isLocked, items.tags.name, items.targetDate, items.title, items.createdAt, pageInfo.endCursor, pageInfo.hasNextPage, pageInfo.hasPreviousPage, pageInfo.startCursor. Inspect get_operation_schema for every selectable path.
create_content_item
buffer-cli create-content-item
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Organization that owns the content item and all variants created in it. |
| No; body and guard rules apply | array | The channel-specific post variants to create, one per channel. Provide at least one variant, and at most one variant per channel. Items: object. |
| No; body and guard rules apply | array | Tags to apply to this content item. Omit to create it with no tags. Items: string. |
| No; body and guard rules apply | string | Optional date indicating when this piece of content should go out. This is a planning aid only and does not schedule any posts. |
| No; body and guard rules apply | string | Optional title describing what this piece of content is about. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | boolean | Set true only when the user asked for exactly this action. |
Native input requirements: organizationId, posts. Use individual fields or complete payload/payload_file.
Default upstream fields: __typename, content.id, content.accountId, content.allowedActions, content.author.id, content.author.avatar, content.author.email, content.author.isDeleted, content.author.name, content.author.urn, content.body.__typename, content.body.id, content.body.aiAssisted, content.body.assets.__typename, content.body.assets.id, content.body.assets.mimeType, content.body.assets.source, content.body.assets.thumbnail, content.body.assets.type, content.body.text, content.organizationId, content.tags.id, content.tags.color, content.tags.colorName, content.tags.isLocked, content.tags.name, content.targetDate, content.title, content.createdAt, errors.__typename, errors.message, errors.channelId, message. Inspect get_operation_schema for every selectable path.
create_content_item_draft
buffer-cli create-content-item-draft
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Client-generated UUID that makes draft creation idempotent. A retry with the same UUID in the same organization returns the first content item in its current state. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | Organization that will own the content item. |
| No; body and guard rules apply | array | Tags to apply to this content item. Omit to create it with no tags. Items: string. |
| No; body and guard rules apply | string | Optional date indicating when this piece of content should go out. This is a planning aid only and does not schedule any posts. |
| No; body and guard rules apply | string | Optional title describing what this piece of content is about. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | boolean | Set true only when the user asked for exactly this action. |
Native input requirements: draft, organizationId. Use individual fields or complete payload/payload_file.
Default upstream fields: __typename, contentItem.id, contentItem.accountId, contentItem.allowedActions, contentItem.author.id, contentItem.author.avatar, contentItem.author.email, contentItem.author.isDeleted, contentItem.author.name, contentItem.author.urn, contentItem.body.__typename, contentItem.body.id, contentItem.body.aiAssisted, contentItem.body.assets.__typename, contentItem.body.assets.id, contentItem.body.assets.mimeType, contentItem.body.assets.source, contentItem.body.assets.thumbnail, contentItem.body.assets.type, contentItem.body.text, contentItem.organizationId, contentItem.tags.id, contentItem.tags.color, contentItem.tags.colorName, contentItem.tags.isLocked, contentItem.tags.name, contentItem.targetDate, contentItem.title, contentItem.createdAt, errors.message, message. Inspect get_operation_schema for every selectable path.
create_idea
buffer-cli create-idea
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | Call-to-action identifier for analytics tracking |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | Organization ID that will own the idea |
| No; body and guard rules apply | string | Template ID used to create the idea |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | boolean | Set true only when the user asked for exactly this action. |
Native input requirements: content, organizationId. Use individual fields or complete payload/payload_file.
Default upstream fields: __typename, id, content.aiAssisted, content.date, content.media.id, content.media.alt, content.media.size, content.media.thumbnailUrl, content.media.type, content.media.url, content.services, content.tags.id, content.tags.color, content.tags.colorName, content.tags.name, content.text, content.title, groupId, organizationId, position, createdAt, updatedAt, idea.id, idea.content.aiAssisted, idea.content.date, idea.content.services, idea.content.text, idea.content.title, idea.groupId, idea.organizationId, idea.position, idea.createdAt, idea.updatedAt, refreshIdeas, message. Inspect get_operation_schema for every selectable path.
create_post
buffer-cli create-post
Argument | Required | Type | Details |
| No; body and guard rules apply | boolean | If this post was created with the help of AI |
| No; body and guard rules apply | array | Ordered list of assets on this post. Items: object. |
| No; body and guard rules apply | string | Channel's Id for which we want to create the post |
| No; body and guard rules apply | string | Is set when the Post is generated from a Draft |
| No; body and guard rules apply | string | Date when the post is scheduled to be published |
| No; body and guard rules apply | string | Is set when the Post is generated from an Idea |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | How the post is being scheduled. Values: |
| No; body and guard rules apply | boolean | Submit the post for approval instead of scheduling it. A post submitted for approval is always a draft, so this conflicts with turning |
| No; body and guard rules apply | boolean | If true, saves the post as a draft instead of scheduling it. When saving as draft: - Post status will be 'draft' instead of 'buffer' - Posting limits are not checked - The post will not be published until explicitly scheduled |
| No; body and guard rules apply | string | Scheduling type to indicate notification publishing or automatic publishing Values: |
| No; body and guard rules apply | string | source where the composer was initiated from, used for tracking. |
| No; body and guard rules apply | array | List of tag IDs Items: string. |
| No; body and guard rules apply | string | Text content of the Post. Note: for threaded posts, this needs to match the first item in the |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | boolean | Set true only when the user asked for exactly this action. |
Native input requirements: channelId, mode, schedulingType. Use individual fields or complete payload/payload_file.
Default upstream fields: post.id, post.status. Inspect get_operation_schema for every selectable path.
create_post_template
buffer-cli create-post-template
Argument | Required | Type | Details |
| No; body and guard rules apply | string | The main content body of the template, may contain {{placeholders}}. |
| No; body and guard rules apply | string | A short user-facing description of the template. Nullable for backwards-compat at the GraphQL boundary — the resolver rejects null/empty values with a clear input error so the underlying storage contract (non-empty string) is still honored. |
| No; body and guard rules apply | string | The emoji associated with the template. |
| No; body and guard rules apply | string | Organization the template belongs to. The caller must be a member of this organization. For |
| No; body and guard rules apply | string | The title of the template. |
| No; body and guard rules apply | string | Defaults to |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | boolean | Set true only when the user asked for exactly this action. |
Native input requirements: body, organizationId, title. Use individual fields or complete payload/payload_file.
Default upstream fields: __typename, postTemplate.id, postTemplate.body, postTemplate.description, postTemplate.emoji, postTemplate.organizationId, postTemplate.title, postTemplate.visibility, postTemplate.createdAt, postTemplate.updatedAt, message. Inspect get_operation_schema for every selectable path.
get_daily_posting_limits
buffer-cli get-daily-posting-limits
Argument | Required | Type | Details |
| No; body and guard rules apply | array | List of channel IDs to check limits for. All channels must belong to the same organization. Items: string. |
| No; body and guard rules apply | string | The date to check limits for. Defaults to today if not provided. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
Native input requirements: channelIds. Use individual fields or complete payload/payload_file.
Default upstream fields: channelId, isAtLimit, limit, scheduled, sent. Inspect get_operation_schema for every selectable path.
delete_content_item
buffer-cli delete-content-item
Argument | Required | Type | Details |
| No; body and guard rules apply | string | The content item to delete. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | boolean | Set true only when the user asked for exactly this action. |
Native input requirements: id. Use individual fields or complete payload/payload_file.
Default upstream fields: __typename, _empty, errors.channelId, errors.message, message. Inspect get_operation_schema for every selectable path.
delete_post
buffer-cli delete-post
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Post id to delete. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | boolean | Set true only when the user asked for exactly this action. |
Native input requirements: id. Use individual fields or complete payload/payload_file.
Default upstream fields: __typename, id, message. Inspect get_operation_schema for every selectable path.
delete_post_template
buffer-cli delete-post-template
Argument | Required | Type | Details |
| No; body and guard rules apply | string | The ID of the template to delete. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | boolean | Set true only when the user asked for exactly this action. |
Native input requirements: id. Use individual fields or complete payload/payload_file.
Default upstream fields: __typename, _empty, message. Inspect get_operation_schema for every selectable path.
edit_post
buffer-cli edit-post
Argument | Required | Type | Details |
| No; body and guard rules apply | string | ID of the post to edit |
| No; body and guard rules apply | boolean | If this post was edited with the help of AI |
| No; body and guard rules apply | string | Change the post's approval state alongside this edit. Leave unset to keep the post's current approval state. Only valid when your posting policy on the post's channel requires approval, and only on your own drafts. Asking for the state the post is already in does nothing. Values: |
| No; body and guard rules apply | array | Ordered list of assets on this post. Omit to preserve the existing list, pass an empty array to clear it Items: object. |
| No; body and guard rules apply | string | Is set when the Post is generated from a Draft |
| No; body and guard rules apply | string | Date when the post is scheduled to be published |
| No; body and guard rules apply | string | Is set when the Post is generated from an Idea |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | How the post is being scheduled. Omit the field or pass null to make no scheduling change — null does not clear or reset the schedule: a scheduled post keeps its current share mode, queue slot, and any custom time, and the edit applies only the other provided fields. Pass a non-null ShareMode to apply that mode. Values: |
| No; body and guard rules apply | boolean | If true, saves the post as a draft instead of keeping it scheduled. When saving as draft: - Post status will be 'draft' instead of 'buffer' - The post will not be published until explicitly scheduled |
| No; body and guard rules apply | string | Scheduling type to indicate notification publishing or automatic publishing. Omit it, or send null, to leave the post publishing the way it already does. Values: |
| No; body and guard rules apply | string | source where the composer was initiated from, used for tracking. |
| No; body and guard rules apply | array | tags Items: string. |
| No; body and guard rules apply | string | Text content of the Post. Omit the field to keep the current text; pass an empty string or null to clear it. Note: for threaded posts, this needs to match the first item in the |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | boolean | Set true only when the user asked for exactly this action. |
Native input requirements: id. Use individual fields or complete payload/payload_file.
Default upstream fields: __typename, post.id, post.allowedActions, post.assets.__typename, post.assets.id, post.assets.mimeType, post.assets.source, post.assets.thumbnail, post.assets.type, post.author.id, post.author.avatar, post.author.email, post.author.isDeleted, post.author.name, post.author.urn, post.channel.id, post.channel.allowedActions, post.channel.avatar, post.channel.descriptor, post.channel.displayName, post.channel.externalLink, post.channel.hasActiveMemberDevice, post.channel.isDisconnected, post.channel.isLocked, post.channel.isNew, post.channel.isQueuePaused, post.channel.metadata.__typename, post.channel.metadata.defaultToReminders, post.channel.metadata.maxCharacters, post.channel.metadata.serverUrl, post.channel.metadata.subscriptionType, post.channel.metadata.shouldShowLinkedinAnalyticsRefreshBanner, post.channel.metadata.businessPortfolioId, post.channel.metadata.lastSubscribedAt, post.channel.metadata.phoneNumberId, post.channel.metadata.wabaId, post.channel.name, post.channel.organizationId, post.channel.products, post.channel.scopes, post.channel.service, post.channel.serviceId, post.channel.showTrendingTopicSuggestions, post.channel.timezone, post.channel.type, post.channel.createdAt, post.channel.updatedAt, post.channelId, post.channelService, post.contentItemId, post.dueAt, post.error.message, post.error.rawError, post.error.supportUrl, post.externalLink, post.ideaId, post.isCustomScheduled, post.metadata.__typename, post.metadata.firstComment, post.metadata.isAiGenerated, post.metadata.link, post.metadata.shouldShareToFeed, post.metadata.type, post.metadata.title, post.metadata.threadCount, post.metadata.url, post.metadata.details.__typename, post.metadata.details.button, post.metadata.details.link, post.metadata.details.code, post.metadata.details.endDate, post.metadata.details.startDate, post.metadata.details.terms, post.metadata.details.title, post.metadata.details.endTime, post.metadata.details.isFullDayEvent, post.metadata.details.startTime, post.metadata.embeddable, post.metadata.license, post.metadata.madeForKids, post.metadata.notifySubscribers, post.metadata.privacy, post.metadata.spoilerText, post.metadata.locationId, post.metadata.locationName, post.metadata.topic, post.metrics.description, post.metrics.name, post.metrics.type, post.metrics.unit, post.metrics.value, post.metricsUpdatedAt, post.notes.id, post.notes.allowedActions, post.notes.text, post.notes.type, post.notes.createdAt, post.notes.updatedAt, post.notificationStatus, post.schedulingType, post.sentAt, post.sharedNow, post.shareMode, post.status, post.tags.id, post.tags.color, post.tags.colorName, post.tags.isLocked, post.tags.name, post.text, post.via, post.createdAt, post.updatedAt, message, code, link. Inspect get_operation_schema for every selectable path.
get_idea_groups
buffer-cli get-idea-groups
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Unique identifier for the organization. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
Native input requirements: organizationId. Use individual fields or complete payload/payload_file.
Default upstream fields: id, name, isLocked. Inspect get_operation_schema for every selectable path.
get_ideas
buffer-cli get-ideas
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | The organization to fetch ideas from. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | integer | Local page-size cap 100, default 25; provider may impose additional query limits. minimum: |
| No; body and guard rules apply | string | Opaque cursor from pageInfo.endCursor. One page per ordinary call. maxLength: |
Native input requirements: organizationId. Use individual fields or complete payload/payload_file.
Default upstream fields: items.id, items.content.aiAssisted, items.content.date, items.content.services, items.content.text, items.content.title, items.groupId, items.organizationId, items.position, items.createdAt, items.updatedAt, pageInfo.endCursor, pageInfo.hasNextPage, pageInfo.hasPreviousPage, pageInfo.startCursor. Inspect get_operation_schema for every selectable path.
get_instagram_audio
buffer-cli get-instagram-audio
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Meta audio asset ID |
| No; body and guard rules apply | string | Instagram channel used to authorize the refresh |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
Native input requirements: audioId, channelId. Use individual fields or complete payload/payload_file.
Default upstream fields: __typename, audio.id, audio.coverArtworkUrl, audio.creatorUsername, audio.displayArtist, audio.duration, audio.previewUrl, audio.title, audio.type, channelIds, message. Inspect get_operation_schema for every selectable path.
move_post_in_queue
buffer-cli move-post-in-queue
Argument | Required | Type | Details |
| No; body and guard rules apply | string | ID of the post to move. |
| No; body and guard rules apply | string | Target position within the channel's queue. Values: |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | boolean | Set true only when the user asked for exactly this action. |
Native input requirements: id, position. Use individual fields or complete payload/payload_file.
Default upstream fields: __typename, post.id, post.allowedActions, post.assets.__typename, post.assets.id, post.assets.mimeType, post.assets.source, post.assets.thumbnail, post.assets.type, post.author.id, post.author.avatar, post.author.email, post.author.isDeleted, post.author.name, post.author.urn, post.channel.id, post.channel.allowedActions, post.channel.avatar, post.channel.descriptor, post.channel.displayName, post.channel.externalLink, post.channel.hasActiveMemberDevice, post.channel.isDisconnected, post.channel.isLocked, post.channel.isNew, post.channel.isQueuePaused, post.channel.metadata.__typename, post.channel.metadata.defaultToReminders, post.channel.metadata.maxCharacters, post.channel.metadata.serverUrl, post.channel.metadata.subscriptionType, post.channel.metadata.shouldShowLinkedinAnalyticsRefreshBanner, post.channel.metadata.businessPortfolioId, post.channel.metadata.lastSubscribedAt, post.channel.metadata.phoneNumberId, post.channel.metadata.wabaId, post.channel.name, post.channel.organizationId, post.channel.products, post.channel.scopes, post.channel.service, post.channel.serviceId, post.channel.showTrendingTopicSuggestions, post.channel.timezone, post.channel.type, post.channel.createdAt, post.channel.updatedAt, post.channelId, post.channelService, post.contentItemId, post.dueAt, post.error.message, post.error.rawError, post.error.supportUrl, post.externalLink, post.ideaId, post.isCustomScheduled, post.metadata.__typename, post.metadata.firstComment, post.metadata.isAiGenerated, post.metadata.link, post.metadata.shouldShareToFeed, post.metadata.type, post.metadata.title, post.metadata.threadCount, post.metadata.url, post.metadata.details.__typename, post.metadata.details.button, post.metadata.details.link, post.metadata.details.code, post.metadata.details.endDate, post.metadata.details.startDate, post.metadata.details.terms, post.metadata.details.title, post.metadata.details.endTime, post.metadata.details.isFullDayEvent, post.metadata.details.startTime, post.metadata.embeddable, post.metadata.license, post.metadata.madeForKids, post.metadata.notifySubscribers, post.metadata.privacy, post.metadata.spoilerText, post.metadata.locationId, post.metadata.locationName, post.metadata.topic, post.metrics.description, post.metrics.name, post.metrics.type, post.metrics.unit, post.metrics.value, post.metricsUpdatedAt, post.notes.id, post.notes.allowedActions, post.notes.text, post.notes.type, post.notes.createdAt, post.notes.updatedAt, post.notificationStatus, post.schedulingType, post.sentAt, post.sharedNow, post.shareMode, post.status, post.tags.id, post.tags.color, post.tags.colorName, post.tags.isLocked, post.tags.name, post.text, post.via, post.createdAt, post.updatedAt, message. Inspect get_operation_schema for every selectable path.
get_post
buffer-cli get-post
Argument | Required | Type | Details |
| No; body and guard rules apply | string | The ID of the post to be retrieved |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
Native input requirements: id. Use individual fields or complete payload/payload_file.
Default upstream fields: id, text, status, channel.name, channel.id, createdAt. Inspect get_operation_schema for every selectable path.
get_posts
buffer-cli get-posts
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | The Organization id to fetch posts for |
| No; body and guard rules apply | array | The sort to apply to the posts results Items: object. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | integer | Local page-size cap 100, default 25; provider may impose additional query limits. minimum: |
| No; body and guard rules apply | string | Opaque cursor from pageInfo.endCursor. One page per ordinary call. maxLength: |
Native input requirements: organizationId. Use individual fields or complete payload/payload_file.
Default upstream fields: items.id, items.text, items.status, pageInfo. Inspect get_operation_schema for every selectable path.
get_post_template
buffer-cli get-post-template
Argument | Required | Type | Details |
| No; body and guard rules apply | string | The unique identifier of the template to fetch. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
Native input requirements: id. Use individual fields or complete payload/payload_file.
Default upstream fields: id, body, description, emoji, organizationId, title, visibility, createdAt, updatedAt. Inspect get_operation_schema for every selectable path.
get_post_templates
buffer-cli get-post-templates
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | Organization to scope |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | integer | Local page-size cap 100, default 25; provider may impose additional query limits. minimum: |
| No; body and guard rules apply | string | Opaque cursor from pageInfo.endCursor. One page per ordinary call. maxLength: |
Native input requirements: organizationId. Use individual fields or complete payload/payload_file.
Default upstream fields: items.id, items.body, items.description, items.emoji, items.organizationId, items.title, items.visibility, items.createdAt, items.updatedAt, pageInfo.endCursor, pageInfo.hasNextPage, pageInfo.hasPreviousPage, pageInfo.startCursor. Inspect get_operation_schema for every selectable path.
promote_content_item_draft_to_posts
buffer-cli promote-content-item-draft-to-posts
Argument | Required | Type | Details |
| No; body and guard rules apply | string | The content item to promote. |
| No; body and guard rules apply | array | The channel-specific posts to create, one per channel. Provide at least one post, and at most one post per channel. Items: object. |
| No; body and guard rules apply | array | Tags to apply to this content item. Omit to keep the current tags. An empty list or null removes them all. Items: string. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | boolean | Set true only when the user asked for exactly this action. |
Native input requirements: id, posts. Use individual fields or complete payload/payload_file.
Default upstream fields: __typename, contentItem.id, contentItem.accountId, contentItem.allowedActions, contentItem.author.id, contentItem.author.avatar, contentItem.author.email, contentItem.author.isDeleted, contentItem.author.name, contentItem.author.urn, contentItem.body.__typename, contentItem.body.id, contentItem.body.aiAssisted, contentItem.body.assets.__typename, contentItem.body.assets.id, contentItem.body.assets.mimeType, contentItem.body.assets.source, contentItem.body.assets.thumbnail, contentItem.body.assets.type, contentItem.body.text, contentItem.organizationId, contentItem.tags.id, contentItem.tags.color, contentItem.tags.colorName, contentItem.tags.isLocked, contentItem.tags.name, contentItem.targetDate, contentItem.title, contentItem.createdAt, errors.__typename, errors.message, errors.channelId, message. Inspect get_operation_schema for every selectable path.
remove_post_from_content_item
buffer-cli remove-post-from-content-item
Argument | Required | Type | Details |
| No; body and guard rules apply | string | The content item to remove the post from. |
| No; body and guard rules apply | string | The post to remove from a content item. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | boolean | Set true only when the user asked for exactly this action. |
Native input requirements: id, postId. Use individual fields or complete payload/payload_file.
Default upstream fields: __typename, contentItem.id, contentItem.accountId, contentItem.allowedActions, contentItem.author.id, contentItem.author.avatar, contentItem.author.email, contentItem.author.isDeleted, contentItem.author.name, contentItem.author.urn, contentItem.body.__typename, contentItem.body.id, contentItem.body.aiAssisted, contentItem.body.assets.__typename, contentItem.body.assets.id, contentItem.body.assets.mimeType, contentItem.body.assets.source, contentItem.body.assets.thumbnail, contentItem.body.assets.type, contentItem.body.text, contentItem.organizationId, contentItem.tags.id, contentItem.tags.color, contentItem.tags.colorName, contentItem.tags.isLocked, contentItem.tags.name, contentItem.targetDate, contentItem.title, contentItem.createdAt, post.id, post.allowedActions, post.assets.__typename, post.assets.id, post.assets.mimeType, post.assets.source, post.assets.thumbnail, post.assets.type, post.author.id, post.author.avatar, post.author.email, post.author.isDeleted, post.author.name, post.author.urn, post.channel.id, post.channel.allowedActions, post.channel.avatar, post.channel.descriptor, post.channel.displayName, post.channel.externalLink, post.channel.hasActiveMemberDevice, post.channel.isDisconnected, post.channel.isLocked, post.channel.isNew, post.channel.isQueuePaused, post.channel.metadata.__typename, post.channel.metadata.defaultToReminders, post.channel.metadata.maxCharacters, post.channel.metadata.serverUrl, post.channel.metadata.subscriptionType, post.channel.metadata.shouldShowLinkedinAnalyticsRefreshBanner, post.channel.metadata.businessPortfolioId, post.channel.metadata.lastSubscribedAt, post.channel.metadata.phoneNumberId, post.channel.metadata.wabaId, post.channel.name, post.channel.organizationId, post.channel.products, post.channel.scopes, post.channel.service, post.channel.serviceId, post.channel.showTrendingTopicSuggestions, post.channel.timezone, post.channel.type, post.channel.createdAt, post.channel.updatedAt, post.channelId, post.channelService, post.contentItemId, post.dueAt, post.error.message, post.error.rawError, post.error.supportUrl, post.externalLink, post.ideaId, post.isCustomScheduled, post.metadata.__typename, post.metadata.firstComment, post.metadata.isAiGenerated, post.metadata.link, post.metadata.shouldShareToFeed, post.metadata.type, post.metadata.title, post.metadata.threadCount, post.metadata.url, post.metadata.details.__typename, post.metadata.details.button, post.metadata.details.link, post.metadata.details.code, post.metadata.details.endDate, post.metadata.details.startDate, post.metadata.details.terms, post.metadata.details.title, post.metadata.details.endTime, post.metadata.details.isFullDayEvent, post.metadata.details.startTime, post.metadata.embeddable, post.metadata.license, post.metadata.madeForKids, post.metadata.notifySubscribers, post.metadata.privacy, post.metadata.spoilerText, post.metadata.locationId, post.metadata.locationName, post.metadata.topic, post.metrics.description, post.metrics.name, post.metrics.type, post.metrics.unit, post.metrics.value, post.metricsUpdatedAt, post.notes.id, post.notes.allowedActions, post.notes.text, post.notes.type, post.notes.createdAt, post.notes.updatedAt, post.notificationStatus, post.schedulingType, post.sentAt, post.sharedNow, post.shareMode, post.status, post.tags.id, post.tags.color, post.tags.colorName, post.tags.isLocked, post.tags.name, post.text, post.via, post.createdAt, post.updatedAt, message. Inspect get_operation_schema for every selectable path.
get_search_instagram_audio
buffer-cli get-search-instagram-audio
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Music or original sound catalog Values: |
| No; body and guard rules apply | string | Instagram channel to search audio for |
| No; body and guard rules apply | string | Search text. Required. Use trendingInstagramAudio for trending results. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
Native input requirements: audioType, channelId, query. Use individual fields or complete payload/payload_file.
Default upstream fields: __typename, audio.id, audio.coverArtworkUrl, audio.creatorUsername, audio.displayArtist, audio.duration, audio.previewUrl, audio.title, audio.type, channelIds, message. Inspect get_operation_schema for every selectable path.
get_tag
buffer-cli get-tag
Argument | Required | Type | Details |
| No; body and guard rules apply | string | The unique identifier of the tag to fetch. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
Native input requirements: id. Use individual fields or complete payload/payload_file.
Default upstream fields: id, color, colorName, isLocked, name. Inspect get_operation_schema for every selectable path.
get_tags_v2
buffer-cli get-tags-v2
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | Organization to list tags for. The caller must be a member of this organization. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | integer | Local page-size cap 100, default 25; provider may impose additional query limits. minimum: |
| No; body and guard rules apply | string | Opaque cursor from pageInfo.endCursor. One page per ordinary call. maxLength: |
Native input requirements: organizationId. Use individual fields or complete payload/payload_file.
Default upstream fields: items.id, items.color, items.colorName, items.isLocked, items.name, pageInfo.endCursor, pageInfo.hasNextPage, pageInfo.hasPreviousPage, pageInfo.startCursor. Inspect get_operation_schema for every selectable path.
get_trending_instagram_audio
buffer-cli get-trending-instagram-audio
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Music or original sound catalog Values: |
| No; body and guard rules apply | string | Instagram channel to load trending audio for |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
Native input requirements: audioType, channelId. Use individual fields or complete payload/payload_file.
Default upstream fields: __typename, audio.id, audio.coverArtworkUrl, audio.creatorUsername, audio.displayArtist, audio.duration, audio.previewUrl, audio.title, audio.type, channelIds, message. Inspect get_operation_schema for every selectable path.
update_content_item
buffer-cli update-content-item
Argument | Required | Type | Details |
| No; body and guard rules apply | string | The content item to update. |
| No; body and guard rules apply | string | Omit to preserve the existing target date. Null clears it. |
| No; body and guard rules apply | string | Omit to preserve the existing title. Null clears it. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | boolean | Set true only when the user asked for exactly this action. |
Native input requirements: id. Use individual fields or complete payload/payload_file.
Default upstream fields: __typename, contentItem.id, contentItem.accountId, contentItem.allowedActions, contentItem.author.id, contentItem.author.avatar, contentItem.author.email, contentItem.author.isDeleted, contentItem.author.name, contentItem.author.urn, contentItem.body.__typename, contentItem.body.id, contentItem.body.aiAssisted, contentItem.body.assets.__typename, contentItem.body.assets.id, contentItem.body.assets.mimeType, contentItem.body.assets.source, contentItem.body.assets.thumbnail, contentItem.body.assets.type, contentItem.body.text, contentItem.organizationId, contentItem.tags.id, contentItem.tags.color, contentItem.tags.colorName, contentItem.tags.isLocked, contentItem.tags.name, contentItem.targetDate, contentItem.title, contentItem.createdAt, errors.message, message. Inspect get_operation_schema for every selectable path.
update_content_item_draft
buffer-cli update-content-item-draft
Argument | Required | Type | Details |
| No; body and guard rules apply | string | The content item whose channel-less draft is replaced. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | array | Tags to apply to this content item. Omit to keep the current tags. An empty list or null removes them all. Items: string. |
| No; body and guard rules apply | string | Date indicating when this piece of content should go out. This is a planning aid only and does not schedule any posts. Omit to preserve the existing target date. Null clears it. |
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | boolean | Set true only when the user asked for exactly this action. |
Native input requirements: id, draft. Use individual fields or complete payload/payload_file.
Default upstream fields: __typename, contentItem.id, contentItem.accountId, contentItem.allowedActions, contentItem.author.id, contentItem.author.avatar, contentItem.author.email, contentItem.author.isDeleted, contentItem.author.name, contentItem.author.urn, contentItem.body.__typename, contentItem.body.id, contentItem.body.aiAssisted, contentItem.body.assets.__typename, contentItem.body.assets.id, contentItem.body.assets.mimeType, contentItem.body.assets.source, contentItem.body.assets.thumbnail, contentItem.body.assets.type, contentItem.body.text, contentItem.organizationId, contentItem.tags.id, contentItem.tags.color, contentItem.tags.colorName, contentItem.tags.isLocked, contentItem.tags.name, contentItem.targetDate, contentItem.title, contentItem.createdAt, errors.__typename, errors.message, message. Inspect get_operation_schema for every selectable path.
update_post_template
buffer-cli update-post-template
Argument | Required | Type | Details |
| No; body and guard rules apply | string | The ID of the template to update. |
| No; body and guard rules apply | string | The main content body of the template, may contain {{placeholders}}. |
| No; body and guard rules apply | string | A short user-facing description of the template. |
| No; body and guard rules apply | string | The emoji associated with the template. |
| No; body and guard rules apply | string | The title of the template. |
| No; body and guard rules apply | string |
|
| No; body and guard rules apply | object | Complete native input object instead of individual input fields. |
| No; body and guard rules apply | string | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. minLength: |
| No; body and guard rules apply | array | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. minItems: |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | boolean | Set true only when the user asked for exactly this action. |
Native input requirements: id. Use individual fields or complete payload/payload_file.
Default upstream fields: __typename, postTemplate.id, postTemplate.body, postTemplate.description, postTemplate.emoji, postTemplate.organizationId, postTemplate.title, postTemplate.visibility, postTemplate.createdAt, postTemplate.updatedAt, message. Inspect get_operation_schema for every selectable path.
list_accounts
buffer-cli list-accounts
Argument | Required | Type | Details |
None | No | None | No arguments |
graphql_query
buffer-cli graphql-query
Argument | Required | Type | Details |
| Yes | string | See the full input schema. minLength: |
| No; body and guard rules apply | object | Native JSON variables; validated remotely by Buffer. |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
graphql_mutation
buffer-cli graphql-mutation
Argument | Required | Type | Details |
| Yes | string | See the full input schema. minLength: |
| No; body and guard rules apply | object | Native JSON variables; validated remotely by Buffer. |
| No; body and guard rules apply | string | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. minLength: |
| No; body and guard rules apply | boolean | Set true only when the user asked for exactly this action. |
preview_operation
buffer-cli preview-operation
Argument | Required | Type | Details |
| Yes | string | See the full input schema. Values: |
| Yes | object | Arguments for that named tool. Provide all required native input, including organizationId; profile defaults are not read. |
query_pages
buffer-cli query-pages
Argument | Required | Type | Details |
| Yes | string | See the full input schema. Values: |
| Yes | object | Arguments for the native read tool, including filters, fields, first/after and account. |
| No; body and guard rules apply | integer | See the full input schema. minimum: |
get_operation_schema
buffer-cli get-operation-schema
Argument | Required | Type | Details |
| Yes | string | See the full input schema. Values: |
Nested native input definitions
These tables preserve the current nested object/array structures, required fields, enums and constraints. Repeated identical shapes are shown once; full inline schema remains available for each command.
addPostToContentItem.input
Argument | Required | Type | Details |
| Yes | string | The content item to add the post to. |
| Yes | string | The post to add. The post must already exist. The post and the content item must belong to the same organization. |
aggregatedPostMetrics.input
Argument | Required | Type | Details |
| No; body and guard rules apply | array | Optional list of channel IDs to filter by. When omitted (null), the aggregate spans every channel in the organization the actor has insights access to. When set to an empty array, no channels match and the result is empty. Items: string. |
| Yes | string | End of the aggregation window. Consumers typically pass UTC midnight of the last calendar day in the window (the backend treats the range as inclusive of that day), for example |
| Yes | string | The organization ID |
| Yes | string | Start of the aggregation window. Consumers typically pass UTC midnight of the first calendar day in the window, for example |
| No; body and guard rules apply | object | See the full input schema. |
aggregatedPostMetrics.input.tags
Argument | Required | Type | Details |
| Yes | array | Include results that have any of the specified tags (union/OR). Items: string. |
| No; body and guard rules apply | boolean | When true, include results that have no tags assigned. Can be combined with 'in' for union filtering. Defaults to false if not specified. |
channel.input
Argument | Required | Type | Details |
| Yes | string | The ID of the channel to be retrieved |
channels.input
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| Yes | string | The Organization id to fetch channels for |
channels.input.filter
Argument | Required | Type | Details |
| No; body and guard rules apply | boolean | If not defined, it returns all channels Else, if true, it only returns locked channels if false, it only returns not locked channels |
| No; body and guard rules apply | string | If not passed, it return all channels Else, it filters the channels based on what the product supports. Values: |
configuration.input
Argument | Required | Type | Details |
| Yes | string | The organization to return configuration for. |
contentItem.input
Argument | Required | Type | Details |
| Yes | string | The unique identifier of the content item to fetch. |
contentItems.input
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| Yes | string | Organization to list content items for. The caller must be a member of this organization. |
| No; body and guard rules apply | array | Sorting to apply, each entry breaking ties in the one before it. Defaults to newest first. A pagination cursor is only valid for the sort that produced it, so reset |
contentItems.input.filter
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Only return content items with this content status. When omitted, content items in every status are returned. Values: |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
contentItems.input.filter.targetDate
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Only return content items by whether a target date is set: |
| No; body and guard rules apply | object | See the full input schema. |
contentItems.input.filter.targetDate.range
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Include results with dates equal to or before the specified date |
| No; body and guard rules apply | string | Include results with dates equal to or after the specified date |
contentItems.input.sort[]
Argument | Required | Type | Details |
| Yes | string | The direction to sort by. Values: |
| Yes | string | The field to sort by. Values: |
createContentItem.input
Argument | Required | Type | Details |
| Yes | string | Organization that owns the content item and all variants created in it. |
| Yes | array | The channel-specific post variants to create, one per channel. Provide at least one variant, and at most one variant per channel. Items: object. |
| No; body and guard rules apply | array | Tags to apply to this content item. Omit to create it with no tags. Items: string. |
| No; body and guard rules apply | string | Optional date indicating when this piece of content should go out. This is a planning aid only and does not schedule any posts. |
| No; body and guard rules apply | string | Optional title describing what this piece of content is about. |
createContentItem.input.posts[]
Argument | Required | Type | Details |
| No; body and guard rules apply | boolean | If this post was created with the help of AI |
| No; body and guard rules apply | array | Ordered list of assets on this post. Items: object. |
| Yes | string | Channel's Id for which we want to create the post |
| No; body and guard rules apply | string | Is set when the Post is generated from a Draft |
| No; body and guard rules apply | string | Date when the post is scheduled to be published |
| No; body and guard rules apply | string | Is set when the Post is generated from an Idea |
| No; body and guard rules apply | object | See the full input schema. |
| Yes | string | How the post is being scheduled. Values: |
| No; body and guard rules apply | boolean | Submit the post for approval instead of scheduling it. A post submitted for approval is always a draft, so this conflicts with turning |
| No; body and guard rules apply | boolean | If true, saves the post as a draft instead of scheduling it. When saving as draft: - Post status will be 'draft' instead of 'buffer' - Posting limits are not checked - The post will not be published until explicitly scheduled |
| Yes | string | Scheduling type to indicate notification publishing or automatic publishing Values: |
| No; body and guard rules apply | string | source where the composer was initiated from, used for tracking. |
| No; body and guard rules apply | array | List of tag IDs Items: string. |
| No; body and guard rules apply | string | Text content of the Post. Note: for threaded posts, this needs to match the first item in the |
createContentItem.input.posts[].assets[]
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
createContentItem.input.posts[].assets[].document
Argument | Required | Type | Details |
| Yes | string | Document thumbnail URL |
| Yes | string | Document title |
| Yes | string | Document URL |
createContentItem.input.posts[].assets[].image
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | URL to the static thumbnail of the asset |
| Yes | string | URL to the file source |
createContentItem.input.posts[].assets[].image.metadata
Argument | Required | Type | Details |
| Yes | string | Alternative text for accessibility |
| No; body and guard rules apply | string | Animated thumbnail URL |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | array | Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput. Items: object. |
createContentItem.input.posts[].assets[].image.metadata.dimensions
Argument | Required | Type | Details |
| Yes | integer | Image height in pixels |
| Yes | integer | Image width in pixels |
createContentItem.input.posts[].assets[].image.metadata.userTags[]
Argument | Required | Type | Details |
| Yes | string | The handle (username) of the account to tag, without the leading @. |
| Yes | number | Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width. |
| Yes | number | Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height. |
createContentItem.input.posts[].assets[].link
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Description of the link |
| No; body and guard rules apply | string | Thumbnail URL of the link |
| No; body and guard rules apply | string | Title of the link |
| Yes | string | URL to the link |
createContentItem.input.posts[].assets[].video
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | Do not use: social networks do not accept custom video thumbnail images, and the API rejects video assets that set this field. To choose the video thumbnail, set |
| Yes | string | URL to the file source |
createContentItem.input.posts[].assets[].video.metadata
Argument | Required | Type | Details |
| No; body and guard rules apply | integer | Offset of the thumbnail chosen for the video, in ms |
| No; body and guard rules apply | string | Video title |
createContentItem.input.posts[].metadata
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
createContentItem.input.posts[].metadata.bluesky
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | array | The ordered list of posts that make up the thread (not paginated). This array is the source of truth for what gets published: every post in the thread, including the root post, must be provided here. Posts are published in order, each replying to the previous one. The first item is the root post and should match the top-level |
createContentItem.input.posts[].metadata.bluesky.linkAttachment
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Description shown on the link card |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | Title shown on the link card |
| Yes | string | URL that the link asset has been built from |
createContentItem.input.posts[].metadata.bluesky.linkAttachment.thumbnail
Argument | Required | Type | Details |
| Yes | string | URL of the thumbnail image |
createContentItem.input.posts[].metadata.bluesky.thread[]
Argument | Required | Type | Details |
| No; body and guard rules apply | array | Ordered list of assets on this threaded post Items: object. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | The text body content of the threaded post |
createContentItem.input.posts[].metadata.facebook
Argument | Required | Type | Details |
| No; body and guard rules apply | array | Annotations representing entities in the text Items: object. |
| No; body and guard rules apply | string | Facebook post's first comment |
| No; body and guard rules apply | object | See the full input schema. |
| Yes | string | The channel-specific type of the post, eg, post, story, reel for Facebook Values: |
createContentItem.input.posts[].metadata.facebook.annotations[]
Argument | Required | Type | Details |
| Yes | string | The content of the annotation, e.g. '107509875938399' |
| Yes | array | The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text) Items: integer. |
| Yes | string | The text representation of the annotation, eg 'Buffer' |
| Yes | string | The URL the annotation points to, e.g. https://www.facebook.com/107509875938399 |
createContentItem.input.posts[].metadata.google
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | Title if available in the given GBP post type: event and offer |
| Yes | string | The channel-specific type of the post, eg, post, offer, event for Google Business Profile Values: |
createContentItem.input.posts[].metadata.google.detailsEvent
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Action button. Optional: a post with no button, or |
| No; body and guard rules apply | string | End date of the event. Required on create; optional on edit (omitted preserves existing value). |
| Yes | boolean | Indicate whether the event has a start or end time. |
| No; body and guard rules apply | string | Link to the action |
| No; body and guard rules apply | string | Start date of the event. Required on create; optional on edit (omitted preserves existing value). |
| No; body and guard rules apply | string | Title of the event. Required on create; optional on edit (omitted preserves existing value). |
createContentItem.input.posts[].metadata.google.detailsOffer
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Coupon code for the offer |
| No; body and guard rules apply | string | End date of the offer. Required on create; optional on edit (omitted preserves existing value). |
| No; body and guard rules apply | string | Link to the offer |
| No; body and guard rules apply | string | Start date of the offer. Required on create; optional on edit (omitted preserves existing value). |
| No; body and guard rules apply | string | Terms and Conditions |
| No; body and guard rules apply | string | Title of the offer. Required on create; optional on edit (omitted preserves existing value). |
createContentItem.input.posts[].metadata.google.detailsWhatsNew
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Action button. Optional: a post with no button, or |
| No; body and guard rules apply | string | Link to the action |
createContentItem.input.posts[].metadata.instagram
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Instagram post's first comment |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | boolean | Whether the post discloses AI-generated content |
| No; body and guard rules apply | string | Shop Grid link for the post |
| Yes | boolean | Indicates whether post should be shared to feed |
| No; body and guard rules apply | object | See the full input schema. |
| Yes | string | The channel-specific type of the post, eg, post, story, reel for Instagram Values: |
createContentItem.input.posts[].metadata.instagram.geolocation
Argument | Required | Type | Details |
| No; body and guard rules apply | string | The id of this location |
| No; body and guard rules apply | string | The name of this location |
createContentItem.input.posts[].metadata.instagram.stickerFields
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Placeholder text for the post's music |
| No; body and guard rules apply | string | Additional field for any other post content |
| No; body and guard rules apply | string | Placeholder text for the post's linked products |
| No; body and guard rules apply | string | Text for the Story or Reel |
| No; body and guard rules apply | string | Placeholder text for the post's topics (Reels only) |
createContentItem.input.posts[].metadata.linkedin
Argument | Required | Type | Details |
| No; body and guard rules apply | array | Annotations representing entities in the text Items: object. |
| No; body and guard rules apply | string | LinkedIn post's first comment |
| No; body and guard rules apply | object | See the full input schema. |
createContentItem.input.posts[].metadata.linkedin.annotations[]
Argument | Required | Type | Details |
| Yes | string | The id of the annotation, e.g. 1521226 |
| Yes | string | The entity of the annotation, e.g. urn:li:organization:1521226 |
| Yes | integer | The length of the annotation, e.g. 6 |
| Yes | string | The link of the annotation, e.g. https://www.linkedin.com/company/bufferapp |
| Yes | string | The localized name of the annotation, e.g. Buffer |
| Yes | integer | The start of the annotation, e.g. 5 |
| Yes | string | The vanity name of the annotation, e.g. bufferapp |
createContentItem.input.posts[].metadata.mastodon
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Spoiler text hiding the root text of this post |
| No; body and guard rules apply | array | The ordered list of posts that make up the thread (not paginated). This array is the source of truth for what gets published: every post in the thread, including the root post, must be provided here. Posts are published in order, each replying to the previous one. The first item is the root post and should match the top-level |
createContentItem.input.posts[].metadata.pinterest
Argument | Required | Type | Details |
| No; body and guard rules apply | string | The board ID of the Pin, can be obtained when fetching the channel details with the following query: |
| No; body and guard rules apply | string | The title of the Pin |
| No; body and guard rules apply | string | The Pin destination link |
createContentItem.input.posts[].metadata.substack
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
createContentItem.input.posts[].metadata.threads
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | LocationId associated with the post |
| No; body and guard rules apply | string | Location name associated with the post |
| No; body and guard rules apply | array | The ordered list of posts that make up the thread (not paginated). This array is the source of truth for what gets published: every post in the thread, including the root post, must be provided here. Posts are published in order, each replying to the previous one. The first item is the root post and should match the top-level |
| No; body and guard rules apply | string | Topic associated with the post |
| No; body and guard rules apply | string | The type of the post Values: |
createContentItem.input.posts[].metadata.tiktok
Argument | Required | Type | Details |
| No; body and guard rules apply | boolean | Whether the post discloses AI-generated content (TikTok video only) |
| No; body and guard rules apply | string | The title of the TikTok post (for photo posts) |
createContentItem.input.posts[].metadata.twitter
Argument | Required | Type | Details |
| No; body and guard rules apply | boolean | Whether the post discloses AI-generated content (original tweets only, never retweets) |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | array | The ordered list of posts that make up the thread (not paginated). This array is the source of truth for what gets published: every post in the thread, including the root post, must be provided here. Posts are published in order, each replying to the previous one. The first item is the root post and should match the top-level |
createContentItem.input.posts[].metadata.twitter.retweet
Argument | Required | Type | Details |
| Yes | string | Retweet ID |
| No; body and guard rules apply | string | Optional user comment shown above the embedded retweet |
createContentItem.input.posts[].metadata.youtube
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Youtube Category ID, one ID of this list: ID: 1 -> Film & Animation ID: 2 -> Autos & Vehicles ID: 10 -> Music ID: 15 -> Pets & Animals ID: 17 -> Sports ID: 19 -> Travel & Events ID: 20 -> Gaming ID: 22 -> People & Blogs ID: 23 -> Comedy ID: 24 -> Entertainment ID: 25 -> News & Politics ID: 26 -> Howto & Style ID: 27 -> Education ID: 28 -> Science & Technology ID: 29 -> Nonprofits & Activism Required on create; optional on edit (omitted preserves existing value). |
| No; body and guard rules apply | boolean | Indicates whether the video allows embedding (default: true) |
| No; body and guard rules apply | boolean | Whether the post discloses AI-generated content |
| No; body and guard rules apply | string | Video license (default: youtube) Values: |
| No; body and guard rules apply | boolean | Indicates whether the video is suitable for kids (default: false) |
| No; body and guard rules apply | boolean | Indicates whether to notify subscribers on publish video (default: true) |
| No; body and guard rules apply | string | Privacy setting for post (default: public) Values: |
| No; body and guard rules apply | string | Title of the Youtube post. Required on create; optional on edit (omitted preserves existing value). |
createContentItemDraft.input
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Client-generated UUID that makes draft creation idempotent. A retry with the same UUID in the same organization returns the first content item in its current state. |
| Yes | object | See the full input schema. |
| Yes | string | Organization that will own the content item. |
| No; body and guard rules apply | array | Tags to apply to this content item. Omit to create it with no tags. Items: string. |
| No; body and guard rules apply | string | Optional date indicating when this piece of content should go out. This is a planning aid only and does not schedule any posts. |
| No; body and guard rules apply | string | Optional title describing what this piece of content is about. |
createContentItemDraft.input.draft
Argument | Required | Type | Details |
| No; body and guard rules apply | boolean | Set to true when the draft content was written with the help of AI. |
| No; body and guard rules apply | array | Images, videos, or documents to attach to the draft, in display order. Items: object. |
| Yes | string | The written content of the draft. Can be empty when the draft holds at least one asset. |
createIdea.input
Argument | Required | Type | Details |
| Yes | object | See the full input schema. |
| No; body and guard rules apply | string | Call-to-action identifier for analytics tracking |
| No; body and guard rules apply | object | See the full input schema. |
| Yes | string | Organization ID that will own the idea |
| No; body and guard rules apply | string | Template ID used to create the idea |
createIdea.input.content
Argument | Required | Type | Details |
| No; body and guard rules apply | boolean | Whether AI tools were used in creation |
| No; body and guard rules apply | string | Target date for the idea, often used for planning publish schedules |
| No; body and guard rules apply | array | List of media items to attach Items: object. |
| No; body and guard rules apply | array | Services associated with the idea for targeting specific platforms Items: string. |
| No; body and guard rules apply | array | Tags to categorize the idea Items: object. |
| No; body and guard rules apply | string | Main body text or description |
| No; body and guard rules apply | string | Title or headline of the idea |
createIdea.input.content.media[]
Argument | Required | Type | Details |
| Yes | string | The URL of the media |
| No; body and guard rules apply | string | Alternative text for the media |
| No; body and guard rules apply | string | Thumbnail URL for the media |
| Yes | string | The type of media (image, gif, video, link, document, unsupported). Note: 'video' is not supported via public API Values: |
| No; body and guard rules apply | integer | The size of the media in bytes |
| No; body and guard rules apply | object | See the full input schema. |
createIdea.input.content.media[].source
Argument | Required | Type | Details |
| Yes | string | See the full input schema. |
| No; body and guard rules apply | string | See the full input schema. |
| No; body and guard rules apply | string | See the full input schema. |
| No; body and guard rules apply | string | for unsplash only |
| No; body and guard rules apply | string | See the full input schema. |
createIdea.input.content.tags[]
Argument | Required | Type | Details |
| Yes | string | See the full input schema. |
| Yes | string | See the full input schema. |
| Yes | string | See the full input schema. |
createIdea.input.group
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Target group ID (null for unassigned group) |
| No; body and guard rules apply | string | ID of idea to place after (null for top position) |
createPost.input
Argument | Required | Type | Details |
| No; body and guard rules apply | boolean | If this post was created with the help of AI |
| No; body and guard rules apply | array | Ordered list of assets on this post. Items: object. |
| Yes | string | Channel's Id for which we want to create the post |
| No; body and guard rules apply | string | Is set when the Post is generated from a Draft |
| No; body and guard rules apply | string | Date when the post is scheduled to be published |
| No; body and guard rules apply | string | Is set when the Post is generated from an Idea |
| No; body and guard rules apply | object | See the full input schema. |
| Yes | string | How the post is being scheduled. Values: |
| No; body and guard rules apply | boolean | Submit the post for approval instead of scheduling it. A post submitted for approval is always a draft, so this conflicts with turning |
| No; body and guard rules apply | boolean | If true, saves the post as a draft instead of scheduling it. When saving as draft: - Post status will be 'draft' instead of 'buffer' - Posting limits are not checked - The post will not be published until explicitly scheduled |
| Yes | string | Scheduling type to indicate notification publishing or automatic publishing Values: |
| No; body and guard rules apply | string | source where the composer was initiated from, used for tracking. |
| No; body and guard rules apply | array | List of tag IDs Items: string. |
| No; body and guard rules apply | string | Text content of the Post. Note: for threaded posts, this needs to match the first item in the |
createPost.input.metadata
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
createPost.input.metadata.bluesky
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | array | The ordered list of posts that make up the thread (not paginated). This array is the source of truth for what gets published: every post in the thread, including the root post, must be provided here. Posts are published in order, each replying to the previous one. The first item is the root post and should match the top-level |
createPost.input.metadata.bluesky.thread[]
Argument | Required | Type | Details |
| No; body and guard rules apply | array | Ordered list of assets on this threaded post Items: object. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | The text body content of the threaded post |
createPost.input.metadata.bluesky.thread[].assets[]
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
createPost.input.metadata.bluesky.thread[].assets[].image
Argument | Required | Type | Details |
| No; body and guard rules apply | string | URL to the static thumbnail of the asset |
| Yes | string | URL to the file source |
createPost.input.metadata.bluesky.thread[].assets[].video
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Do not use: social networks do not accept custom video thumbnail images, and the API rejects video assets that set this field. To choose the video thumbnail, set |
| Yes | string | URL to the file source |
createPost.input.metadata.bluesky.thread[].metadata
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
createPost.input.metadata.mastodon
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Spoiler text hiding the root text of this post |
| No; body and guard rules apply | array | The ordered list of posts that make up the thread (not paginated). This array is the source of truth for what gets published: every post in the thread, including the root post, must be provided here. Posts are published in order, each replying to the previous one. The first item is the root post and should match the top-level |
createPost.input.metadata.threads
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | LocationId associated with the post |
| No; body and guard rules apply | string | Location name associated with the post |
| No; body and guard rules apply | array | The ordered list of posts that make up the thread (not paginated). This array is the source of truth for what gets published: every post in the thread, including the root post, must be provided here. Posts are published in order, each replying to the previous one. The first item is the root post and should match the top-level |
| No; body and guard rules apply | string | Topic associated with the post |
| No; body and guard rules apply | string | The type of the post Values: |
createPost.input.metadata.twitter
Argument | Required | Type | Details |
| No; body and guard rules apply | boolean | Whether the post discloses AI-generated content (original tweets only, never retweets) |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | array | The ordered list of posts that make up the thread (not paginated). This array is the source of truth for what gets published: every post in the thread, including the root post, must be provided here. Posts are published in order, each replying to the previous one. The first item is the root post and should match the top-level |
createPostTemplate.input
Argument | Required | Type | Details |
| Yes | string | The main content body of the template, may contain {{placeholders}}. |
| No; body and guard rules apply | string | A short user-facing description of the template. Nullable for backwards-compat at the GraphQL boundary — the resolver rejects null/empty values with a clear input error so the underlying storage contract (non-empty string) is still honored. |
| No; body and guard rules apply | string | The emoji associated with the template. |
| Yes | string | Organization the template belongs to. The caller must be a member of this organization. For |
| Yes | string | The title of the template. |
| No; body and guard rules apply | string | Defaults to |
dailyPostingLimits.input
Argument | Required | Type | Details |
| Yes | array | List of channel IDs to check limits for. All channels must belong to the same organization. Items: string. |
| No; body and guard rules apply | string | The date to check limits for. Defaults to today if not provided. |
deleteContentItem.input
Argument | Required | Type | Details |
| Yes | string | The content item to delete. |
deletePost.input
Argument | Required | Type | Details |
| Yes | string | Post id to delete. |
deletePostTemplate.input
Argument | Required | Type | Details |
| Yes | string | The ID of the template to delete. |
editPost.input
Argument | Required | Type | Details |
| Yes | string | ID of the post to edit |
| No; body and guard rules apply | boolean | If this post was edited with the help of AI |
| No; body and guard rules apply | string | Change the post's approval state alongside this edit. Leave unset to keep the post's current approval state. Only valid when your posting policy on the post's channel requires approval, and only on your own drafts. Asking for the state the post is already in does nothing. Values: |
| No; body and guard rules apply | array | Ordered list of assets on this post. Omit to preserve the existing list, pass an empty array to clear it Items: object. |
| No; body and guard rules apply | string | Is set when the Post is generated from a Draft |
| No; body and guard rules apply | string | Date when the post is scheduled to be published |
| No; body and guard rules apply | string | Is set when the Post is generated from an Idea |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | How the post is being scheduled. Omit the field or pass null to make no scheduling change — null does not clear or reset the schedule: a scheduled post keeps its current share mode, queue slot, and any custom time, and the edit applies only the other provided fields. Pass a non-null ShareMode to apply that mode. Values: |
| No; body and guard rules apply | boolean | If true, saves the post as a draft instead of keeping it scheduled. When saving as draft: - Post status will be 'draft' instead of 'buffer' - The post will not be published until explicitly scheduled |
| No; body and guard rules apply | string | Scheduling type to indicate notification publishing or automatic publishing. Omit it, or send null, to leave the post publishing the way it already does. Values: |
| No; body and guard rules apply | string | source where the composer was initiated from, used for tracking. |
| No; body and guard rules apply | array | tags Items: string. |
| No; body and guard rules apply | string | Text content of the Post. Omit the field to keep the current text; pass an empty string or null to clear it. Note: for threaded posts, this needs to match the first item in the |
ideaGroups.input
Argument | Required | Type | Details |
| Yes | string | Unique identifier for the organization. |
ideas.input
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| Yes | string | The organization to fetch ideas from. |
| No; body and guard rules apply | object | See the full input schema. |
ideas.input.groupFilter
Argument | Required | Type | Details |
| No; body and guard rules apply | array | Return only ideas that belong to these specific groups (union/OR). Items: string. |
| No; body and guard rules apply | string | Return ideas by a group-membership bucket rather than by specific group IDs. Values: |
instagramAudio.input
Argument | Required | Type | Details |
| Yes | string | Meta audio asset ID |
| Yes | string | Instagram channel used to authorize the refresh |
movePostInQueue.input
Argument | Required | Type | Details |
| Yes | string | ID of the post to move. |
| Yes | string | Target position within the channel's queue. Values: |
post.input
Argument | Required | Type | Details |
| Yes | string | The ID of the post to be retrieved |
posts.input
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| Yes | string | The Organization id to fetch posts for |
| No; body and guard rules apply | array | The sort to apply to the posts results Items: object. |
posts.input.filter
Argument | Required | Type | Details |
| No; body and guard rules apply | array | When set, it will filter posts by channel Items: string. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | string | When set, it will filter posts by whether their scheduled posting date exists. |
| No; body and guard rules apply | string | When set, it will return posts with createdAt or dueAt date before endDate |
| No; body and guard rules apply | array | When set, it will filter posts by format. |
| No; body and guard rules apply | string | When set, it will return posts with createdAt or dueAt date after startDate |
| No; body and guard rules apply | array | When set, it will filter posts by status Items: string. |
| No; body and guard rules apply | array | When set, it will filter posts by tag Items: string. |
| No; body and guard rules apply | object | See the full input schema. |
| No; body and guard rules apply | object | See the full input schema. |
posts.input.sort[]
Argument | Required | Type | Details |
| Yes | string | The direction to sort by. Values: |
| Yes | string | The field to sort by. Values: |
postTemplate.input
Argument | Required | Type | Details |
| Yes | string | The unique identifier of the template to fetch. |
postTemplates.input
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| Yes | string | Organization to scope |
postTemplates.input.filter
Argument | Required | Type | Details |
| No; body and guard rules apply | string | Narrow the result to a single visibility scope. Omit to receive the union of: public templates, internal templates from the supplied organization, and private templates from the actor's account. Values: |
promoteContentItemDraftToPosts.input
Argument | Required | Type | Details |
| Yes | string | The content item to promote. |
| Yes | array | The channel-specific posts to create, one per channel. Provide at least one post, and at most one post per channel. Items: object. |
| No; body and guard rules apply | array | Tags to apply to this content item. Omit to keep the current tags. An empty list or null removes them all. Items: string. |
removePostFromContentItem.input
Argument | Required | Type | Details |
| Yes | string | The content item to remove the post from. |
| Yes | string | The post to remove from a content item. |
searchInstagramAudio.input
Argument | Required | Type | Details |
| Yes | string | Music or original sound catalog Values: |
| Yes | string | Instagram channel to search audio for |
| Yes | string | Search text. Required. Use trendingInstagramAudio for trending results. |
tag.input
Argument | Required | Type | Details |
| Yes | string | The unique identifier of the tag to fetch. |
tagsV2.input
Argument | Required | Type | Details |
| No; body and guard rules apply | object | See the full input schema. |
| Yes | string | Organization to list tags for. The caller must be a member of this organization. |
tagsV2.input.filter
Argument | Required | Type | Details |
| No; body and guard rules apply | boolean | Return only locked tags when true, only unlocked tags when false. Omit to return both. See |
trendingInstagramAudio.input
Argument | Required | Type | Details |
| Yes | string | Music or original sound catalog Values: |
| Yes | string | Instagram channel to load trending audio for |
updateContentItem.input
Argument | Required | Type | Details |
| Yes | string | The content item to update. |
| No; body and guard rules apply | string | Omit to preserve the existing target date. Null clears it. |
| No; body and guard rules apply | string | Omit to preserve the existing title. Null clears it. |
updateContentItemDraft.input
Argument | Required | Type | Details |
| Yes | string | The content item whose channel-less draft is replaced. |
| Yes | object | See the full input schema. |
| No; body and guard rules apply | array | Tags to apply to this content item. Omit to keep the current tags. An empty list or null removes them all. Items: string. |
| No; body and guard rules apply | string | Date indicating when this piece of content should go out. This is a planning aid only and does not schedule any posts. Omit to preserve the existing target date. Null clears it. |
updatePostTemplate.input
Argument | Required | Type | Details |
| Yes | string | The ID of the template to update. |
| No; body and guard rules apply | string | The main content body of the template, may contain {{placeholders}}. |
| No; body and guard rules apply | string | A short user-facing description of the template. |
| No; body and guard rules apply | string | The emoji associated with the template. |
| No; body and guard rules apply | string | The title of the template. |
| No; body and guard rules apply | string |
|
9. Publishing, content items and analytics
Deliberate posting and scheduling
Read the account, exact organization and connected channel. Inspect createPost input and supported metadata for that service. Current modes are addToQueue, customScheduled, shareNext and shareNow; schedulingType is automatic or notification. shareNow can reach people immediately. A draft requires saveToDraft=true; needsApproval follows the channel's provider-side policy and conflicts with explicitly disabling saveToDraft. Due dates and publication restrictions remain provider validated.
buffer-cli get-channel --id SELECTED_CHANNEL --fields id --fields name --agent
buffer-cli preview-operation --operation createPost --arguments '{"channelId":"SELECTED_CHANNEL","mode":"addToQueue","schedulingType":"automatic","saveToDraft":true,"text":"Reviewed draft"}' --agent
buffer-cli create-post --payload-file /absolute/private/approved-post.json --account work --confirm --agent
buffer-cli get-post --id RETURNED_POST_ID --fields id --fields status --agentPreview is schema/document validation only: it does not check account access, media reachability, platform text limits or Buffer scheduling policy. An approved file must contain the native input exactly reviewed. One approved draft does not authorize scheduling, promotion, retries or all posts in an organization. Keep the returned ID and inspect existing state before any deliberate repeat.
Platform metadata and media
The current native schema includes service-specific metadata, media assets and threaded inputs. Read the nested tables and provider's posting guide. Platform capabilities differ: automatic versus notification delivery, text/media formats, approvals, first comments and thread rules are not interchangeable. The wrapper does not rewrite platform metadata or guess limits. Named schemas catch structure/enums; provider semantic validation is authoritative.
Supply supported externally reachable asset URLs. A local path is not uploaded. URLs supplied to Buffer are processed by the provider; request confirmation includes only the selected assets and target. Private/signed URLs can expose credentials and expire before publication; output redaction is not a guarantee that a submitted URL is safe to share.
Content items, ideas and templates
Content items coordinate organization content and channel drafts. Inspect the selected item's existing drafts/posts before create/update/add/remove or promoteContentItemDraftToPosts. Promotion creates posts under the documented scheduling rules and requires its own confirmation. Ideas and post templates have distinct schemas and permissions; templates can be private/internal and inherit provider actor visibility. Never assume these commands grant team access or publish automatically.
Analytics
aggregatedPostMetrics uses an explicit organization and startDateTime/endDateTime, optionally channelIds. An empty channelIds list means no channels, unlike omitted/null. Current date windows are capped at 365 days; metrics refresh daily and require the provider's PAT insightsRead permission. Current OAuth app grants cannot request that scope. Zero/absent metrics are not proof that no posts performed. Inspect provider availability and dates; do not fabricate missing results.
10. Pagination, retries and local input files
Ordinary paginated tools request one page with native first/after/input arguments and return edges/node/pageInfo. The default page size is 25 where declared; local first cap is 100. Cursors are opaque and must be passed unchanged.
buffer-cli query-pages --operation posts --arguments '{"organizationId":"SELECTED_ORG","fields":["items.id","items.status"],"first":25}' --max-pages 3 --agentquery_pages accepts only current named paginated reads, one to five pages. It adds hasNextPage and endCursor fields, returns page responses and resumeCursor, and stops at the requested cap. Missing or repeated cursors abort remaining requests; this is an error, not a complete-library claim. Provider errors also abort remaining pages and no retries run. For very large results, each page still faces the response cap and provider complexity limits. A later continuation sees current account state, not a snapshot guarantee.
payload_file must be regular non-symlink JSON up to 1 MiB. Native input fields, payload and payload_file are mutually exclusive; account, fields, pagination and confirm are outside native payload. No media bytes, output-file downloads or unlimited polling are implemented. Store account responses privately through your own reviewed shell output process; the package does not hide private post/customer content automatically.
Transport failure does not establish that a mutation failed remotely. Preserve its inputs/returned IDs and inspect the provider before making a deliberate repeat. Rate limits can be GraphQL errors inside HTTP 200 as well as transport responses. Quota is shared by the actual upstream client, not reserved by a local label or preview.
11. Several private accounts
BUFFER_ACCOUNTS is a private JSON array of unique labels with api_key (or api_token), token_file and optional organization_id. The array replaces single-account settings completely; no entry inherits a global token or organization. BUFFER_DEFAULT_ACCOUNT selects the default, otherwise the first label is used. Unknown labels/defaults refuse.
[{"name":"work","token_file":"/absolute/private/buffer-work.txt","organization_id":"YOUR_WORK_ORG"},{"name":"personal","token_file":"/absolute/private/buffer-personal.txt","organization_id":"YOUR_PERSONAL_ORG"}]A selected profile fills a missing organizationId only for named native inputs that declare it. An explicit request organizationId takes precedence; generic GraphQL variables are preserved exactly. Preview requires explicit input and reads no credential/profile defaults. list_accounts returns labels/default/authentication presence only, never tokens, file paths or organization IDs.
A profile label is credential routing, not a security boundary for an account-wide PAT. Use separately scoped provider grants/accounts where appropriate. Several labels using the same grant still share permissions and rate quota. Token files override inline profile keys and are cached until restart.
12. Writing safely
All 17 exposed mutation tools require --confirm/confirm=true for the exact human-requested action. Named create/edit/delete/queue/content/promotion/template operations and generic GraphQL mutation pass through one write guard before file reading or network work.
Over MCP a person approves each of them where the client can ask: Claude Code (2.1.246 and later) shows its own prompt, and a client that can show forms asks with an approval form whose one box starts unticked. Each approval is signed, bound to that exact call and works once. Where a client can do neither, the model's confirm:true counts. BUFFER_CONFIRM=model makes confirm:true enough everywhere, for an agent with no person to ask.
BUFFER_READ_ONLY=1 hides mutations from discovery and refuses direct hidden calls. BUFFER_ALLOW_DESTRUCTIVE=0 separately refuses mutations even with confirmation. --agent/--yes are output/noninteractive controls, not permission to publish. Local preview is available in read-only mode because it validates and returns data without transmitting a mutation.
Generic query parses exactly one GraphQL query and refuses mutation/subscription/multiple-operation documents. Generic mutation parses exactly one mutation with one direct root field; multi-action/root-fragment mutation documents refuse. It inserts __typename and the MutationError message catch-all. Aliases are preserved. Buffer validates native generic variables and provider permissions; local schema validation of unknown experimental operations is not claimed.
Audit writes are opt-in metadata containing time, surface, tool, risk, static description, guard outcome and who approved it, then a done or failed line for each allowed call, without keys, post text, native variables or provider content. Keep the log private. Guard acceptance is permission to attempt one operation, not proof it succeeded remotely. Provider permissions/client consent remain independent.
13. How the two surfaces work
src/tools/index.ts exports one ALL_TOOLS catalogue, current published native metadata and six helpers. Slipway builds the MCP server, over stdio or --http, and the CLI from each tool's one definition, so there is one validation path, one private client, one write guard and one set of exit codes.
Thirty-five native GraphQL shells, nested input schemas and selection trees are reused from @bufferapp/cli 1.2.2. The upstream field-selection renderer is credited under ISC. Ajv performs strict native input checks; GraphQL parsing verifies generic operation type before transmission. Only the fixed HTTPS Buffer endpoint is used; redirects, arbitrary API hosts and arbitrary caller headers are absent.
The 41 tools include 24 reads and 17 mutations. These are shared wrapper catalogue counts, not the count of provider endpoints or a superiority benchmark. The current reference contains 42 roots, including seven newer experimental roots accessible through generic GraphQL subject to availability. See THIRD_PARTY_NOTICES.md and api-source.json for source versions/checksums.
14. Privacy and data handling
Credentials stay in private environment/client settings or token-only files. The server caches file credentials until restart and sends Bearer only to https://api.buffer.com, with redirects refused. It neither reads official global/repository Buffer configuration nor collects browser cookies. No telemetry relay, browser sign-in, local content database or public HTTP server is added.
API responses can contain post text, media, customer/account identifiers, organization/channel metadata and performance data. Outputs remain sensitive even when credential-like fields, the configured token and recognized signed credential URLs are redacted. Redaction is not anonymization; arbitrary secrets in free-form content can still appear. Local preview includes the supplied post/input content and should also stay private.
Buffer receives the requested native GraphQL operation/variables; social delivery and asset processing follow provider terms. Model/client hosting sees whatever tool output you let it receive. --fields limits requested data; --select trims after receipt. Neither control changes provider consent or guarantees a safe URL.
Opt-in audit logs contain guard metadata only. Do not put credentials, signed links, raw headers, account dumps or .env files into commits, artifacts or public issues. Private legacy history stays outside the new public repository. Public npm and desktop bundles must be scanned before release.
15. Environment variables
Credentials
Variable | Meaning |
| Private account-wide PAT or authorized OAuth access token |
| Legacy alias; API_KEY wins if both exist |
| Regular owner-only token-only file, max 64 KiB; overrides environment key |
| Private named profile array; no global credential/default inheritance |
| Exact configured label; default first entry |
| Optional input default for single account; does not restrict permissions |
Safety
Variable | Meaning |
| 1/true hides and refuses mutations; default false |
| 0/false refuses even confirmed mutations; default true |
| Private append-only guard decisions, no input content |
Tuning
Variable | Meaning |
| Default 30000, range 100–300000 |
| Default 200, range 0–10000; process/profile pacing only |
|
|
|
|
| Give up on any tool after this long |
| For |
| Comma-separated browser origins allowed to call |
|
|
16. Updates and removal
npx -y @thenavidm/buffer-mcp-cli@latest re-resolves the latest registry tag when the client launches; restart to run the updated process. Global installs require npm update -g @thenavidm/buffer-mcp-cli; pinned versions require an intentional change. Desktop archives are versioned and must be downloaded/reinstalled separately. Clones require reviewing the changelog, pulling, npm ci and rebuilding.
npm update -g @thenavidm/buffer-mcp-cli
buffer-cli --version
# Disconnect the server in each client before local removal.
npm uninstall -g @thenavidm/buffer-mcp-cliRemove the matching client entry or desktop extension and separately remove any registered skill. Delete/revoke private grants using provider controls if requested. Local uninstall does not revoke credentials, disconnect social accounts or undo scheduled/published posts. Keep private input/audit files only for your actual needs.
17. Troubleshooting
Symptom | Check |
Binary absent | Node 22+, npm prefix/PATH, reopen terminal; PowerShell can use npm.cmd |
Configuration exit 10 | Private token path/permissions, account label/default and GUI environment |
Auth/forbidden exit 4 | Actual Buffer key/grant, organization role and connected-channel authorization |
Refused mutation exit 2 | Exact human request, explicit confirm, read-only/disabled settings |
Native input/schema error | Current required fields/enums/nested schema; do not mix payload and body flags |
Unknown fields | get_operation_schema; use relative selection paths and items for connections |
HTTP 200 but failure | GraphQL errors or typed MutationError; inspect safe error and provider state |
Rate limit exit 7 | Provider returned quota/reset, shared PAT/MCP bucket and per-plan windows |
Post accepted but not published | Returned post status, notification delivery, approvals and platform processing |
Missing analytics | PAT insightsRead, provider availability, daily refresh and date range |
Missing/repeated pagination cursor | Stop and inspect state; never assume the library is complete |
GUI discovers nothing | Server stdio launch/PATH, private settings, duplicate extension/manual entries, restart |
Local preview works but API fails | Preview is structural only; account permissions/semantic limits still require provider validation |
Do not log credentials or post/customer content in a public issue. Include package/Node/client versions, exact command name, safe error code, whether a request was sent and redacted reproduction. Never disable policies or replay a publication merely to hide an error.
18. API coverage and comparisons
Offering | Surface and current evidence | Tradeoff |
https://mcp.buffer.com/mcp; 20 documented tools plus generic GraphQL query/mutation | Provider-maintained remote connection and client approval flow. Generic GraphQL already reaches the API; do not claim ours uniquely supports the full API. Live authenticated discovery was not performed in this review. | |
@bufferapp/cli 1.2.2; buffer; 35 published generated operations | Native inputs, schema exploration, upstream --fields, dry-run, JSON/stdin, doctor, contexts and Codex/Claude skills already exist. Setup and update flows remain useful. | |
This owned package | Shared buffer-cli / local MCP / versioned .mcpb; 35 named operations plus six useful helpers | Enforces mutation confirmation/read-only policies in both surfaces, isolated private profiles, credential redaction, local previews and bounded read pagination. Requires Node 22+. No automatic OAuth renewal or official interactive setup. |
Current reference: 42 root operations | Seven newer snippet/tag roots are marked experimental; generic GraphQL can request them subject to provider availability. They are not presented as stable named-tool superiority. | |
Python local MCP, 13 source-declared tools | Current GraphQL workflows include post batches, R2 media hosting and optional Twitter-side integration. No dedicated task CLI is established by this source review. update_post performs delete then create, which can partially fail; it is not a transactional update. Those integrations are useful capabilities absent from this wrapper. | |
Node MCP for legacy API | Source targets api.bufferapp.com/1 and old profiles/updates/schedules. It is not evidence of current GraphQL parity. Only source was reviewed; account compatibility was not exercised. |
Checked October 3, 2026. The current reference, changelog and published official 1.2.2 archive were read directly. A clean anonymous npm 10.9.8 install of that archive fails EUNSUPPORTEDPROTOCOL because its published commander dependency is catalog:. No dependency rewrite or workaround was used. This is a dated installer observation, not a permanent provider limitation or evidence that every installer fails.
To compare local confirmation behavior despite that packaging issue, a network-free fixture exercises the actual published executePipeline and pure helpers with its real generated createPost input/document, a fake token resolver and a mocked GraphQL response. Valid shareNow input without a confirm flag reaches the injected request once; official dry-run reaches it zero times. This is an isolated published function fixture, not a complete official CLI installation or a claim that remote MCP clients lack approvals. The owned equivalent refuses before transmission without explicit confirmation; read-only/disabled policies refuse even confirmed calls.
Pinned community sources were read without executing them or using provider accounts: GraphQL d8516a6 and legacy REST 25eeb35. Their advertised capabilities are not treated as validated account outcomes.
Both official CLI and this package perform upstream field selection and detect typed API errors. Neither capability is claimed unique. Our local --select additionally trims already received output; it cannot reduce upstream work. The owned recurring workflow is deliberate reviewed publishing or administration across isolated profiles with shared enforced policy and bounded reads. No token, speed, success-rate or global superiority claim is inferred from schemas, SEO or tool counts. Provider-account outcomes, desktop GUI and matched Codex task usage remain separate.
19. Versions
Component | Current baseline |
| 3.0.1 |
| 35 generated / 42 roots, seven experimental newer roots via generic |
| 41 tools: 24 reads, 17 confirmed mutations |
| @bufferapp/cli 1.2.2 (published package) |
| 20 documented tools plus generic GraphQL; no authenticated discovery |
| 22+; CI targets 22/24 on macOS/Linux/Windows |
| 0.1.17 |
| 2.3.0 |
| 8.20.0 |
| 3.0.1 |
| 16.14.2 |
| 7.0.2 |
| 5.0.3 |
| 8.3.2 |
| 8.18.0 |
| 2.1.2 |
Checked October 3, 2026. CHANGELOG records dated changes. Package/manifest, annotated default-branch tag, npm latest and desktop filename must agree. Preserve AGPL and private legacy history. Refresh through reviewed, checksum-recorded official schemas; never copy a public schema example without scanning it.
The private 1.0.0 legacy MCP had no declared CLI binaries and used older query/input shapes. Current organizations are read through account.organizations, and channel uses channel(input:{id}), not channel(id). New named tools use get_ for queries and native snake_case for mutations; discover current commands instead of relying on old names. Every mutation now requires confirmation. BUFFER_API_TOKEN remains an alias, while native current input and exact role restrictions take precedence. No prior public npm release is assumed.
20. FAQ
No. Navid Media builds this owned wrapper. Buffer maintains separate official MCP and CLI products, which are compared here.
The useful added workflow is one shared enforced confirmation/read-only policy across local surfaces, isolated profiles and bounded native read pagination. Official field selection, dry-run and API coverage already exist; no blanket superiority is claimed.
Yes. buffer-mcp and buffer-cli share 41 tools, handlers, input schemas, private accounts and guard.
The AGPL wrapper is free. Buffer plans, API quota, account roles and social-platform policies remain separate.
Use the intended account's publish.buffer.com/settings/api controls. Store it privately in BUFFER_API_KEY or a regular token-only BUFFER_TOKEN_FILE; login only prints instructions.
Personal API keys can act across accessible organizations. A local organization default/profile is input routing and cannot narrow those provider permissions.
Yes. Unique named private profiles select their own keys/files/default organization. They never inherit a global credential or organization when the profile array is configured.
Use the documented local stdio registration or shared CLI. Section 7 has what Codex 0.159.3 read for one task over each.
Use Node 22+ on the chosen OS. GUI environment/PATH and Windows private-file ACLs need separate setup. Cross-platform CI is required before release.
The versioned .mcpb bundles production dependencies and private configuration fields for a compatible desktop host. Actual GUI installation remains a separate acceptance check.
No. --agent/--yes set output/noninteractive behavior. The precise requested mutation still needs --confirm or confirm=true and enabled policies.
Yes. Mutations disappear from discovery and direct calls refuse. Generic query parses operation type and refuses mutation/subscription/multiple-operation documents.
No. It validates native structure and fields and returns document/variables without credentials or requests. Permissions, media, platform and scheduling rules remain remote checks.
Buffer reports GraphQL errors and typed mutation errors in the JSON body. The wrapper checks them, and named mutations require a recognized successful result type.
No local media upload is implemented. Supply the current native asset URLs that Buffer can reach and that the chosen platform supports; local file paths are not uploads.
Ordinary reads fetch one page. query_pages fetches one to five pages, reports continuation and stops on malformed/repeated cursors; it never claims an unbounded complete library.
Generic GraphQL can request the seven newer documented experimental roots, subject to provider availability and native variables. They are not stable dedicated named tools in this release.
No automatic OAuth exchange/refresh is implemented. Analytics requires the current PAT insightsRead permission, supported data and a date window up to 365 days; current OAuth grants cannot request that scope.
It depends on the client and the task. In Claude Code the CLI costs nothing until it is used, plus about 3,500 tokens for SKILL.md once, where the server costs about 740 tokens a message with tool search and 60,700 with every tool loaded. In Codex, finding the command that schedules a post and its flags took a median of 111,104 input tokens over the CLI and 48,492 over MCP, mostly because the CLI route printed create-post's full schema. Section 7 has how each was measured.
Restart @latest client launches, update global npm installs separately, and reinstall the versioned desktop bundle separately. Uninstall does not revoke keys or undo scheduled/published posts.
Questions
Open a sanitized issue. Read SECURITY.md for private reports.
About the author
Navid Moazzez is a leading AI business strategist, and the host of the AI Creator Summit, watched by 100,000+ creators. He helps creators and founders master AI and build their own AI Operating System (AI OS) to automate their business and life. He creates useful free tools, MCP servers and CLIs that creators and founders can use in their own workflows.
Links
Personal website: navid.me
Link in bio: navid.bio
Navid Media: navid.media
YouTube: @thenavidm and @thenavidai
X: @thenavidm
Instagram: @thenavidm
LinkedIn: thenavidm
If this is useful, star the repo and come say hi on X.
Dependencies
Runtime: Slipway, which brings the MCP TypeScript SDK, plus Ajv, ajv-formats and GraphQL. Development: TypeScript, Vitest, Vite, Acorn and MCPB. Exact component versions are above and in package-lock.json. ISC Buffer selection code and generated metadata are credited in THIRD_PARTY_NOTICES.md; development packaging tools are excluded from runtime bundles.
License
Preserves AGPL-3.0-or-later. Read LICENSE, the full text and THIRD_PARTY_NOTICES.md. Provider terms remain separate.
© 2026 Navid Media. Made with ❤️ by Navid Moazzez.
Available Tools
41 toolsadd_post_to_content_itemAdd a post that already exists to a content itemADestructive
Add a post that already exists to a content item. The mutation creates no post. To add a new post, call createPost first.. Current Buffer GraphQL addPostToContentItem. Requires explicit confirmation. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The content item to add the post to. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| postId | No | The post to add. The post must already exist. The post and the content item must belong to the same organization. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| confirm | No | Set true only when the user asked for exactly this action. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, but the description adds genuinely new operational context: that no post is created, that explicit confirmation is required, and that provider errors surface as failures even on HTTP 200. That last point is a non-obvious failure mode worth disclosing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and the key disambiguation in the first two sentences, and each subsequent sentence carries a distinct fact. Minor noise from the stray double period and the 'Current Buffer GraphQL addPostToContentItem' internal-name sentence, which adds little for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter nested mutation with no output schema, the description covers the preconditions, confirmation gate, and error semantics, which is most of what an agent needs. It omits nothing critical, though a note on whether the addition is reversible would round it out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents id, postId, fields, account, confirm and payload. The description's only parameter-adjacent hint ('Use upstream fields to bound data') largely restates the fields schema description, so it does not add meaning beyond structured data. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a post that already exists to a content item') and immediately disambiguates from the sibling create_post by saying 'The mutation creates no post. To add a new post, call createPost first.' An agent can distinguish it from create_post and remove_post_from_content_item without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition (the post must already exist) and names the alternative tool to use for the other case (createPost for a new post), plus a confirmation requirement. It stops short of explicitly naming the inverse sibling (remove_post_from_content_item) or stating when-not to use this at all, but the routing guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_content_itemCreate content itemADestructive
Create a content item together with all of its channel-specific post variants in a single operation. Validation is all-or-nothing: if any variant fails validation, no content item and no variants are created. Variants that fail while being processed after creation are reported per channel in the failure payload; the content item and its variants are still created in that case.
This API is an early preview and can change without a deprecation period.. Current Buffer GraphQL createContentItem. Requires explicit confirmation. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| posts | No | ||
| title | No | Optional title describing what this piece of content is about. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| tagIds | No | ||
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| confirm | No | Set true only when the user asked for exactly this action. | |
| payload | No | Complete native input object instead of individual input fields. | |
| targetDate | No | Optional date indicating when this piece of content should go out. This is a planning aid only and does not schedule any posts. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. | |
| organizationId | No | Organization that owns the content item and all variants created in it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: all-or-nothing validation, the distinction between validation failure (nothing created) and post-creation failure (item and variants still created, failures reported per channel), plus the preview instability warning. This is exactly the kind of context that annotations (readOnly/destructive/idempotent/openWorld) cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and validation semantics are front-loaded, and the trailing sentences on preview status, confirmation, and fields bounding are each useful. There is mild clutter (the doubled period in 'period..') but nothing is wasted enough to penalize heavily.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation with 10 params, nested objects, and no output schema, the description covers the essential behaviors an agent needs: transactional semantics, partial-failure reporting, confirmation requirement, and preview instability. It does not explain what the success payload returns, but no output schema exists and the failure payload is described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 80%, giving a baseline of 3, and the description adds meaning for two parameters not obvious from the schema: 'Use upstream fields to bound data' clarifies the fields parameter, and 'Requires explicit confirmation' clarifies the confirm parameter. The remaining parameters are well documented in the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a content item') and adds the key scope detail that it creates all channel-specific post variants in a single operation, which distinguishes it from plain post creation. It stops short of naming any sibling tool (e.g. create_content_item_draft or create_post) to make the choice explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It notes 'Requires explicit confirmation' and warns the API is an early preview, but gives no guidance on when to use this rather than create_content_item_draft, create_post, or create_post_template. The choice context is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_content_item_draftCreate content item draftADestructive
Create a content item holding a channel-less draft, before any channels are selected. No network-specific validation applies to the draft content. The draft needs text or at least one asset.
This API is an early preview and can change without a deprecation period.. Current Buffer GraphQL createContentItemDraft. Requires explicit confirmation. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| draft | No | ||
| title | No | Optional title describing what this piece of content is about. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| tagIds | No | ||
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| confirm | No | Set true only when the user asked for exactly this action. | |
| payload | No | Complete native input object instead of individual input fields. | |
| targetDate | No | Optional date indicating when this piece of content should go out. This is a planning aid only and does not schedule any posts. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. | |
| correlationId | No | ||
| organizationId | No | Organization that will own the content item. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context the annotations cannot convey: that the endpoint is an early preview that can change without deprecation notice, that no network-specific validation applies, that explicit confirmation is required, and that provider errors surface as failures even on HTTP 200. It does not explain the destructiveHint=true implication for a create operation, which would have been valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and sentences are individually dense, but the tail is a choppy wall of unrelated operational notes ('Current Buffer GraphQL createContentItemDraft. Requires explicit confirmation. Use upstream fields...') and there is a stray double period after 'deprecation period'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter nested mutation with no output schema, the description covers the key invariants (draft content requirement, confirmation gate, preview instability, error semantics). It omits only the payload/payload_file mutual exclusion and return-shape expectations, which the schema largely handles.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 73% schema coverage and 11 parameters, the schema does most of the work. The description adds only the draft-content invariant (text or at least one asset) and a hint about the fields parameter; correlationId idempotency, organizationId, account, payload vs payload_file exclusivity, and targetDate are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (create a content item) plus the distinguishing scope: a channel-less draft created before any channels are selected. That implicitly separates it from create_content_item and create_post, though it never names a sibling to route the agent explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real preconditions ('before any channels are selected', 'needs text or at least one asset') and a confirmation requirement, plus 'use upstream fields to bound data'. It still never says when to prefer this over create_content_item, promote_content_item_draft_to_posts, or update_content_item_draft.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_ideaCreate a new idea with the given content and metadataADestructive
Create a new idea with the given content and metadata. Current Buffer GraphQL createIdea. Requires explicit confirmation. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| cta | No | Call-to-action identifier for analytics tracking | |
| group | No | ||
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| confirm | No | Set true only when the user asked for exactly this action. | |
| content | No | ||
| payload | No | Complete native input object instead of individual input fields. | |
| templateId | No | Template ID used to create the idea | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. | |
| organizationId | No | Organization ID that will own the idea |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true, idempotent=false and openWorld=true. The description adds genuinely new behavioral context: an explicit confirmation requirement, that provider errors surface as failures even under HTTP 200, and that upstream fields are used to bound data. It stops short of describing what data is created or the return payload.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action before the operational caveats. Dense but every clause carries information; no padding or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, no-required-field mutation with nested objects and no output schema, the description covers the confirmation gate and error semantics, and the schema covers the rest. Sufficient, though the interplay among payload/payload_file/individual fields is left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so the schema already documents most parameters (confirm, fields, payload, organizationId, etc.). The description's "Use upstream fields to bound data" mildly reinforces the fields parameter but adds no syntax or format detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Create a new idea") with a scope note ("with the given content and metadata") and ties itself to the upstream GraphQL createIdea operation. It does not explicitly differentiate itself from siblings like create_content_item or create_post, so an agent must infer the distinction from the resource name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes "Requires explicit confirmation," which implies a usage precondition, but never states when to prefer this tool over create_content_item/create_content_item_draft or names any alternative. Usage is implied rather than articulated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_postCreate a new postCDestructive
Create a new post. Current Buffer GraphQL createPost. Requires explicit confirmation. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | How the post is being scheduled. | |
| text | No | Text content of the Post. Note: for threaded posts, this needs to match the first item in the `thread` array. | |
| dueAt | No | Date when the post is scheduled to be published | |
| assets | No | ||
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| ideaId | No | Is set when the Post is generated from an Idea | |
| source | No | source where the composer was initiated from, used for tracking. | |
| tagIds | No | List of tag IDs | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| confirm | No | Set true only when the user asked for exactly this action. | |
| draftId | No | Is set when the Post is generated from a Draft | |
| payload | No | Complete native input object instead of individual input fields. | |
| metadata | No | ||
| channelId | No | Channel's Id for which we want to create the post | |
| aiAssisted | No | If this post was created with the help of AI | |
| saveToDraft | No | ||
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. | |
| needsApproval | No | ||
| schedulingType | No | Scheduling type to indicate notification publishing or automatic publishing |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, openWorldHint=true, and readOnlyHint=false. The description adds that provider errors surface as failures even on HTTP 200, which is useful. But it omits the real behavioral stakes: the post may auto-publish or queue, credentials come from `account`, and quota limits apply. With annotations carrying the safety profile, more mutation specifics were expected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with purpose, no fluff. But they are terse to the point of under-specification, and the 'GraphQL createPost' clause adds little an agent can act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter, nested-object, zero-required-field mutation with no output schema and destructive semantics, the description is far too thin. It never mentions the account/channel requirement, draft vs. scheduled vs. immediate paths, or post-publish irreversibility.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Parameter semantics are almost entirely delegated to the schema, which has 79% description coverage across 19 parameters. The description only gestures at 'upstream fields' (the `fields` param) and confirmation, adding little beyond what the schema documents, and 0 required parameters makes the create invocation non-obvious.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource ('Create a new post') and names the underlying operation ('Current Buffer GraphQL createPost'). However, it does not differentiate this tool from sibling posting tools like edit_post, add_post_to_content_item, or create_content_item_draft, leaving the agent to infer scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only guidance is 'Requires explicit confirmation', which is a constraint rather than when-to-use advice. No alternatives (e.g., edit_post, saveToDraft, needsApproval paths) or exclusions are named, despite a crowded sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_post_templateCreate post templateADestructive
Create a post template visible only to the caller (private) or to
the caller's organization (internal).. Current Buffer GraphQL createPostTemplate. Requires explicit confirmation. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | The main content body of the template, may contain {{placeholders}}. | |
| emoji | No | The emoji associated with the template. | |
| title | No | The title of the template. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| confirm | No | Set true only when the user asked for exactly this action. | |
| payload | No | Complete native input object instead of individual input fields. | |
| visibility | No | Defaults to `private` if omitted. `public` is rejected — it is only available to official Buffer clients. | |
| description | No | ||
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. | |
| organizationId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true, and idempotentHint=false. The description adds real value beyond those: it discloses the mandatory confirmation requirement, the visibility scoping rules, and that provider errors surface as failures even under HTTP 200. That last point is useful behavioral context not present in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is compact but poorly structured: a stray double period mid-sentence and three unrelated points (visibility, GraphQL origin, confirmation/error handling) jammed together. The GraphQL sentence adds some provenance context but the flow is run-on rather than front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description needn't explain returns. With 11 parameters and nested payload/payload_file options, it covers confirmation, visibility semantics, and error behavior adequately, though it omits guidance on the mutually exclusive payload vs payload_file vs individual-field input paths an agent must pick between.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 82%, so the schema already documents most parameters, establishing a baseline of 3. The description adds meaning for the visibility parameter by mapping private/internal to visible-to-caller vs organization scope, but it says nothing about payload vs individual fields vs payload_file or the confirm flag beyond the general confirmation remark.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a post template') and clarifies the visibility scopes (private vs internal), which helps distinguish it from siblings like update_post_template or create_post. It does not explicitly name a sibling to contrast against, but the purpose is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It notes 'Requires explicit confirmation' and 'Use upstream fields to bound data; provider errors are failures even with HTTP 200', which gives some operational context. However, it never says when to choose this tool over alternatives (e.g., create_post vs create_post_template) or states prerequisites beyond confirmation, leaving usage mostly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_content_itemDelete a content itemADestructive
Delete a content item: the item itself and any posts created from it. Deletion is all-or-nothing. Every post must be deletable on its own, or nothing is deleted and every blocked post is reported at once. A post can only be deleted while it is a draft, awaiting approval, scheduled, or failed, so an item cannot be deleted while any of its posts is publishing or already published. An item still holding a channel-less draft has no posts, so nothing blocks it. An error can also be reported when a post could not be fully processed after the deletion already took effect; re-fetch before retrying.
This API is an early preview and can change without a deprecation period.. Current Buffer GraphQL deleteContentItem. Requires explicit confirmation. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The content item to delete. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| confirm | No | Set true only when the user asked for exactly this action. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint=true / idempotentHint=false annotations: all-or-nothing transactional semantics, the exact post states that block deletion, that every blocked post is reported at once, and that an error may arrive after the deletion already took effect (re-fetch before retrying). It also flags the explicit-confirmation requirement and the preview instability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the blocking-state rules are well ordered, but the text carries filler ('Current Buffer GraphQL deleteContentItem'), a duplicated period in the preview sentence, and a generic trailing line about fields/HTTP 200 that only loosely belongs to this tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description covers the essentials an agent needs: what is destroyed (item plus derived posts), the transactional failure mode, blocking preconditions, and post-error recovery. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it states confirmation is REQUIRED for this action (which the confirm schema text alone does not make mandatory) and tells the caller to bound data via upstream fields. It still does not explain the account/payload/payload_file alternatives, which the schema covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Delete a content item') and immediately scopes it as a cascade: 'the item itself and any posts created from it.' That distinguishes it from delete_post and remove_post_from_content_item, which appear in the sibling list and handle narrower scopes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong when-not conditions: a post can only be deleted while draft/awaiting approval/scheduled/failed, so the item cannot be deleted while any post is publishing or published, plus the channel-less-draft edge case. It lacks explicit routing to named alternatives such as delete_post or remove_post_from_content_item, which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_postDelete a post by id.ADestructive
Delete a post by id.. Current Buffer GraphQL deletePost. Requires explicit confirmation. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Post id to delete. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| confirm | No | Set true only when the user asked for exactly this action. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description still adds genuine context beyond that: an explicit confirmation requirement, the upstream GraphQL operation it maps to, and the non-obvious rule that provider errors surface as failures even under HTTP 200.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening repeats the title verbatim and carries a double-period typo, wasting the highest-value slot. The remaining sentences are information-dense but terse to the point of being cryptic ('Use upstream fields to bound data' is not self-explanatory).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter mutation with no output schema and a 100%-covered input schema, the description supplies the destructive/confirmation framing and error-handling expectation an agent needs. It leaves the payload-vs-individual-fields selection entirely to the schema, which is acceptable given that coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each of the six parameters is documented in the schema, so the baseline is 3. The description only echoes the confirmation requirement already stated on the confirm parameter and adds nothing about fields, account, payload, or payload_file semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Delete a post by id') and names the underlying operation ('Current Buffer GraphQL deletePost'), which lets an agent distinguish it from delete_content_item and delete_post_template. The duplicate period and title restatement slightly blunt the opening, but the purpose is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when-to-use via 'Requires explicit confirmation' and the schema's 'Set true only when the user asked for exactly this action', but it never contrasts this tool with edit_post or delete_content_item, nor states prerequisites. Usage context is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_post_templateDelete post templateADestructive
Delete a post template owned by the caller (or an internal template in the caller's organization, if the caller is an org admin/owner).. Current Buffer GraphQL deletePostTemplate. Requires explicit confirmation. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The ID of the template to delete. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| confirm | No | Set true only when the user asked for exactly this action. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, non-idempotent, openWorld. The description adds useful operational context beyond annotations: explicit confirmation requirement, ownership/admin scoping, and the warning that provider errors surface as failures despite HTTP 200. It does not cover what is destroyed or whether deletion is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core intent is front-loaded, but the description carries a stray double period ('org admin/owner)..') and mixes purpose, confirmation policy, and a generic upstream/error note (wholly unrelated to deletion). Sentences are not all earning their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent tool with annotation coverage and no output schema, the description provides the essential safety context (confirmation, ownership scope). The 'use upstream fields' note is out of place for a delete, leaving a small mismatch, but the mutation is otherwise adequately framed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters in detail (id, fields, account, confirm, payload, payload_file). The description adds nothing parameter-specific, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Delete a post template') and adds an ownership scope (owned by caller, or org template for admins/owners) that distinguishes it from siblings like delete_post and delete_content_item. The GraphQL deletePostTemplate mapping confirms the exact underlying operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: it requires explicit confirmation and describes the ownership precondition. However, it never names an alternative operation or states when NOT to use it (e.g., preferring update_post_template over delete).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_postEdit post for channelBDestructive
Edit post for channel. Current Buffer GraphQL editPost. Requires explicit confirmation. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ID of the post to edit | |
| mode | No | ||
| text | No | ||
| dueAt | No | Date when the post is scheduled to be published | |
| assets | No | ||
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| ideaId | No | Is set when the Post is generated from an Idea | |
| source | No | source where the composer was initiated from, used for tracking. | |
| tagIds | No | tags | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| confirm | No | Set true only when the user asked for exactly this action. | |
| draftId | No | Is set when the Post is generated from a Draft | |
| payload | No | Complete native input object instead of individual input fields. | |
| metadata | No | ||
| aiAssisted | No | If this post was edited with the help of AI | |
| saveToDraft | No | ||
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. | |
| approvalChange | No | ||
| schedulingType | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and non-idempotency, so the safety profile is covered. The description adds value beyond that: an explicit confirmation requirement and the genuinely useful note that provider errors are failures even on HTTP 200, which the agent cannot learn from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four terse sentences with no filler, and the confirmation requirement is stated early. The telegraphic style ('Current Buffer GraphQL editPost') is dense but front-loaded and wastes nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter, deeply nested mutation with no output schema, the description is thin, though the schema compensates heavily with per-field edit semantics. The confirmation and error-handling notes are the main description-level contributions; return behavior and partial-update consequences are left to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 63% across 19 parameters, and the schema itself carries extensive edit-specific semantics (omit-to-preserve, empty-to-clear). The description contributes only the 'Use upstream fields to bound data' hint for the fields parameter, adding marginal value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence 'Edit post for channel' is essentially a restatement of the title, though 'Current Buffer GraphQL editPost' pins it to a specific upstream operation. It names a clear verb+resource but offers no differentiation from mutation siblings like update_content_item, create_post, or delete_post.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Requires explicit confirmation' line gives a real precondition, and the schema's confirm parameter reinforces it. However, no alternatives are named and no when-not-to-use guidance is given, so the agent must infer that this is the post-mutation path versus its many siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountGet your account informationARead-onlyIdempotent
Get your account information. Current Buffer GraphQL account. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent and non-destructive, so the bar is lower. The description adds genuinely new behavioral context: single request with no automatic pagination, and that provider errors surface as failures even under HTTP 200 — details the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the purpose, then operational caveats. No filler, though the phrasing is terse to the point of being slightly telegraphic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 100% schema coverage the input side is well covered, and there is no output schema to explain. However, for a read tool with zero required params and a nested payload option, the description never hints at what the response contains beyond 'account information', leaving a modest gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four params in detail (fields paths, account credential selection, payload/payload_file exclusivity). The description's 'Use upstream fields to bound data' only lightly echoes the fields param, so baseline 3 is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get your account information') and the qualifier 'Current Buffer GraphQL account' scopes it to a single account, which implicitly separates it from the sibling list_accounts. It stops short of naming the sibling explicitly, so sibling differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'Current' implies when this applies versus list_accounts, but there is no explicit when-to-use/when-not guidance or named alternative. The 'Use upstream fields to bound data' note is usage-adjacent but framed as an instruction for the fields param, not a selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_aggregated_post_metricsGet aggregated post metricsARead-onlyIdempotent
Aggregate post performance for an organization across a date range, optionally filtered by channel or tag. Current Buffer GraphQL aggregatedPostMetrics. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| payload | No | Complete native input object instead of individual input fields. | |
| channelIds | No | ||
| endDateTime | No | ||
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. | |
| startDateTime | No | Start of the aggregation window. Consumers typically pass UTC midnight of the first calendar day in the window, for example `2026-01-01T00:00:00Z`. | |
| organizationId | No | The organization ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, non-destructive, so the safety profile is covered. The description adds genuinely useful behavioral facts beyond that: no automatic pagination, and that provider errors surface as failures even on HTTP 200 — non-obvious traits for an open-world read call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core purpose and followed by the operational caveats that matter most. No filler, though the GraphQL-field reference is slightly jargon-dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 9 parameters, nested objects and no output schema, the definition should say more about the aggregate result shape and how to page manually via cursors (only hinted at inside the schema). It covers error and pagination behavior but leaves return-value expectations to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, below the high-coverage baseline, so the description should carry more weight. It maps to the filter params ('channel or tag') and hints at the fields param ('use upstream fields to bound data'), but says nothing about account, payload, or payload_file, so a third of the surface remains undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('Aggregate post performance') and adds scope (organization, date range, channel/tag filters), which clearly distinguishes an aggregate-metrics tool from the post-listing siblings like get_posts. It never names a sibling explicitly, so an agent must infer the boundary, keeping it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives operational guidance ('Use upstream fields to bound data', 'One request, no automatic pagination', provider errors count as failures), which helps the caller. But it never states when to choose this tool over alternatives such as get_posts or graphql_query, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_channelGet a channel by IDBRead-onlyIdempotent
Get a channel by ID. Current Buffer GraphQL channel. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The ID of the channel to be retrieved | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world. The description adds genuinely non-obvious behavioral facts beyond that: 'One request, no automatic pagination' and 'provider errors are failures even with HTTP 200.' The one weak spot is 'Current Buffer GraphQL channel,' which is vague and adds little.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and reasonably short. But the sentence 'Current Buffer GraphQL channel' is vague filler that doesn't clearly earn its place, while the pagination and error sentences do carry weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only get-by-ID tool with full schema coverage and no output schema, the description covers the key behavioral caveats (no auto-pagination, error semantics). It falls short on situating the tool against its siblings (get_channels, get_content_item), which an agent needs to select correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents id, fields, account, payload, and payload_file in detail. The description only gestures at the fields parameter ('Use upstream fields to bound data') without adding syntax or format detail, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a channel by ID'), so the action is unambiguous. However, it never distinguishes this from the sibling 'get_channels' (the plural/list variant), leaving the agent to infer the singular-vs-list split on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers tips ('Use upstream fields to bound data') but no guidance on when to use this tool versus alternatives like get_channels or graphql_query. There is no stated condition or exclusion that would route an agent between siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_channelsList channels for an organizationARead-onlyIdempotent
List channels for an organization. Current Buffer GraphQL channels. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| filter | No | ||
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. | |
| organizationId | No | The Organization id to fetch channels for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/destructive=false, so safety is covered. The description adds real operational context beyond them: no automatic pagination, one request only, and that provider errors surface as failures even with HTTP 200 — useful behavior an agent cannot infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, purpose front-loaded, no filler. Slightly telegraphic — the pagination and error sentences could be clearer — but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with nested objects and no output schema, the description covers pagination and error semantics but omits how filter/account/payload relate and what the returned channel structure looks like. Adequate but leaves gaps an agent must resolve from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 83%, so the schema already documents fields, filter, account, and payload. The description reinforces 'upstream fields' bounding but adds no syntax or interaction rules (e.g. payload vs individual fields exclusivity is only in the schema). Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List channels for an organization') and scopes it to 'Current Buffer GraphQL channels', which distinguishes it from the singular sibling get_channel. It does not explicitly name sibling alternatives, but the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a usage hint ('Use upstream fields to bound data') and an error-handling rule, but never states when to prefer this over get_channel or list_accounts, nor any prerequisites for organizationId/account. Usage is implied rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_configurationGlobal, per-organization configurationBRead-onlyIdempotent
Global, per-organization configuration: the connected channels the actor can
view (with per-feature authorization) plus the service-level capability
catalog (services). One round trip for every capability domain; clients
select only what they need.. Current Buffer GraphQL configuration. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. | |
| organizationId | No | The organization to return configuration for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds real behavioral context beyond them: no automatic pagination, a single round trip, and the important caveat that provider errors are failures even with HTTP 200. That HTTP-200-is-not-success detail is the kind of warning an agent genuinely needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening clause duplicates the title and the closing fragment ("Current Buffer GraphQL configuration") largely repeats it, and a stray double period signals sloppy editing. Useful content exists but is interleaved with redundant restatements, so the definition is not tightly front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With five parameters, nested objects, and no output schema, the description should carry more of the return-shape burden. It names the top-level result members (channels, services) and the pagination posture, which is helpful, but it never explains the structure of the per-feature authorization or the services catalog, leaving the response only partially characterized.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the five parameters is already documented in the schema, including the nested payload.organizationId. The description only gestures at the `fields` argument ("Use upstream fields to bound data") without adding syntax or mutual-exclusion detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states what is returned (connected channels the actor can view plus the service-level capability catalog) which goes beyond a bare 'get configuration', but it opens by restating the title verbatim and never cleanly frames the verb+resource as a distinct operation. It does not differentiate itself from overlapping siblings like get_channels, get_account, or graphql_query, so an agent cannot confidently tell when this is the right pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance relative to alternatives despite many read siblings (get_channels, get_channel, get_account, graphql_query). "Clients select only what they need" and "Use upstream fields to bound data" describe how to use a parameter, not when to select this tool over another.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_content_itemFetch a single content item by idARead-onlyIdempotent
Fetch a single content item by id. Errors if no content item with that id exists.
This API is an early preview and can change without a deprecation period.. Current Buffer GraphQL contentItem. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The unique identifier of the content item to fetch. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/openWorld safety, and the description adds genuinely new traits: it errors on missing ids, is in early preview with no deprecation period, performs one request with no automatic pagination, and treats provider errors as failures even on HTTP 200. These are real operational caveats beyond the structured hints, though return shape is not discussed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and mostly front-loaded, with the primary action first and caveats after. Minor waste and a typographic slip ('period..') plus the fragment 'Current Buffer GraphQL contentItem' slightly blunt the polish, but each sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with no output schema and 5 params including a nested payload object, the description covers error behavior, pagination limits, field bounding, and API stability. Only the response shape is unaddressed, which is acceptable given no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are fully documented in the schema, making 3 the baseline. The description adds only a light note about using upstream fields to bound data, offering marginal meaning beyond what the field schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch a single content item by id') and scopes it to a single item, which cleanly separates it from the plural sibling get_content_items. An agent can identify the operation and the target without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives some conditional behavior ('Errors if no content item with that id exists') and a hint to bound data with upstream fields, but never says when to pick this over get_content_items or any other sibling. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_content_itemsGet content itemsARead-onlyIdempotent
Fetch an organization's content items in the requested order, newest first
by default. Uses standard cursor pagination: pass the previous page's
pageInfo.endCursor as after to fetch the next page. Requesting more than
100 items in a single page is rejected.
This API is an early preview and can change without a deprecation period.. Current Buffer GraphQL contentItems. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | ||
| after | No | Opaque cursor from pageInfo.endCursor. One page per ordinary call. | |
| first | No | Local page-size cap 100, default 25; provider may impose additional query limits. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| filter | No | ||
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. | |
| organizationId | No | Organization to list content items for. The caller must be a member of this organization. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so safety is covered. The description adds real value beyond that: default ordering (newest first), the 100-item rejection rule, single-request-no-auto-pagination behavior, that provider errors surface as failures even on HTTP 200, and an early-preview instability warning. These are meaningful behavioral traits not in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core behavior in the first sentence and pagination rules immediately after, so the agent gets the essentials fast. Slightly marred by a stray double period and the telegraphic run-on 'Current Buffer GraphQL contentItems' fragment, but overall compact and well ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, nested-object tool with no output schema, the description covers the operational essentials: pagination model, default sort, page cap, single-request behavior, and preview fragility. Returned-field selection is left to the schema's `fields` param, which is acceptable; only minor gaps (auth/membership requirement is only in the schema) remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 78%, so the schema documents most parameters (sort, filter, fields, account, orgId, payload). The description reinforces pagination semantics ('pass pageInfo.endCursor as after') and the page-size cap, and implies sort defaults to newest-first, but adds little syntax or format detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'Fetch an organization's content items in the requested order, newest first by default.' An agent can tell this is a listing/read tool. It does not explicitly name the sibling get_content_item (singular) or contrast a collection fetch from a single-resource fetch, so differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives operational guidance (use cursor pagination, pass pageInfo.endCursor as after, 100-item cap) but no explicit when-to-use/when-not guidance, e.g. vs get_content_item or the graphql_query sibling. Usage is implied by 'fetch an organization's content items' rather than spelled out against alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_daily_posting_limitsGet daily posting limitsARead-onlyIdempotent
Returns daily posting limit status for the given channels on the specified date.. Current Buffer GraphQL dailyPostingLimits. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | The date to check limits for. Defaults to today if not provided. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| payload | No | Complete native input object instead of individual input fields. | |
| channelIds | No | ||
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, non-destructive and openWorld, so the safety profile is known. The description adds genuinely non-obvious behavior: exactly one request with no automatic pagination, and that provider errors surface as failures even on HTTP 200. That error-semantics disclosure is valuable context an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the effect and followed by operational constraints; every sentence carries information. Minor blemish: a doubled period after 'specified date..' and somewhat compressed jargon ('upstream fields'), but no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, nested-object read tool with no output schema, the description covers scope, request/pagination behavior and error handling. It stops short of explaining what the returned limit status actually contains, but with readOnly annotations and rich schema descriptions the coverage is adequate for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 83%, so the schema already documents date defaulting, channelIds same-organization constraint, fields paths, payload_file size limits and the payload wrapper. The description only restates 'given channels on the specified date' and echoes the fields-bounding idea, adding little beyond the structured fields. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns daily posting limit status for the given channels on the specified date') and ties it to the upstream Buffer GraphQL dailyPostingLimits resource, so the agent knows exactly what is produced. It does not explicitly contrast itself with siblings like get_aggregated_post_metrics or get_channels, which keeps it at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies when the tool applies (checking per-channel posting limits for a date) and gives a practical usage tip about bounding data with upstream fields, but never states when to prefer an alternative or what prerequisites exist beyond channel-same-organization in the schema. Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_idea_groupsList idea groups (folders) for an organizationARead-onlyIdempotent
List idea groups (folders) for an organization. Current Buffer GraphQL ideaGroups. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. | |
| organizationId | No | Unique identifier for the organization. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint, destructiveHint=false, idempotentHint) and open-world access. The description adds genuine traits beyond them: no automatic pagination, field-based bounding to limit data, and the important caveat that provider errors surface as failures even with HTTP 200. That error-semantics disclosure is real value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the purpose front-loaded, then operational constraints. 'Current Buffer GraphQL ideaGroups' is mild jargon but earns its place by grounding the operation in the upstream API.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema and a nested payload shape, the description covers the essentials an agent needs: no auto-pagination, field bounding, and HTTP-200 error behavior. Mutual exclusivity of payload vs payload_file vs individual fields is left to the schema, which handles it adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each of the five parameters (fields, account, payload, payload_file, organizationId) is already documented, including the items.id / pageInfo.endCursor conventions. The description's 'use upstream fields to bound data' only echoes the fields parameter, adding no syntax or format detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (idea groups / folders) scoped to an organization, and names the upstream GraphQL field (ideaGroups), which is enough to distinguish it from the similarly named get_ideas sibling. It stops short of explicitly contrasting itself with get_ideas, but the resource difference is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides operational guidance ('One request, no automatic pagination', 'Use upstream fields to bound data') but no when-to-use/when-not-to-use context or routing to alternatives such as get_ideas. Usage is implied rather than framed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ideasFetch a paginated list of ideas with optional filteringARead-onlyIdempotent
Fetch a paginated list of ideas with optional filtering. Current Buffer GraphQL ideas. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Opaque cursor from pageInfo.endCursor. One page per ordinary call. | |
| first | No | Local page-size cap 100, default 25; provider may impose additional query limits. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| payload | No | Complete native input object instead of individual input fields. | |
| tagsFilter | No | ||
| groupFilter | No | ||
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. | |
| organizationId | No | The organization to fetch ideas from. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so safety is covered. The description nonetheless adds real behavioral value beyond that: single-page-per-call semantics ('no automatic pagination') and an important error contract ('provider errors are failures even with HTTP 200'). It stops short of describing rate limits or result shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core purpose and no wasted filler. The middle fragment 'Current Buffer GraphQL ideas' is ambiguous and slightly muddies the otherwise tight structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with nested filter objects and no output schema, the description covers pagination and error behavior but says nothing about the mutual exclusivity of payload/payload_file/individual fields or the account credential selection nuance. Adequate but with clear gaps given the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 78%, near the high band, so the schema already carries most parameter meaning (cursor, first, fields, payload, tagsFilter, groupFilter). The description only gestures at the fields parameter ('Use upstream fields to bound data') without adding syntax or precedence rules for the account/payload/payload_file alternatives, so it neither compensates nor detracts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch a paginated list of ideas') with the filtering scope, which cleanly separates it from siblings like create_idea and get_idea_groups. It does not, however, explicitly contrast itself with the closest read sibling get_idea_groups, so the differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'One request, no automatic pagination' and 'Use upstream fields to bound data' give operational context for how to call it, and the cursor param supports that. But there is no explicit when-to-use versus get_idea_groups, nor any stated exclusions, so guidance is implied rather than directive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_instagram_audioGet instagram audioARead-onlyIdempotent
Refresh metadata and preview availability for one Instagram audio asset. Requires Facebook Login. Instagram Login channels return ChannelRefreshRequired.. Current Buffer GraphQL instagramAudio. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| audioId | No | Meta audio asset ID | |
| payload | No | Complete native input object instead of individual input fields. | |
| channelId | No | Instagram channel used to authorize the refresh | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing authentication requirements (Facebook Login), the ChannelRefreshRequired failure mode, that it is a single request with no automatic pagination, and that provider errors surface as failures even with HTTP 200. Annotations only cover the safe-read/idempotent profile, so this operational detail is genuinely additive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: the core action leads, followed by auth, error, and pagination constraints. It reads as a compressed run-on, but nearly every clause carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers auth, error, and pagination behavior for a 6-parameter tool with nested objects and no output schema. The main remaining gap is return-value shape, which the description leaves entirely to the caller since no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents fields, account, audioId, channelId, payload, and payload_file. The description adds only a light hint on bounding data via upstream fields, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'Refresh metadata and preview availability for one Instagram audio asset.' The singular 'one ... asset' implicitly separates it from the list-style siblings get_search_instagram_audio and get_trending_instagram_audio, though those siblings are never named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete preconditions and exclusions: 'Requires Facebook Login' and 'Instagram Login channels return ChannelRefreshRequired,' which tells the agent when this call will fail. It also scopes work via 'Use upstream fields to bound data,' though it never explicitly routes to the search/trending alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_operation_schemaInspect native input and selectable fieldsCRead-onlyIdempotent
Local current operation input schema, every selectable upstream field path and bounded default selections. No credentials or request.
| Name | Required | Description | Default |
|---|---|---|---|
| operation | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds one genuinely useful behavioral fact — 'No credentials or request' — implying a purely local introspection with no upstream call, though the wording is ambiguous about whether it means no auth or no request body. It says nothing about cost, caching, or when the returned schema can go stale.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is very short and front-loads the resource ('input schema'), which is good, but the second sentence is a compressed fragment list ('every selectable upstream field path and bounded default selections') that reads as telegraphic rather than economical. Brevity here costs clarity rather than buying it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one enum parameter, no output schema, and no nested objects, the tool is simple, but its entire value is the shape of what it returns (field paths and default selections) and the description only gestures at that. An agent can call it, but cannot predict the response structure or know how to use the returned paths, which is the core of the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single required 'operation' parameter, so the description must carry the burden and does not. It alludes to 'current operation' but never states that the argument must be one of the 36 enumerated operation names or how those enum values relate to the sibling tools (e.g. 'posts' vs get_posts).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title verb 'Inspect' plus the phrase 'input schema' makes the general purpose recoverable, but 'Local current operation input schema' is awkward and never says plainly that the tool returns the request schema for a named operation. It also fails to distinguish itself from siblings such as preview_operation or graphql_query, which an agent would need in order to choose correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use statement, no precondition, and no named alternative. The description never explains that this is a discovery step to run before constructing an operation, nor why one would call it instead of reading a sibling tool's schema directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_postGet a post by IDARead-onlyIdempotent
Get a post by ID. Current Buffer GraphQL post. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The ID of the post to be retrieved | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, but the description adds genuinely new behavior: a single request with no automatic pagination, and that provider errors surface as failures even under HTTP 200. That error-semantics note is valuable and not derivable from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded, with the pagination and error semantics placed early. 'Current Buffer GraphQL post' is telegraphic and slightly cryptic, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the key call-shape facts an agent needs (single request, no auto-pagination, error surfacing) for a 5-parameter tool with no output schema. It is complete enough to call correctly, though it never clarifies the interaction between id/payload/payload_file beyond what the schema states.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents id, fields, account, payload and payload_file, including the payload/payload_file mutual exclusion. The description's 'Use upstream fields to bound data' adds a mild hint about fields usage but no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a post by ID') and clarifies the underlying source ('Current Buffer GraphQL post'). It does not, however, distinguish itself from near-siblings like get_posts, get_post_template, or get_aggregated_post_metrics, nor explain what a 'Buffer GraphQL post' is relative to those.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use / when-not-to-use guidance and no alternative tool is named, despite get_posts and get_post_template sitting right next to it. The sentence 'Use upstream fields to bound data' is parameter advice, not usage routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_postsList posts for an organizationBRead-onlyIdempotent
List posts for an organization. Current Buffer GraphQL posts. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | ||
| after | No | Opaque cursor from pageInfo.endCursor. One page per ordinary call. | |
| first | No | Local page-size cap 100, default 25; provider may impose additional query limits. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| filter | No | ||
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. | |
| organizationId | No | The Organization id to fetch posts for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover readOnly/idempotent/openWorld. Description adds value: 'One request, no automatic pagination', 'provider errors are failures even with HTTP 200', and cursor guidance. However, does not state default page size, field bounding behavior, or count/limit implications beyond schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded purpose then operational notes. Efficient, though slightly telegraphic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers pagination posture and error semantics, but for a 9-param read tool with nested objects, it omits guidance on filter combinations vs payload/payload_file mutually exclusive modes, account vs organizationId interplay, and field bounding behavior. Adequate but gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage 78% with strong param descriptions. Description mentions 'Use upstream fields to bound data' and cursor/one-page behavior, adding some meaning beyond schema. Baseline 3 appropriate since schema does most heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verb+resource: 'List posts for an organization.' Clear what it does and on which resource. Does not explicitly differentiate from siblings like get_post or get_aggregated_post_metrics, but the scope (posts for an organization, plural list) is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage via 'Current Buffer GraphQL posts. One request, no automatic pagination.' but does not state when to use this vs get_post (single) or alternatives. No explicit exclusions or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_post_templateFetch a single post template by IDARead-onlyIdempotent
Fetch a single post template by ID. Returns null if not found.. Current Buffer GraphQL postTemplate. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The unique identifier of the template to fetch. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuine context beyond them: it returns null when not found, issues one request with no pagination, and treats provider errors as failures even on HTTP 200. That last operational nuance is valuable and not derivable from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded and compact, but contains a doubled period ('found..') and a cryptic fragment ('Current Buffer GraphQL postTemplate') that reads as filler. Mostly earns its place but has minor structural sloppiness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description partially compensates by noting the null-on-not-found return. However, for a tool with a nested payload object and payload_file alternative, the description does not elaborate on return shape or the payload input path, leaving the rich schema to carry the load.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters including the fields/account/payload nuances. The description only adds a light note about bounding data via upstream fields, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Fetch a single post template by ID'), and the singular 'single ... by ID' scope implicitly distinguishes it from the sibling get_post_templates list tool. It is clear but does not explicitly name an alternative the way a 5 would.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'One request, no automatic pagination' and 'Use upstream fields to bound data' imply how to invoke it, but there is no explicit when-to-use versus get_post_templates or when-not guidance. Usage is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_post_templatesGet post templatesARead-onlyIdempotent
Fetch the templates visible to the current actor for the template
library: public templates, plus internal templates from the supplied
organizationId, plus private templates owned by the actor's
account. The visibility scope is always pinned to the actor and the
supplied organization — the input filter can only narrow within that
scope, never widen it.. Current Buffer GraphQL postTemplates. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Opaque cursor from pageInfo.endCursor. One page per ordinary call. | |
| first | No | Local page-size cap 100, default 25; provider may impose additional query limits. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| filter | No | ||
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. | |
| organizationId | No | Organization to scope `internal`-visibility templates to. The caller must be a member of this organization. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), and the description adds real behavior on top: visibility is pinned and cannot be widened by input, there is no automatic pagination, and provider errors surface as failures even on HTTP 200. Those are exactly the traits an agent cannot read off the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the scope definition, then tacks on pagination and error behavior in short declarative sentences. Slightly dense and contains a doubled-period typo, but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, nested-object, no-output-schema tool it covers the critical unknowns: scoping rules, the org-membership requirement, pagination behavior, and failure semantics. It says nothing about the shape of returned templates, which is the main remaining gap given there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 88%, so the baseline is 3. The description adds genuine semantics beyond the schema by explaining that the visibility enum/filter narrows a pre-pinned union rather than defining it, plus guidance on using upstream field paths to bound the payload.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Fetch) and resource (post templates), and goes further by enumerating the three-union visibility scope (public, internal for the supplied org, private for the actor). It never names the singular sibling get_post_template or the write siblings create/update/delete_post_template, so the reader must infer the list-vs-single distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives usable invocation context: the scope is pinned to actor+organization, the filter can only narrow within it, it is one request with no automatic pagination, and upstream fields should be used to bound data. No explicit when-not or named alternative against get_post_template is provided, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_search_instagram_audioSearch Instagram audio for one channelARead-onlyIdempotent
Search Instagram audio for one channel. Requires Facebook Login. Instagram Login channels return ChannelRefreshRequired.. Current Buffer GraphQL searchInstagramAudio. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Search text. Required. Use trendingInstagramAudio for trending results. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| payload | No | Complete native input object instead of individual input fields. | |
| audioType | No | Music or original sound catalog | |
| channelId | No | Instagram channel to search audio for | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only/idempotent/non-destructive semantics, and the description adds substantial context beyond them: Facebook Login requirement, the ChannelRefreshRequired failure mode for Instagram Login channels, the underlying GraphQL operation, single-request/no-auto-pagination behavior, and that provider errors surface even with HTTP 200. It stops short of 5 by omitting rate limits or any indication of return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and composed of short, information-dense sentences where each adds auth, implementation, pagination, or error context. Minor deductions for the choppy fragment 'Current Buffer GraphQL searchInstagramAudio.' and the double-period typo in 'ChannelRefreshRequired..'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, nested-object read tool with no output schema, the description covers the operationally critical points: auth requirements, error semantics, pagination limits, and field-bounding advice. Little that an agent needs to call it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 7 parameters including the nested payload object. The description's only parameter-adjacent guidance ('Use upstream fields to bound data') echoes what the fields schema description already says, so it adds little beyond baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb (Search) and resource (Instagram audio) with scope (for one channel), which implicitly separates it from get_trending_instagram_audio. However, it does not explicitly name that sibling as the alternative in the description itself—that routing hint lives only in the schema's query parameter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states prerequisites ('Requires Facebook Login. Instagram Login channels return ChannelRefreshRequired') and operational constraints, which gives useful context. But it never says when to choose this tool over get_instagram_audio or get_trending_instagram_audio; the only alternative reference is buried in a schema parameter description, so usage selection is left largely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tagFetch a single tag by idARead-onlyIdempotent
Fetch a single tag by id.
Resolves to null with a NOT_FOUND error when no tag has that id, and with an UNAUTHORIZED error when the tag belongs to an organization the caller cannot read. Both are reported in the errors array.
This API is an early preview and can change without a deprecation period.. Current Buffer GraphQL tag. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The unique identifier of the tag to fetch. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the bar is lower, yet the description adds real value: NOT_FOUND and UNAUTHORIZED semantics reported in the errors array, a preview-stability warning, and the note that provider errors are failures even at HTTP 200. The phrasing "Resolves to null with a NOT_FOUND error" is internally muddled (null vs. error), which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, which is good, but the body is garbled: "a deprecation period.. Current Buffer GraphQL tag" has a double period and an awkward splice, and the provider-errors clause is opaque. Sentences do not all cleanly earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does explain null/error behavior and no-pagination. Combined with 100% schema coverage of five params, an agent has enough to call it correctly, though the error/null ambiguity slightly weakens it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents id, fields, account, payload, and payload_file. The description only loosely echoes the fields parameter ("Use upstream fields to bound data") without adding syntax or semantics beyond what the schema provides. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Fetch a single tag by id"), and the singular scope implicitly distinguishes it from the plural sibling get_tags_v2. However, it never names or contrasts that sibling explicitly, so the differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (fetch one tag when you have its id) and adds a constraint ("One request, no automatic pagination"), but gives no explicit when-to-use versus get_tags_v2 or the graphql_query/query_pages alternatives. Guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tags_v2Get tags v2ARead-onlyIdempotent
Fetch a page of the organization's tags, sorted by name in ascending order.
Uses standard cursor pagination: pass the previous page's pageInfo.endCursor
as after to fetch the next page. Requesting more than 100 tags in a single
page is rejected.
This API is an early preview and can change without a deprecation period.. Current Buffer GraphQL tagsV2. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Opaque cursor from pageInfo.endCursor. One page per ordinary call. | |
| first | No | Local page-size cap 100, default 25; provider may impose additional query limits. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| filter | No | ||
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. | |
| organizationId | No | Organization to list tags for. The caller must be a member of this organization. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), so the bar is lower. The description nonetheless adds real behavioral context: early-preview instability without a deprecation period, hard rejection above 100 items per page, no automatic pagination, and that 'provider errors are failures even with HTTP 200' — genuinely useful for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is correctly front-loaded, but structure degrades in the second paragraph, which contains a garbled fragment and a double period ('deprecation period.. Current Buffer GraphQL tagsV2.') that reads like a stitched-together template. That noise reduces clarity in an otherwise compact description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, 8-parameter paginated list tool with no output schema and 88% schema coverage, the description covers the key gaps: pagination mechanics, page-size limits, preview instability, and error semantics. Only minor gaps remain (no explicit sibling routing, no return-shape note, though fields/filter params partially cover this).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 88%, so the schema already documents the parameters thoroughly and the baseline is 3. The description reinforces pagination semantics (the `after`/endCursor link) and the 100-item cap, but that cap is already declared as `maximum: 100` in the schema, adding little beyond what structured fields provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource ('Fetch a page of the organization's tags'), plus ordering ('sorted by name ascending') and identifies the underlying API ('tagsV2'). It is clear what the tool does, though it never explicitly contrasts itself with the singular sibling `get_tag`, leaving that differentiation implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives solid operational guidance for pagination ('pass the previous page's pageInfo.endCursor as after') and notes 'One request, no automatic pagination.' However, it offers no when-to-use/when-not guidance and never routes the agent between this tool and the sibling `get_tag` (single tag) or `get_content_items`, so usage selection is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trending_instagram_audioReturn Meta trending Instagram audio for one channelARead-onlyIdempotent
Return Meta trending Instagram audio for one channel. Requires Facebook Login. Instagram Login channels return ChannelRefreshRequired.. Current Buffer GraphQL trendingInstagramAudio. One request, no automatic pagination. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| payload | No | Complete native input object instead of individual input fields. | |
| audioType | No | Music or original sound catalog | |
| channelId | No | Instagram channel to load trending audio for | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint, but the description adds value beyond them: the auth requirement, the ChannelRefreshRequired failure mode, the no-pagination constraint, and the important caveat that provider errors surface even with HTTP 200. That is meaningful behavioral disclosure for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then prerequisites, then constraints — dense and largely waste-free. Minor blemishes: a stray double period after ChannelRefreshRequired and a somewhat redundant internal API reference ('Current Buffer GraphQL trendingInstagramAudio').
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-param, nested-object, no-output-schema tool, the description covers auth, error semantics and pagination limits well. It could go slightly further on how the fields parameter interacts with the nested payload, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents fields, account, payload, audioType and channelId. The description only adds 'Use upstream fields to bound data', a minor hint about the fields parameter; the baseline 3 for full schema coverage applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Return Meta trending Instagram audio for one channel') and scopes it to a single channel, which separates it from the broader audio siblings. It never names get_instagram_audio or get_search_instagram_audio as the alternatives, so the agent must infer the distinction from the word 'trending' alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides real prerequisites (Facebook Login required, Instagram Login channels return ChannelRefreshRequired) and a scope instruction ('Use upstream fields to bound data'), which is genuine usage context. It does not state when to prefer this tool over the sibling audio tools, so selection between them is left implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphql_mutationRun one GraphQL mutationBDestructive
One parsed GraphQL mutation with one direct root field and explicit confirmation. Adds __typename and MutationError catch-all to detect HTTP 200 failures. No automatic retry.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| confirm | No | Set true only when the user asked for exactly this action. | |
| document | Yes | ||
| variables | No | Native JSON variables; validated remotely by Buffer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description still adds real behavioral value beyond that: the MutationError catch-all and __typename injection to detect HTTP 200 failures, and the explicit 'No automatic retry' contract.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with zero filler, and the core contract (one root field, confirmation) is front-loaded. Slightly telegraphic but appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so some burden falls on the description, and it does disclose the error-detection mechanism and the no-retry policy. However, it omits what a failure response looks like beyond MutationError and never redirects to preview_operation, leaving a gap for a destructive, non-idempotent tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so the baseline is 3. The description adds the 'one direct root field' constraint for the undocumented document parameter, which is meaningful, but it adds nothing for confirm, account, or variables beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (run a GraphQL mutation) and adds a concrete constraint: one direct root field with explicit confirmation. It is distinguishable from graphql_query by the mutation keyword, though it never explicitly contrasts with that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'explicit confirmation' hints at the confirm parameter but gives no when-to-use versus graphql_query or preview_operation, and no guidance on prerequisites or when not to run a mutation directly. No alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphql_queryRun one GraphQL queryARead-onlyIdempotent
One parsed GraphQL query; mutations and subscriptions are refused. Use explicit minimal selections. Current experimental APIs are accessible subject to provider availability.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| document | Yes | ||
| variables | No | Native JSON variables; validated remotely by Buffer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds two genuine behavioral facts beyond that: mutations/subscriptions are rejected, and experimental APIs depend on provider availability. The latter is vague and no error/failure behavior is described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core constraint (one parsed query, no mutations). Efficient, though the trailing 'subject to provider availability' clause is hedged and low-information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and annotations carrying the safety profile, the description covers the essential decision points for a generic GraphQL escape hatch: what it accepts, what it rejects. Remaining gaps (error shape, auth/rate limits, relationship to preview helpers) are minor for a read-only query tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: account and variables are documented in-schema, but the required 'document' parameter has no schema description. The phrase 'parsed GraphQL query' partially compensates by clarifying its expected content, and 'explicit minimal selections' constrains authoring, but nothing explains the relationship between document and variables beyond the schema's own note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('One parsed GraphQL query') and immediately bounds it by refusing mutations and subscriptions, which cleanly separates it from graphql_mutation. It does not explicitly name the sibling, but the boundary is unambiguous to an agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The refusal of mutations/subscriptions implicitly routes write operations to graphql_mutation, and 'Use explicit minimal selections' is a query-authoring directive. However, it never states when to reach for this raw tool versus the many typed helpers (get_post, get_channels) or preview_operation, leaving usage mostly inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsList private account profile labelsBRead-onlyIdempotent
Local names, default marker and whether authentication is configured. No token, token path or organization ID.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety behavior is covered. The description does add real value by disclosing what is deliberately omitted from the payload ('No token, token path or organization ID'), which is security-relevant context annotations cannot express. It stops short of any pagination, ordering or volume behavior, so it lands at adequate rather than strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is very short and front-loads the returned fields ahead of the exclusions, which is the right ordering. However, the two fragments are telegraphic – no subject or verb – so the first sentence reads as a bare noun list rather than a self-contained statement, costing it structure points.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no input parameters, the description is the sole source of shape information for this read tool, and it only partially discharges that duty: it names three returned attributes and three excluded ones but says nothing about how many accounts come back, ordering, or whether the list is scoped to the caller. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the 100% schema coverage baseline applies trivially. No misleading param claims are made.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description enumerates the profile attributes surfaced ('Local names, default marker and whether authentication is configured') but never states the action or resource in verb+object form – the agent infers 'list accounts' from the name and title rather than the description. It does distinguish itself from get_account only weakly, via the field-list framing, not by naming the sibling or the singular-vs-plural intent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use, when-not-to-use, or alternative is given. The sibling get_account sits right next to it and the description offers no guidance on choosing the collection form over the single-account form. Usage is only implied by the plural tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_post_in_queueMove post in queueADestructive
Move a queued post to the top or bottom of its channel's queue. Unlike editPost, this is a scheduling-only operation that never re-validates the post's content.. Current Buffer GraphQL movePostInQueue. Requires explicit confirmation. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ID of the post to move. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| confirm | No | Set true only when the user asked for exactly this action. | |
| payload | No | Complete native input object instead of individual input fields. | |
| position | No | Target position within the channel's queue. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation/safety profile is covered. The description adds real context beyond them: that it is scheduling-only with no content re-validation, that explicit confirmation is required, and that 'provider errors are failures even with HTTP 200.' These are non-obvious behavioral traits an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded and the description stays tight, with each clause carrying information (alternative, confirmation, error semantics). Minor waste remains – 'Current Buffer GraphQL movePostInQueue' adds little for an agent, and there is a stray double period.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool, the description, annotations, and 100% schema coverage together give the agent what it needs: purpose, alternative, confirmation requirement, and error behavior. No output schema is present, but the return shape is not critical for this action. Nearly complete, with only return/effect details unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents id, fields, confirm, position, payload, etc. The description only lightly reinforces this ('Use upstream fields to bound data', confirmation requirement) without adding syntax or format detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource – 'Move a queued post to the top or bottom of its channel's queue' – leaving no ambiguity about the operation. It also explicitly differentiates itself from the sibling edit_post by noting it is a 'scheduling-only operation that never re-validates the post's content.' An agent can distinguish this from the many other post tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative ('Unlike editPost') and gives the discriminating condition (scheduling-only, no content re-validation), plus a prerequisite ('Requires explicit confirmation'). This is clear routing context, though it stops short of an explicit when-not-to-use statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_operationPreview a named operation locallyARead-onlyIdempotent
Validate a current named input and upstream field selection, then return document and variables without credentials or a request. Does not validate permissions, assets or platform rules remotely. Operation names use native GraphQL camelCase.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | Yes | Arguments for that named tool. Provide all required native input, including organizationId; profile defaults are not read. | |
| operation | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description still adds real value by disclosing that it makes no request, needs no credentials, and does NOT validate permissions/assets/platform rules remotely — behavior an agent could not infer from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the core purpose front-loaded first, followed by the limitation and the naming convention. No filler, though the closing sentence on camelCase could be integrated more smoothly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the return values (document and variables) and enumerating the offloaded limitations. For a two-parameter, no-request validation tool this is nearly complete; only the format/shape of the returned document and variables is left underspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, so the schema carries half the burden. The description adds meaningful guidance beyond it — 'Operation names use native GraphQL camelCase' clarifies the operation enum, and 'including organizationId; profile defaults are not read' is already inside the arguments schema description. Baseline 3 is appropriate; it does not add syntax beyond the enum hint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (validate) and resource (named operation input plus upstream field selection) and states the concrete output: document and variables without a request. It implicitly distinguishes itself from execution tools like graphql_query/graphql_mutation by emphasizing 'without credentials or a request', but never names a sibling explicitly, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'without credentials or a request' implies this is a pre-flight/dry-run check, and 'Does not validate permissions, assets or platform rules remotely' sets a boundary. However, it never states when to use this instead of graphql_query/graphql_mutation or get_operation_schema, so usage is only implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
promote_content_item_draft_to_postsPromote a channel-less draft into channel-specific postsADestructive
Promote a channel-less draft into channel-specific posts. One-way: once promoted, the content item can no longer be edited as a draft. If any post fails validation, none are created. A failure can also be reported when a post could not be fully processed after the promotion already took effect; re-fetch the content item to check its state before retrying.
This API is an early preview and can change without a deprecation period.. Current Buffer GraphQL promoteContentItemDraftToPosts. Requires explicit confirmation. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The content item to promote. | |
| posts | No | ||
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| tagIds | No | ||
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| confirm | No | Set true only when the user asked for exactly this action. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint/openWorldHint annotations, it discloses rich behavior: the one-way draft-to-post transition, all-or-nothing validation ('if any post fails validation, none are created'), partial-success failure mode, and the instruction to re-fetch state before retrying. These are exactly the operational details an agent needs for a destructive, non-idempotent mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence followed by behavioral caveats in priority order. It is dense but every sentence carries operational weight; only the double-period artifact ('period.. Current Buffer GraphQL') is cosmetic noise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, nested, 8-parameter mutation with no output schema, the description covers the crucial behavior (irreversibility, atomicity, partial-failure recovery, confirmation). It does not describe the shape of the posts it creates, but that is defined in the schema, keeping this complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the schema already documents most parameters. The description adds useful guidance for the `fields` parameter ('use upstream fields to bound data') and the confirmation requirement tied to `confirm`, but it does not explain the posts array or other parameters beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (promote) and a precise transformation (channel-less draft -> channel-specific posts), making it instantly distinguishable from siblings like update_content_item_draft or add_post_to_content_item. An agent knows exactly what state change this tool performs without reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It establishes key preconditions (one-way irreversibility, explicit confirmation required, preview API) that tell the agent when this operation is appropriate. It stops short of naming alternatives or stating when NOT to choose this over creating posts directly, so it's clear context without routing exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_pagesRead bounded native cursor pagesARead-onlyIdempotent
Read one to five pages of a schema-generated query. No mutations. Automatically includes hasNextPage/endCursor, stops on repeated or missing cursors and returns continuation state. API errors abort the remaining pages; no retries.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | Yes | Arguments for the native read tool, including filters, fields, first/after and account. | |
| max_pages | No | ||
| operation | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: automatic hasNextPage/endCursor inclusion, stopping on repeated or missing cursors, returning continuation state, aborting remaining pages on API errors, and no retries. These are exactly the runtime traits an agent cannot get from readOnlyHint/idempotentHint, so the description earns high marks.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the read scope, then pagination guarantees, then error semantics. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description properly describes what comes back (hasNextPage/endCursor, continuation state) and how failures are handled. It is nearly complete for a 3-param tool, though it never says where the operation enums come from or how to discover valid query shapes, which the get_operation_schema sibling implies is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, so the description must compensate. It does partially: 'one to five pages' restates the max_pages bound and 'cursor'/'continuation state' gives meaning to the first/after fields buried in the nested arguments object. However, the operation enum values and the overall arguments structure remain unexplained in prose, leaving the compensation incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: reading one to five pages of a schema-generated query, with the key distinguishing trait (bounded multi-page cursor reads) up front. It does not name which sibling it replaces (e.g. graphql_query or get_operation_schema) or clarify what a 'schema-generated query' means relative to those tools, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance: nothing says when to prefer this over graphql_query, get_operation_schema, or the typed single-item getters (get_posts, get_content_items, etc.). The reader must infer usage from the 'schema-generated query' phrase alone, and no exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_post_from_content_itemRemove a post from a content itemADestructive
Remove a post from a content item. The post survives on its own channel and keeps its schedule, text, status, and tags. Only the link to the content item goes away. To delete a post, call deletePost.
A second call with a post that belongs to no content item changes nothing, and the mutation reports success.. Current Buffer GraphQL removePostFromContentItem. Requires explicit confirmation. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The content item to remove the post from. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| postId | No | The post to remove from a content item. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| confirm | No | Set true only when the user asked for exactly this action. | |
| payload | No | Complete native input object instead of individual input fields. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by spelling out exactly what is destroyed (only the link) and what survives (channel, schedule, text, status, tags), plus the no-op-on-repeat behavior and that provider errors surface even at HTTP 200. Note a soft tension: destructiveHint=true while the text emphasizes the post survives and only the link is removed, and the described repeat-call no-op reads as idempotent despite idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core is front-loaded and the lifecycle/alternative sentences earn their place, but the trailing block ('Current Buffer GraphQL removePostFromContentItem… provider errors are failures even with HTTP 200') reads as leaked context crammed on, and the double period after 'success..' is sloppy. Mixed structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-param mutation wrapper with no output schema, the description covers purpose, the delete alternative, preservation semantics, confirmation, and error behavior, which is enough to call it correctly. Remaining gaps (batching/idempotency edge cases) are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters (including the payload_file/payload mutual exclusivity). The description only lightly reinforces this with 'Requires explicit confirmation' and 'Use upstream fields to bound data', which don't add syntax beyond what the schema states. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Remove a post from a content item') and immediately disambiguates from the obvious sibling by routing deletions to deletePost. An agent can distinguish this unlink operation from delete_post without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative for the delete case ('To delete a post, call deletePost') and states the confirmation requirement, giving clear selection context. It stops short of covering other siblings (e.g. move_post_in_queue, delete_content_item), so it isn't a full when/when-not map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_content_itemUpdate a content item's title or target dateADestructive
Update a content item's title or target date. Fields that are omitted keep their current value.
This API is an early preview and can change without a deprecation period.. Current Buffer GraphQL updateContentItem. Requires explicit confirmation. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The content item to update. | |
| title | No | Omit to preserve the existing title. Null clears it. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| confirm | No | Set true only when the user asked for exactly this action. | |
| payload | No | Complete native input object instead of individual input fields. | |
| targetDate | No | Omit to preserve the existing target date. Null clears it. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, openWorldHint=true, so safety is covered. The description adds real value beyond them: omitted fields retain current values, an early-preview instability warning that changes can land without a deprecation period, and the 'provider errors are failures even with HTTP 200' caveat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and earns its place, but the middle is sloppy: a stray double period ('period.. Current Buffer GraphQL updateContentItem.') and an internal implementation name that reads like a leaked artifact rather than useful guidance. The preview warning and confirmation note are valuable but poorly integrated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema and full annotation coverage, the description supplies the key missing pieces: confirmation requirement, field-preservation semantics, and the preview instability caveat. The only omission is explicit routing against the draft-update sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 8 parameters, including the nested payload object and payload_file exclusivity rules, so the schema already carries the semantics. The description adds no parameter-level detail beyond what is documented, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (content item) plus the exact updatable fields (title, target date). It distinguishes itself from update_content_item_draft by naming the concrete fields, though it never explicitly contrasts with that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says 'Requires explicit confirmation' and warns about provider errors with HTTP 200, which implies preconditions, but it never states when to prefer this tool over update_content_item_draft or the generic graphql_mutation. Usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_content_item_draftUpdate content item draftADestructive
Replace a channel-less draft's content in full, and optionally set the content item's target date in the same write. The draft needs text or at least one asset. Only valid while the content item is still a draft.
This API is an early preview and can change without a deprecation period.. Current Buffer GraphQL updateContentItemDraft. Requires explicit confirmation. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The content item whose channel-less draft is replaced. | |
| draft | No | ||
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| tagIds | No | ||
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| confirm | No | Set true only when the user asked for exactly this action. | |
| payload | No | Complete native input object instead of individual input fields. | |
| targetDate | No | ||
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, but the description adds substantive context beyond them: the write is a full replacement, it is draft-only, it requires explicit user confirmation, it sits behind an unstable preview API, and provider errors can surface even with HTTP 200. These are genuinely useful operational facts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and constraints in short sentences, but has minor clutter: a doubled period, and 'Current Buffer GraphQL updateContentItemDraft' which reads as an implementation note rather than agent-facing guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, nested-object mutation with no output schema, the description covers the key behavioral needs (destructive replacement, draft-only, confirmation, preview instability). It could be stronger on how payload/payload_file/individual fields interact, but the schema covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the schema itself documents the nested draft/asset structure in detail. The description adds a couple of useful hints ('target date in the same write,' 'use upstream fields to bound data'), but does not meaningfully clarify the confirm, account, or payload_file parameters beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Replace a channel-less draft's content in full') plus an optional secondary write (target date). The 'channel-less' qualifier and the draft-only constraint distinguish it from siblings like update_content_item and create_content_item_draft.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real preconditions: 'Only valid while the content item is still a draft,' 'The draft needs text or at least one asset,' and 'Requires explicit confirmation.' It frames when the call is legal but never names an alternative sibling (e.g. update_content_item for non-draft edits).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_post_templateUpdate post templateADestructive
Update a post template owned by the caller (or an internal template in the caller's organization, if the caller is an org admin/owner).. Current Buffer GraphQL updatePostTemplate. Requires explicit confirmation. Use upstream fields to bound data; provider errors are failures even with HTTP 200.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The ID of the template to update. | |
| body | No | The main content body of the template, may contain {{placeholders}}. | |
| emoji | No | The emoji associated with the template. | |
| title | No | The title of the template. | |
| fields | No | Upstream field paths relative to the result, as in official CLI --fields. Default fields are bounded. Use items.id for connection nodes; pageInfo.endCursor for cursors. | |
| account | No | Private account profile name. Selects credentials only; an organization default does not restrict provider token permissions. | |
| confirm | No | Set true only when the user asked for exactly this action. | |
| payload | No | Complete native input object instead of individual input fields. | |
| visibility | No | `public` is rejected — it is only available to official Buffer clients. | |
| description | No | A short user-facing description of the template. | |
| payload_file | No | Regular local JSON input file, no symlink, at most 1 MiB; cannot mix with payload or individual input fields. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, idempotent=false, openWorld=true, so the safety profile is covered. The description adds real value beyond that: the confirmation requirement, the org-admin/owner authorization nuance, and the note that provider errors are failures even with HTTP 200. It does not, however, state what happens to unmentioned fields on update.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Compact but slightly run-on: it packs ownership scope, an internal GraphQL reference, a confirmation rule, and error semantics into one stream with a stray double period. The filler phrase "Current Buffer GraphQL updatePostTemplate" adds little for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-param destructive mutation with a nested payload object and no output schema, the description covers authorization scope, confirmation, and error semantics well. Remaining gaps (payload vs payload_file vs individual field precedence) are handled by the schema, so the definition is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are fully documented in the schema (including payload vs payload_file mutual exclusivity and the rejected `public` visibility). The description only adds "Use upstream fields to bound data" for the fields param, which is marginal over the schema's own `--fields` note. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Update a post template") and further narrows scope by ownership (caller-owned, or internal templates for org admin/owner). This cleanly distinguishes it from create_post_template, get_post_template, and delete_post_template.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Requires explicit confirmation" gives a gating condition for invoking, but there is no explicit when-to-use vs alternatives guidance (e.g., create_post_template for new templates, get_post_template for reads). Usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
25 tool updates
v3.0.1- Changed
add_post_to_content_item1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true for this exact user-requested Buffer mutation."New value: +"Set true only when the user asked for exactly this action."
- Changed
create_content_item18 fields changed- added
Input schema / $defsAdded value: +{ + "button": { + "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", + "enum": [ + "book", + "call", + "learn_more", + "none", + "order", + "shop", + "signup" + ], + "type": "string" + }, + "linkAttachment": { + "additionalProperties": false, + "properties": { + "description": { + "description": "Description shown on the link card", + "type": "string" + }, + "thumbnail": { + "additionalProperties": false, + "properties": { + "url": { + "description": "URL of the thumbnail image", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "title": { + "description": "Title shown on the link card", + "type": "string" + }, + "url": { + "description": "URL that the link asset has been built from", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "posts": { + "description": "The channel-specific post variants to create, one per channel. Provide at\nleast one variant, and at most one variant per channel.", + "items": { + "additionalProperties": false, + "properties": { + "aiAssisted": { + "description": "If this post was created with the help of AI", + "type": "boolean" + }, + "assets": { + "description": "Ordered list of assets on this post.", + "items": { + "additionalProperties": false, + "properties": { + "document": { + "additionalProperties": false, + "properties": { + "thumbnailUrl": { + "description": "Document thumbnail URL", + "type": "string" + }, + "title": { + "description": "Document title", + "type": "string" + }, + "url": { + "description": "Document URL", + "type": "string" + } + }, + "required": [ + "thumbnailUrl", + "title", + "url" + ], + "type": "object" + }, + "image": { + "additionalProperties": false, + "properties": { + "metadata": { + "additionalProperties": false, + "properties": { + "altText": { + "description": "Alternative text for accessibility", + "type": "string" + }, + "animatedThumbnail": { + "description": "Animated thumbnail URL", + "type": "string" + }, + "dimensions": { + "additionalProperties": false, + "properties": { + "height": { + "description": "Image height in pixels", + "type": "integer" + }, + "width": { + "description": "Image width in pixels", + "type": "integer" + } + }, + "required": [ + "height", + "width" + ], + "type": "object" + }, + "userTags": { + "description": "Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput.", + "items": { + "additionalProperties": false, + "properties": { + "handle": { + "description": "The handle (username) of the account to tag, without the leading @.", + "type": "string" + }, + "x": { + "description": "Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width.", + "type": "number" + }, + "y": { + "description": "Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height.", + "type": "number" + } + }, + "required": [ + "handle", + "x", + "y" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "altText" + ], + "type": "object" + }, + "thumbnailUrl": { + "description": "URL to the static thumbnail of the asset", + "type": "string" + }, + "url": { + "description": "URL to the file source", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "link": { + "additionalProperties": false, + "properties": { + "description": { + "description": "Description of the link", + "type": "string" + }, + "thumbnailUrl": { + "description": "Thumbnail URL of the link", + "type": "string" + }, + "title": { + "description": "Title of the link", + "type": "string" + }, + "url": { + "description": "URL to the link", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "video": { + "additionalProperties": false, + "properties": { + "metadata": { + "additionalProperties": false, + "properties": { + "thumbnailOffset": { + "description": "Offset of the thumbnail chosen for the video, in ms", + "type": "integer" + }, + "title": { + "description": "Video title", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "thumbnailUrl": { + "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", + "type": "string" + }, + "url": { + "description": "URL to the file source", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + } + }, + "required": [], + "type": "object" + }, + "type": "array" + }, + "channelId": { + "description": "Channel's Id for which we want to create the post", + "type": "string" + }, + "draftId": { + "description": "Is set when the Post is generated from a Draft", + "type": "string" + }, + "dueAt": { + "description": "Date when the post is scheduled to be published", + "type": "string" + }, + "ideaId": { + "description": "Is set when the Post is generated from an Idea", + "type": "string" + }, + "metadata": { + "additionalProperties": false, + "properties": { + "bluesky": { + "additionalProperties": false, + "properties": { + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + }, + "thread": { + "$ref": "#/$defs/thread" + } + }, + "required": [], + "type": "object" + }, + "facebook": { + "additionalProperties": false, + "properties": { + "annotations": { + "description": "Annotations representing entities in the text", + "items": { + "additionalProperties": false, + "properties": { + "content": { + "description": "The content of the annotation, e.g. '107509875938399'", + "type": "string" + }, + "indices": { + "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", + "items": { + "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", + "type": "integer" + }, + "type": "array" + }, + "text": { + "description": "The text representation of the annotation, eg 'Buffer'", + "type": "string" + }, + "url": { + "description": "The URL the annotation points to, e.g. https://www.facebook.com/107509875938399", + "type": "string" + } + }, + "required": [ + "content", + "indices", + "text", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "firstComment": { + "description": "Facebook post's first comment", + "type": "string" + }, + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + }, + "type": { + "description": "The channel-specific type of the post, eg, post, story, reel for Facebook", + "enum": [ + "post", + "reel", + "story" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "google": { + "additionalProperties": false, + "properties": { + "detailsEvent": { + "additionalProperties": false, + "properties": { + "button": { + "$ref": "#/$defs/button" + }, + "endDate": { + "description": "End date of the event. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "isFullDayEvent": { + "description": "Indicate whether the event has a start or end time.", + "type": "boolean" + }, + "link": { + "description": "Link to the action", + "type": "string" + }, + "startDate": { + "description": "Start date of the event. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "title": { + "description": "Title of the event. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + } + }, + "required": [ + "isFullDayEvent" + ], + "type": "object" + }, + "detailsOffer": { + "additionalProperties": false, + "properties": { + "code": { + "description": "Coupon code for the offer", + "type": "string" + }, + "endDate": { + "description": "End date of the offer. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "link": { + "description": "Link to the offer", + "type": "string" + }, + "startDate": { + "description": "Start date of the offer. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "terms": { + "description": "Terms and Conditions", + "type": "string" + }, + "title": { + "description": "Title of the offer. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "detailsWhatsNew": { + "additionalProperties": false, + "properties": { + "button": { + "$ref": "#/$defs/button" + }, + "link": { + "description": "Link to the action", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "title": { + "description": "Title if available in the given GBP post type: event and offer", + "type": "string" + }, + "type": { + "description": "The channel-specific type of the post, eg, post, offer, event for Google Business Profile", + "enum": [ + "event", + "offer", + "whats_new" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "instagram": { + "additionalProperties": false, + "properties": { + "firstComment": { + "description": "Instagram post's first comment", + "type": "string" + }, + "geolocation": { + "additionalProperties": false, + "properties": { + "id": { + "description": "The id of this location", + "type": "string" + }, + "text": { + "description": "The name of this location", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "isAiGenerated": { + "description": "Whether the post discloses AI-generated content", + "type": "boolean" + }, + "link": { + "description": "Shop Grid link for the post", + "type": "string" + }, + "shouldShareToFeed": { + "description": "Indicates whether post should be shared to feed", + "type": "boolean" + }, + "stickerFields": { + "additionalProperties": false, + "properties": { + "music": { + "description": "Placeholder text for the post's music", + "type": "string" + }, + "other": { + "description": "Additional field for any other post content", + "type": "string" + }, + "products": { + "description": "Placeholder text for the post's linked products", + "type": "string" + }, + "text": { + "description": "Text for the Story or Reel", + "type": "string" + }, + "topics": { + "description": "Placeholder text for the post's topics (Reels only)", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "type": { + "description": "The channel-specific type of the post, eg, post, story, reel for Instagram", + "enum": [ + "carousel", + "event", + "ghost_post", + "offer", + "post", + "reel", + "short", + "story", + "thread", + "whats_new" + ], + "type": "string" + } + }, + "required": [ + "shouldShareToFeed", + "type" + ], + "type": "object" + }, + "linkedin": { + "additionalProperties": false, + "properties": { + "annotations": { + "description": "Annotations representing entities in the text", + "items": { + "additionalProperties": false, + "properties": { + "entity": { + "description": "The entity of the annotation, e.g. urn:li:organization:1521226", + "type": "string" + }, + "id": { + "description": "The id of the annotation, e.g. 1521226", + "type": "string" + }, + "length": { + "description": "The length of the annotation, e.g. 6", + "type": "integer" + }, + "link": { + "description": "The link of the annotation, e.g. https://www.linkedin.com/company/bufferapp", + "type": "string" + }, + "localizedName": { + "description": "The localized name of the annotation, e.g. Buffer", + "type": "string" + }, + "start": { + "description": "The start of the annotation, e.g. 5", + "type": "integer" + }, + "vanityName": { + "description": "The vanity name of the annotation, e.g. bufferapp", + "type": "string" + } + }, + "required": [ + "id", + "entity", + "length", + "link", + "localizedName", + "start", + "vanityName" + ], + "type": "object" + }, + "type": "array" + }, + "firstComment": { + "description": "LinkedIn post's first comment", + "type": "string" + }, + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + } + }, + "required": [], + "type": "object" + }, + "mastodon": { + "additionalProperties": false, + "properties": { + "spoilerText": { + "description": "Spoiler text hiding the root text of this post", + "type": "string" + }, + "thread": { + "$ref": "#/$defs/thread" + } + }, + "required": [], + "type": "object" + }, + "pinterest": { + "additionalProperties": false, + "properties": { + "boardServiceId": { + "description": "The board ID of the Pin, can be obtained when fetching the channel details with the following query:\n```\nquery GetChannelWithSubprofiles {\n channel(input: { id: \"[CHANNEL_ID_HERE]\" }) {\n metadata {\n ... on PinterestMetadata {\n boards {\n serviceId\n }\n }\n }\n }\n}\n```\nRequired on create; optional on edit (omitted preserves existing board).", + "type": "string" + }, + "title": { + "description": "The title of the Pin", + "type": "string" + }, + "url": { + "description": "The Pin destination link", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "substack": { + "additionalProperties": false, + "properties": { + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + } + }, + "required": [], + "type": "object" + }, + "threads": { + "additionalProperties": false, + "properties": { + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + }, + "locationId": { + "description": "LocationId associated with the post", + "type": "string" + }, + "locationName": { + "description": "Location name associated with the post", + "type": "string" + }, + "thread": { + "$ref": "#/$defs/thread" + }, + "topic": { + "description": "Topic associated with the post", + "type": "string" + }, + "type": { + "description": "The type of the post", + "enum": [ + "carousel", + "event", + "ghost_post", + "offer", + "post", + "reel", + "short", + "story", + "thread", + "whats_new" + ], + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "tiktok": { + "additionalProperties": false, + "properties": { + "isAiGenerated": { + "description": "Whether the post discloses AI-generated content (TikTok video only)", + "type": "boolean" + }, + "title": { + "description": "The title of the TikTok post (for photo posts)", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "twitter": { + "additionalProperties": false, + "properties": { + "isAiGenerated": { + "description": "Whether the post discloses AI-generated content (original tweets only, never retweets)", + "type": "boolean" + }, + "retweet": { + "additionalProperties": false, + "properties": { + "comment": { + "description": "Optional user comment shown above the embedded retweet", + "type": "string" + }, + "id": { + "description": "Retweet ID", + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "thread": { + "$ref": "#/$defs/thread" + } + }, + "required": [], + "type": "object" + }, + "youtube": { + "additionalProperties": false, + "properties": { + "categoryId": { + "description": "Youtube Category ID, one ID of this list:\nID: 1 -> Film & Animation\nID: 2 -> Autos & Vehicles\nID: 10 -> Music\nID: 15 -> Pets & Animals\nID: 17 -> Sports\nID: 19 -> Travel & Events\nID: 20 -> Gaming\nID: 22 -> People & Blogs\nID: 23 -> Comedy\nID: 24 -> Entertainment\nID: 25 -> News & Politics\nID: 26 -> Howto & Style\nID: 27 -> Education\nID: 28 -> Science & Technology\nID: 29 -> Nonprofits & Activism\n\nRequired on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "embeddable": { + "description": "Indicates whether the video allows embedding (default: true)", + "type": "boolean" + }, + "isAiGenerated": { + "description": "Whether the post discloses AI-generated content", + "type": "boolean" + }, + "license": { + "description": "Video license (default: youtube)", + "enum": [ + "creativeCommon", + "youtube" + ], + "type": "string" + }, + "madeForKids": { + "description": "Indicates whether the video is suitable for kids (default: false)", + "type": "boolean" + }, + "notifySubscribers": { + "description": "Indicates whether to notify subscribers on publish video (default: true)", + "type": "boolean" + }, + "privacy": { + "description": "Privacy setting for post (default: public)", + "enum": [ + "private", + "public", + "unlisted" + ], + "type": "string" + }, + "title": { + "description": "Title of the Youtube post. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + } + }, + "required": [], + "type": "object" + } + }, + "required": [], + "type": "object" + }, + "mode": { + "description": "How the post is being scheduled.", + "enum": [ + "addToQueue", + "customScheduled", + "shareNext", + "shareNow" + ], + "type": "string" + }, + "needsApproval": { + "description": "Submit the post for approval instead of scheduling it. A post submitted for\napproval is always a draft, so this conflicts with turning `saveToDraft` off.\n\nOnly valid when your posting policy on the target channel requires approval.", + "type": "boolean" + }, + "saveToDraft": { + "description": "If true, saves the post as a draft instead of scheduling it.\nWhen saving as draft:\n- Post status will be 'draft' instead of 'buffer'\n- Posting limits are not checked\n- The post will not be published until explicitly scheduled", + "type": "boolean" + }, + "schedulingType": { + "description": "Scheduling type to indicate notification publishing or automatic publishing", + "enum": [ + "automatic", + "notification" + ], + "type": "string" + }, + "source": { + "description": "source where the composer was initiated from, used for tracking.", + "type": "string" + }, + "tagIds": { + "description": "List of tag IDs", + "items": { + "description": "List of tag IDs", + "type": "string" + }, + "type": "array" + }, + "text": { + "description": "Text content of the Post.\n\nNote: for threaded posts, this needs to match the first item in the `thread` array.", + "type": "string" + } + }, + "required": [ + "channelId", + "mode", + "schedulingType" + ], + "type": "object" + }, + "type": "array" + }, + "tagIds": { + "description": "Tags to apply to this content item. Omit to create it with no tags.", + "items": { + "description": "Tags to apply to this content item. Omit to create it with no tags.", + "type": "string" + }, + "type": "array" + }, + "thread": { + "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", + "items": { + "additionalProperties": false, + "properties": { + "assets": { + "description": "Ordered list of assets on this threaded post", + "items": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "type": "array" + }, + "metadata": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "text": { + "description": "The text body content of the threaded post", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "type": "array" + } +} - changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true for this exact user-requested Buffer mutation."New value: +"Set true only when the user asked for exactly this action." - added
Input schema / properties / payload / properties / posts / $refAdded value: +"#/$defs/posts" - removed
Input schema / properties / payload / properties / posts / descriptionRemoved value: -"The channel-specific post variants to create, one per channel. Provide at\nleast one variant, and at most one variant per channel." - removed
Input schema / properties / payload / properties / posts / itemsRemoved value: -{ - "additionalProperties": false, - "properties": { - "aiAssisted": { - "description": "If this post was created with the help of AI", - "type": "boolean" - }, - "assets": { - "description": "Ordered list of assets on this post.", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "altText": { - "description": "Alternative text for accessibility", - "type": "string" - }, - "animatedThumbnail": { - "description": "Animated thumbnail URL", - "type": "string" - }, - "dimensions": { - "additionalProperties": false, - "properties": { - "height": { - "description": "Image height in pixels", - "type": "integer" - }, - "width": { - "description": "Image width in pixels", - "type": "integer" - } - }, - "required": [ - "height", - "width" - ], - "type": "object" - }, - "userTags": { - "description": "Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput.", - "items": { - "additionalProperties": false, - "properties": { - "handle": { - "description": "The handle (username) of the account to tag, without the leading @.", - "type": "string" - }, - "x": { - "description": "Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width.", - "type": "number" - }, - "y": { - "description": "Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height.", - "type": "number" - } - }, - "required": [ - "handle", - "x", - "y" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "altText" - ], - "type": "object" - }, - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "thumbnailOffset": { - "description": "Offset of the thumbnail chosen for the video, in ms", - "type": "integer" - }, - "title": { - "description": "Video title", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "channelId": { - "description": "Channel's Id for which we want to create the post", - "type": "string" - }, - "draftId": { - "description": "Is set when the Post is generated from a Draft", - "type": "string" - }, - "dueAt": { - "description": "Date when the post is scheduled to be published", - "type": "string" - }, - "ideaId": { - "description": "Is set when the Post is generated from an Idea", - "type": "string" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "facebook": { - "additionalProperties": false, - "properties": { - "annotations": { - "description": "Annotations representing entities in the text", - "items": { - "additionalProperties": false, - "properties": { - "content": { - "description": "The content of the annotation, e.g. '107509875938399'", - "type": "string" - }, - "indices": { - "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", - "items": { - "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", - "type": "integer" - }, - "type": "array" - }, - "text": { - "description": "The text representation of the annotation, eg 'Buffer'", - "type": "string" - }, - "url": { - "description": "The URL the annotation points to, e.g. https://www.facebook.com/107509875938399", - "type": "string" - } - }, - "required": [ - "content", - "indices", - "text", - "url" - ], - "type": "object" - }, - "type": "array" - }, - "firstComment": { - "description": "Facebook post's first comment", - "type": "string" - }, - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, story, reel for Facebook", - "enum": [ - "post", - "reel", - "story" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "google": { - "additionalProperties": false, - "properties": { - "detailsEvent": { - "additionalProperties": false, - "properties": { - "button": { - "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", - "enum": [ - "book", - "call", - "learn_more", - "none", - "order", - "shop", - "signup" - ], - "type": "string" - }, - "endDate": { - "description": "End date of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "isFullDayEvent": { - "description": "Indicate whether the event has a start or end time.", - "type": "boolean" - }, - "link": { - "description": "Link to the action", - "type": "string" - }, - "startDate": { - "description": "Start date of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "title": { - "description": "Title of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [ - "isFullDayEvent" - ], - "type": "object" - }, - "detailsOffer": { - "additionalProperties": false, - "properties": { - "code": { - "description": "Coupon code for the offer", - "type": "string" - }, - "endDate": { - "description": "End date of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "link": { - "description": "Link to the offer", - "type": "string" - }, - "startDate": { - "description": "Start date of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "terms": { - "description": "Terms and Conditions", - "type": "string" - }, - "title": { - "description": "Title of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "detailsWhatsNew": { - "additionalProperties": false, - "properties": { - "button": { - "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", - "enum": [ - "book", - "call", - "learn_more", - "none", - "order", - "shop", - "signup" - ], - "type": "string" - }, - "link": { - "description": "Link to the action", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "title": { - "description": "Title if available in the given GBP post type: event and offer", - "type": "string" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, offer, event for Google Business Profile", - "enum": [ - "event", - "offer", - "whats_new" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "instagram": { - "additionalProperties": false, - "properties": { - "firstComment": { - "description": "Instagram post's first comment", - "type": "string" - }, - "geolocation": { - "additionalProperties": false, - "properties": { - "id": { - "description": "The id of this location", - "type": "string" - }, - "text": { - "description": "The name of this location", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content", - "type": "boolean" - }, - "link": { - "description": "Shop Grid link for the post", - "type": "string" - }, - "shouldShareToFeed": { - "description": "Indicates whether post should be shared to feed", - "type": "boolean" - }, - "stickerFields": { - "additionalProperties": false, - "properties": { - "music": { - "description": "Placeholder text for the post's music", - "type": "string" - }, - "other": { - "description": "Additional field for any other post content", - "type": "string" - }, - "products": { - "description": "Placeholder text for the post's linked products", - "type": "string" - }, - "text": { - "description": "Text for the Story or Reel", - "type": "string" - }, - "topics": { - "description": "Placeholder text for the post's topics (Reels only)", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, story, reel for Instagram", - "enum": [ - "carousel", - "event", - "ghost_post", - "offer", - "post", - "reel", - "short", - "story", - "thread", - "whats_new" - ], - "type": "string" - } - }, - "required": [ - "shouldShareToFeed", - "type" - ], - "type": "object" - }, - "linkedin": { - "additionalProperties": false, - "properties": { - "annotations": { - "description": "Annotations representing entities in the text", - "items": { - "additionalProperties": false, - "properties": { - "entity": { - "description": "The entity of the annotation, e.g. urn:li:organization:1521226", - "type": "string" - }, - "id": { - "description": "The id of the annotation, e.g. 1521226", - "type": "string" - }, - "length": { - "description": "The length of the annotation, e.g. 6", - "type": "integer" - }, - "link": { - "description": "The link of the annotation, e.g. https://www.linkedin.com/company/bufferapp", - "type": "string" - }, - "localizedName": { - "description": "The localized name of the annotation, e.g. Buffer", - "type": "string" - }, - "start": { - "description": "The start of the annotation, e.g. 5", - "type": "integer" - }, - "vanityName": { - "description": "The vanity name of the annotation, e.g. bufferapp", - "type": "string" - } - }, - "required": [ - "id", - "entity", - "length", - "link", - "localizedName", - "start", - "vanityName" - ], - "type": "object" - }, - "type": "array" - }, - "firstComment": { - "description": "LinkedIn post's first comment", - "type": "string" - }, - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "mastodon": { - "additionalProperties": false, - "properties": { - "spoilerText": { - "description": "Spoiler text hiding the root text of this post", - "type": "string" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "pinterest": { - "additionalProperties": false, - "properties": { - "boardServiceId": { - "description": "The board ID of the Pin, can be obtained when fetching the channel details with the following query:\n```\nquery GetChannelWithSubprofiles {\n channel(input: { id: \"[CHANNEL_ID_HERE]\" }) {\n metadata {\n ... on PinterestMetadata {\n boards {\n serviceId\n }\n }\n }\n }\n}\n```\nRequired on create; optional on edit (omitted preserves existing board).", - "type": "string" - }, - "title": { - "description": "The title of the Pin", - "type": "string" - }, - "url": { - "description": "The Pin destination link", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "substack": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "locationId": { - "description": "LocationId associated with the post", - "type": "string" - }, - "locationName": { - "description": "Location name associated with the post", - "type": "string" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "topic": { - "description": "Topic associated with the post", - "type": "string" - }, - "type": { - "description": "The type of the post", - "enum": [ - "carousel", - "event", - "ghost_post", - "offer", - "post", - "reel", - "short", - "story", - "thread", - "whats_new" - ], - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "tiktok": { - "additionalProperties": false, - "properties": { - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content (TikTok video only)", - "type": "boolean" - }, - "title": { - "description": "The title of the TikTok post (for photo posts)", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "twitter": { - "additionalProperties": false, - "properties": { - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content (original tweets only, never retweets)", - "type": "boolean" - }, - "retweet": { - "additionalProperties": false, - "properties": { - "comment": { - "description": "Optional user comment shown above the embedded retweet", - "type": "string" - }, - "id": { - "description": "Retweet ID", - "type": "string" - } - }, - "required": [ - "id" - ], - "type": "object" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "youtube": { - "additionalProperties": false, - "properties": { - "categoryId": { - "description": "Youtube Category ID, one ID of this list:\nID: 1 -> Film & Animation\nID: 2 -> Autos & Vehicles\nID: 10 -> Music\nID: 15 -> Pets & Animals\nID: 17 -> Sports\nID: 19 -> Travel & Events\nID: 20 -> Gaming\nID: 22 -> People & Blogs\nID: 23 -> Comedy\nID: 24 -> Entertainment\nID: 25 -> News & Politics\nID: 26 -> Howto & Style\nID: 27 -> Education\nID: 28 -> Science & Technology\nID: 29 -> Nonprofits & Activism\n\nRequired on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "embeddable": { - "description": "Indicates whether the video allows embedding (default: true)", - "type": "boolean" - }, - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content", - "type": "boolean" - }, - "license": { - "description": "Video license (default: youtube)", - "enum": [ - "creativeCommon", - "youtube" - ], - "type": "string" - }, - "madeForKids": { - "description": "Indicates whether the video is suitable for kids (default: false)", - "type": "boolean" - }, - "notifySubscribers": { - "description": "Indicates whether to notify subscribers on publish video (default: true)", - "type": "boolean" - }, - "privacy": { - "description": "Privacy setting for post (default: public)", - "enum": [ - "private", - "public", - "unlisted" - ], - "type": "string" - }, - "title": { - "description": "Title of the Youtube post. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "mode": { - "description": "How the post is being scheduled.", - "enum": [ - "addToQueue", - "customScheduled", - "shareNext", - "shareNow" - ], - "type": "string" - }, - "needsApproval": { - "description": "Submit the post for approval instead of scheduling it. A post submitted for\napproval is always a draft, so this conflicts with turning `saveToDraft` off.\n\nOnly valid when your posting policy on the target channel requires approval.", - "type": "boolean" - }, - "saveToDraft": { - "description": "If true, saves the post as a draft instead of scheduling it.\nWhen saving as draft:\n- Post status will be 'draft' instead of 'buffer'\n- Posting limits are not checked\n- The post will not be published until explicitly scheduled", - "type": "boolean" - }, - "schedulingType": { - "description": "Scheduling type to indicate notification publishing or automatic publishing", - "enum": [ - "automatic", - "notification" - ], - "type": "string" - }, - "source": { - "description": "source where the composer was initiated from, used for tracking.", - "type": "string" - }, - "tagIds": { - "description": "List of tag IDs", - "items": { - "description": "List of tag IDs", - "type": "string" - }, - "type": "array" - }, - "text": { - "description": "Text content of the Post.\n\nNote: for threaded posts, this needs to match the first item in the `thread` array.", - "type": "string" - } - }, - "required": [ - "channelId", - "mode", - "schedulingType" - ], - "type": "object" -} - removed
Input schema / properties / payload / properties / posts / typeRemoved value: -"array" - added
Input schema / properties / payload / properties / tagIds / $refAdded value: +"#/$defs/tagIds" - removed
Input schema / properties / payload / properties / tagIds / descriptionRemoved value: -"Tags to apply to this content item. Omit to create it with no tags." - removed
Input schema / properties / payload / properties / tagIds / itemsRemoved value: -{ - "description": "Tags to apply to this content item. Omit to create it with no tags.", - "type": "string" -} - removed
Input schema / properties / payload / properties / tagIds / typeRemoved value: -"array" - added
Input schema / properties / posts / $refAdded value: +"#/$defs/posts" - removed
Input schema / properties / posts / descriptionRemoved value: -"The channel-specific post variants to create, one per channel. Provide at\nleast one variant, and at most one variant per channel." - removed
Input schema / properties / posts / itemsRemoved value: -{ - "additionalProperties": false, - "properties": { - "aiAssisted": { - "description": "If this post was created with the help of AI", - "type": "boolean" - }, - "assets": { - "description": "Ordered list of assets on this post.", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "altText": { - "description": "Alternative text for accessibility", - "type": "string" - }, - "animatedThumbnail": { - "description": "Animated thumbnail URL", - "type": "string" - }, - "dimensions": { - "additionalProperties": false, - "properties": { - "height": { - "description": "Image height in pixels", - "type": "integer" - }, - "width": { - "description": "Image width in pixels", - "type": "integer" - } - }, - "required": [ - "height", - "width" - ], - "type": "object" - }, - "userTags": { - "description": "Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput.", - "items": { - "additionalProperties": false, - "properties": { - "handle": { - "description": "The handle (username) of the account to tag, without the leading @.", - "type": "string" - }, - "x": { - "description": "Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width.", - "type": "number" - }, - "y": { - "description": "Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height.", - "type": "number" - } - }, - "required": [ - "handle", - "x", - "y" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "altText" - ], - "type": "object" - }, - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "thumbnailOffset": { - "description": "Offset of the thumbnail chosen for the video, in ms", - "type": "integer" - }, - "title": { - "description": "Video title", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "channelId": { - "description": "Channel's Id for which we want to create the post", - "type": "string" - }, - "draftId": { - "description": "Is set when the Post is generated from a Draft", - "type": "string" - }, - "dueAt": { - "description": "Date when the post is scheduled to be published", - "type": "string" - }, - "ideaId": { - "description": "Is set when the Post is generated from an Idea", - "type": "string" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "facebook": { - "additionalProperties": false, - "properties": { - "annotations": { - "description": "Annotations representing entities in the text", - "items": { - "additionalProperties": false, - "properties": { - "content": { - "description": "The content of the annotation, e.g. '107509875938399'", - "type": "string" - }, - "indices": { - "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", - "items": { - "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", - "type": "integer" - }, - "type": "array" - }, - "text": { - "description": "The text representation of the annotation, eg 'Buffer'", - "type": "string" - }, - "url": { - "description": "The URL the annotation points to, e.g. https://www.facebook.com/107509875938399", - "type": "string" - } - }, - "required": [ - "content", - "indices", - "text", - "url" - ], - "type": "object" - }, - "type": "array" - }, - "firstComment": { - "description": "Facebook post's first comment", - "type": "string" - }, - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, story, reel for Facebook", - "enum": [ - "post", - "reel", - "story" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "google": { - "additionalProperties": false, - "properties": { - "detailsEvent": { - "additionalProperties": false, - "properties": { - "button": { - "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", - "enum": [ - "book", - "call", - "learn_more", - "none", - "order", - "shop", - "signup" - ], - "type": "string" - }, - "endDate": { - "description": "End date of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "isFullDayEvent": { - "description": "Indicate whether the event has a start or end time.", - "type": "boolean" - }, - "link": { - "description": "Link to the action", - "type": "string" - }, - "startDate": { - "description": "Start date of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "title": { - "description": "Title of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [ - "isFullDayEvent" - ], - "type": "object" - }, - "detailsOffer": { - "additionalProperties": false, - "properties": { - "code": { - "description": "Coupon code for the offer", - "type": "string" - }, - "endDate": { - "description": "End date of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "link": { - "description": "Link to the offer", - "type": "string" - }, - "startDate": { - "description": "Start date of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "terms": { - "description": "Terms and Conditions", - "type": "string" - }, - "title": { - "description": "Title of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "detailsWhatsNew": { - "additionalProperties": false, - "properties": { - "button": { - "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", - "enum": [ - "book", - "call", - "learn_more", - "none", - "order", - "shop", - "signup" - ], - "type": "string" - }, - "link": { - "description": "Link to the action", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "title": { - "description": "Title if available in the given GBP post type: event and offer", - "type": "string" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, offer, event for Google Business Profile", - "enum": [ - "event", - "offer", - "whats_new" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "instagram": { - "additionalProperties": false, - "properties": { - "firstComment": { - "description": "Instagram post's first comment", - "type": "string" - }, - "geolocation": { - "additionalProperties": false, - "properties": { - "id": { - "description": "The id of this location", - "type": "string" - }, - "text": { - "description": "The name of this location", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content", - "type": "boolean" - }, - "link": { - "description": "Shop Grid link for the post", - "type": "string" - }, - "shouldShareToFeed": { - "description": "Indicates whether post should be shared to feed", - "type": "boolean" - }, - "stickerFields": { - "additionalProperties": false, - "properties": { - "music": { - "description": "Placeholder text for the post's music", - "type": "string" - }, - "other": { - "description": "Additional field for any other post content", - "type": "string" - }, - "products": { - "description": "Placeholder text for the post's linked products", - "type": "string" - }, - "text": { - "description": "Text for the Story or Reel", - "type": "string" - }, - "topics": { - "description": "Placeholder text for the post's topics (Reels only)", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, story, reel for Instagram", - "enum": [ - "carousel", - "event", - "ghost_post", - "offer", - "post", - "reel", - "short", - "story", - "thread", - "whats_new" - ], - "type": "string" - } - }, - "required": [ - "shouldShareToFeed", - "type" - ], - "type": "object" - }, - "linkedin": { - "additionalProperties": false, - "properties": { - "annotations": { - "description": "Annotations representing entities in the text", - "items": { - "additionalProperties": false, - "properties": { - "entity": { - "description": "The entity of the annotation, e.g. urn:li:organization:1521226", - "type": "string" - }, - "id": { - "description": "The id of the annotation, e.g. 1521226", - "type": "string" - }, - "length": { - "description": "The length of the annotation, e.g. 6", - "type": "integer" - }, - "link": { - "description": "The link of the annotation, e.g. https://www.linkedin.com/company/bufferapp", - "type": "string" - }, - "localizedName": { - "description": "The localized name of the annotation, e.g. Buffer", - "type": "string" - }, - "start": { - "description": "The start of the annotation, e.g. 5", - "type": "integer" - }, - "vanityName": { - "description": "The vanity name of the annotation, e.g. bufferapp", - "type": "string" - } - }, - "required": [ - "id", - "entity", - "length", - "link", - "localizedName", - "start", - "vanityName" - ], - "type": "object" - }, - "type": "array" - }, - "firstComment": { - "description": "LinkedIn post's first comment", - "type": "string" - }, - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "mastodon": { - "additionalProperties": false, - "properties": { - "spoilerText": { - "description": "Spoiler text hiding the root text of this post", - "type": "string" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "pinterest": { - "additionalProperties": false, - "properties": { - "boardServiceId": { - "description": "The board ID of the Pin, can be obtained when fetching the channel details with the following query:\n```\nquery GetChannelWithSubprofiles {\n channel(input: { id: \"[CHANNEL_ID_HERE]\" }) {\n metadata {\n ... on PinterestMetadata {\n boards {\n serviceId\n }\n }\n }\n }\n}\n```\nRequired on create; optional on edit (omitted preserves existing board).", - "type": "string" - }, - "title": { - "description": "The title of the Pin", - "type": "string" - }, - "url": { - "description": "The Pin destination link", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "substack": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "locationId": { - "description": "LocationId associated with the post", - "type": "string" - }, - "locationName": { - "description": "Location name associated with the post", - "type": "string" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "topic": { - "description": "Topic associated with the post", - "type": "string" - }, - "type": { - "description": "The type of the post", - "enum": [ - "carousel", - "event", - "ghost_post", - "offer", - "post", - "reel", - "short", - "story", - "thread", - "whats_new" - ], - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "tiktok": { - "additionalProperties": false, - "properties": { - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content (TikTok video only)", - "type": "boolean" - }, - "title": { - "description": "The title of the TikTok post (for photo posts)", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "twitter": { - "additionalProperties": false, - "properties": { - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content (original tweets only, never retweets)", - "type": "boolean" - }, - "retweet": { - "additionalProperties": false, - "properties": { - "comment": { - "description": "Optional user comment shown above the embedded retweet", - "type": "string" - }, - "id": { - "description": "Retweet ID", - "type": "string" - } - }, - "required": [ - "id" - ], - "type": "object" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "youtube": { - "additionalProperties": false, - "properties": { - "categoryId": { - "description": "Youtube Category ID, one ID of this list:\nID: 1 -> Film & Animation\nID: 2 -> Autos & Vehicles\nID: 10 -> Music\nID: 15 -> Pets & Animals\nID: 17 -> Sports\nID: 19 -> Travel & Events\nID: 20 -> Gaming\nID: 22 -> People & Blogs\nID: 23 -> Comedy\nID: 24 -> Entertainment\nID: 25 -> News & Politics\nID: 26 -> Howto & Style\nID: 27 -> Education\nID: 28 -> Science & Technology\nID: 29 -> Nonprofits & Activism\n\nRequired on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "embeddable": { - "description": "Indicates whether the video allows embedding (default: true)", - "type": "boolean" - }, - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content", - "type": "boolean" - }, - "license": { - "description": "Video license (default: youtube)", - "enum": [ - "creativeCommon", - "youtube" - ], - "type": "string" - }, - "madeForKids": { - "description": "Indicates whether the video is suitable for kids (default: false)", - "type": "boolean" - }, - "notifySubscribers": { - "description": "Indicates whether to notify subscribers on publish video (default: true)", - "type": "boolean" - }, - "privacy": { - "description": "Privacy setting for post (default: public)", - "enum": [ - "private", - "public", - "unlisted" - ], - "type": "string" - }, - "title": { - "description": "Title of the Youtube post. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "mode": { - "description": "How the post is being scheduled.", - "enum": [ - "addToQueue", - "customScheduled", - "shareNext", - "shareNow" - ], - "type": "string" - }, - "needsApproval": { - "description": "Submit the post for approval instead of scheduling it. A post submitted for\napproval is always a draft, so this conflicts with turning `saveToDraft` off.\n\nOnly valid when your posting policy on the target channel requires approval.", - "type": "boolean" - }, - "saveToDraft": { - "description": "If true, saves the post as a draft instead of scheduling it.\nWhen saving as draft:\n- Post status will be 'draft' instead of 'buffer'\n- Posting limits are not checked\n- The post will not be published until explicitly scheduled", - "type": "boolean" - }, - "schedulingType": { - "description": "Scheduling type to indicate notification publishing or automatic publishing", - "enum": [ - "automatic", - "notification" - ], - "type": "string" - }, - "source": { - "description": "source where the composer was initiated from, used for tracking.", - "type": "string" - }, - "tagIds": { - "description": "List of tag IDs", - "items": { - "description": "List of tag IDs", - "type": "string" - }, - "type": "array" - }, - "text": { - "description": "Text content of the Post.\n\nNote: for threaded posts, this needs to match the first item in the `thread` array.", - "type": "string" - } - }, - "required": [ - "channelId", - "mode", - "schedulingType" - ], - "type": "object" -} - removed
Input schema / properties / posts / typeRemoved value: -"array" - added
Input schema / properties / tagIds / $refAdded value: +"#/$defs/tagIds" - removed
Input schema / properties / tagIds / descriptionRemoved value: -"Tags to apply to this content item. Omit to create it with no tags." - removed
Input schema / properties / tagIds / itemsRemoved value: -{ - "description": "Tags to apply to this content item. Omit to create it with no tags.", - "type": "string" -} - removed
Input schema / properties / tagIds / typeRemoved value: -"array"
- Changed
create_content_item_draft26 fields changed- added
Input schema / $defsAdded value: +{ + "correlationId": { + "description": "Client-generated UUID that makes draft creation idempotent. A retry with the\nsame UUID in the same organization returns the first content item in its\ncurrent state.", + "type": "string" + }, + "draft": { + "additionalProperties": false, + "properties": { + "aiAssisted": { + "description": "Set to true when the draft content was written with the help of AI.", + "type": "boolean" + }, + "assets": { + "description": "Images, videos, or documents to attach to the draft, in display order.", + "items": { + "additionalProperties": false, + "properties": { + "document": { + "additionalProperties": false, + "properties": { + "thumbnailUrl": { + "description": "Document thumbnail URL", + "type": "string" + }, + "title": { + "description": "Document title", + "type": "string" + }, + "url": { + "description": "Document URL", + "type": "string" + } + }, + "required": [ + "thumbnailUrl", + "title", + "url" + ], + "type": "object" + }, + "image": { + "additionalProperties": false, + "properties": { + "metadata": { + "additionalProperties": false, + "properties": { + "altText": { + "description": "Alternative text for accessibility", + "type": "string" + }, + "animatedThumbnail": { + "description": "Animated thumbnail URL", + "type": "string" + }, + "dimensions": { + "additionalProperties": false, + "properties": { + "height": { + "description": "Image height in pixels", + "type": "integer" + }, + "width": { + "description": "Image width in pixels", + "type": "integer" + } + }, + "required": [ + "height", + "width" + ], + "type": "object" + }, + "userTags": { + "description": "Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput.", + "items": { + "additionalProperties": false, + "properties": { + "handle": { + "description": "The handle (username) of the account to tag, without the leading @.", + "type": "string" + }, + "x": { + "description": "Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width.", + "type": "number" + }, + "y": { + "description": "Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height.", + "type": "number" + } + }, + "required": [ + "handle", + "x", + "y" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "altText" + ], + "type": "object" + }, + "thumbnailUrl": { + "description": "URL to the static thumbnail of the asset", + "type": "string" + }, + "url": { + "description": "URL to the file source", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "link": { + "additionalProperties": false, + "properties": { + "description": { + "description": "Description of the link", + "type": "string" + }, + "thumbnailUrl": { + "description": "Thumbnail URL of the link", + "type": "string" + }, + "title": { + "description": "Title of the link", + "type": "string" + }, + "url": { + "description": "URL to the link", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "video": { + "additionalProperties": false, + "properties": { + "metadata": { + "additionalProperties": false, + "properties": { + "thumbnailOffset": { + "description": "Offset of the thumbnail chosen for the video, in ms", + "type": "integer" + }, + "title": { + "description": "Video title", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "thumbnailUrl": { + "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", + "type": "string" + }, + "url": { + "description": "URL to the file source", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + } + }, + "required": [], + "type": "object" + }, + "type": "array" + }, + "text": { + "description": "The written content of the draft. Can be empty when the draft holds at\nleast one asset.", + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + }, + "tagIds": { + "description": "Tags to apply to this content item. Omit to create it with no tags.", + "items": { + "description": "Tags to apply to this content item. Omit to create it with no tags.", + "type": "string" + }, + "type": "array" + } +} - changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true for this exact user-requested Buffer mutation."New value: +"Set true only when the user asked for exactly this action." - added
Input schema / properties / correlationId / $refAdded value: +"#/$defs/correlationId" - removed
Input schema / properties / correlationId / descriptionRemoved value: -"Client-generated UUID that makes draft creation idempotent. A retry with the\nsame UUID in the same organization returns the first content item in its\ncurrent state." - removed
Input schema / properties / correlationId / typeRemoved value: -"string" - added
Input schema / properties / draft / $refAdded value: +"#/$defs/draft" - removed
Input schema / properties / draft / additionalPropertiesRemoved value: -false - removed
Input schema / properties / draft / propertiesRemoved value: -{ - "aiAssisted": { - "description": "Set to true when the draft content was written with the help of AI.", - "type": "boolean" - }, - "assets": { - "description": "Images, videos, or documents to attach to the draft, in display order.", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "altText": { - "description": "Alternative text for accessibility", - "type": "string" - }, - "animatedThumbnail": { - "description": "Animated thumbnail URL", - "type": "string" - }, - "dimensions": { - "additionalProperties": false, - "properties": { - "height": { - "description": "Image height in pixels", - "type": "integer" - }, - "width": { - "description": "Image width in pixels", - "type": "integer" - } - }, - "required": [ - "height", - "width" - ], - "type": "object" - }, - "userTags": { - "description": "Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput.", - "items": { - "additionalProperties": false, - "properties": { - "handle": { - "description": "The handle (username) of the account to tag, without the leading @.", - "type": "string" - }, - "x": { - "description": "Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width.", - "type": "number" - }, - "y": { - "description": "Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height.", - "type": "number" - } - }, - "required": [ - "handle", - "x", - "y" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "altText" - ], - "type": "object" - }, - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "thumbnailOffset": { - "description": "Offset of the thumbnail chosen for the video, in ms", - "type": "integer" - }, - "title": { - "description": "Video title", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "text": { - "description": "The written content of the draft. Can be empty when the draft holds at\nleast one asset.", - "type": "string" - } -} - removed
Input schema / properties / draft / requiredRemoved value: -[ - "text" -] - removed
Input schema / properties / draft / typeRemoved value: -"object" - added
Input schema / properties / payload / properties / correlationId / $refAdded value: +"#/$defs/correlationId" - removed
Input schema / properties / payload / properties / correlationId / descriptionRemoved value: -"Client-generated UUID that makes draft creation idempotent. A retry with the\nsame UUID in the same organization returns the first content item in its\ncurrent state." - removed
Input schema / properties / payload / properties / correlationId / typeRemoved value: -"string" - added
Input schema / properties / payload / properties / draft / $refAdded value: +"#/$defs/draft" - removed
Input schema / properties / payload / properties / draft / additionalPropertiesRemoved value: -false - removed
Input schema / properties / payload / properties / draft / propertiesRemoved value: -{ - "aiAssisted": { - "description": "Set to true when the draft content was written with the help of AI.", - "type": "boolean" - }, - "assets": { - "description": "Images, videos, or documents to attach to the draft, in display order.", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "altText": { - "description": "Alternative text for accessibility", - "type": "string" - }, - "animatedThumbnail": { - "description": "Animated thumbnail URL", - "type": "string" - }, - "dimensions": { - "additionalProperties": false, - "properties": { - "height": { - "description": "Image height in pixels", - "type": "integer" - }, - "width": { - "description": "Image width in pixels", - "type": "integer" - } - }, - "required": [ - "height", - "width" - ], - "type": "object" - }, - "userTags": { - "description": "Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput.", - "items": { - "additionalProperties": false, - "properties": { - "handle": { - "description": "The handle (username) of the account to tag, without the leading @.", - "type": "string" - }, - "x": { - "description": "Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width.", - "type": "number" - }, - "y": { - "description": "Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height.", - "type": "number" - } - }, - "required": [ - "handle", - "x", - "y" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "altText" - ], - "type": "object" - }, - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "thumbnailOffset": { - "description": "Offset of the thumbnail chosen for the video, in ms", - "type": "integer" - }, - "title": { - "description": "Video title", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "text": { - "description": "The written content of the draft. Can be empty when the draft holds at\nleast one asset.", - "type": "string" - } -} - removed
Input schema / properties / payload / properties / draft / requiredRemoved value: -[ - "text" -] - removed
Input schema / properties / payload / properties / draft / typeRemoved value: -"object" - added
Input schema / properties / payload / properties / tagIds / $refAdded value: +"#/$defs/tagIds" - removed
Input schema / properties / payload / properties / tagIds / descriptionRemoved value: -"Tags to apply to this content item. Omit to create it with no tags." - removed
Input schema / properties / payload / properties / tagIds / itemsRemoved value: -{ - "description": "Tags to apply to this content item. Omit to create it with no tags.", - "type": "string" -} - removed
Input schema / properties / payload / properties / tagIds / typeRemoved value: -"array" - added
Input schema / properties / tagIds / $refAdded value: +"#/$defs/tagIds" - removed
Input schema / properties / tagIds / descriptionRemoved value: -"Tags to apply to this content item. Omit to create it with no tags." - removed
Input schema / properties / tagIds / itemsRemoved value: -{ - "description": "Tags to apply to this content item. Omit to create it with no tags.", - "type": "string" -} - removed
Input schema / properties / tagIds / typeRemoved value: -"array"
- Changed
create_idea22 fields changed- added
Input schema / $defsAdded value: +{ + "content": { + "additionalProperties": false, + "properties": { + "aiAssisted": { + "description": "Whether AI tools were used in creation", + "type": "boolean" + }, + "date": { + "description": "Target date for the idea, often used for planning publish schedules", + "type": "string" + }, + "media": { + "description": "List of media items to attach", + "items": { + "additionalProperties": false, + "properties": { + "alt": { + "description": "Alternative text for the media", + "type": "string" + }, + "size": { + "description": "The size of the media in bytes", + "type": "integer" + }, + "source": { + "additionalProperties": false, + "properties": { + "author": { + "description": "for unsplash only", + "type": "string" + }, + "authorUrl": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "trigger": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "thumbnailUrl": { + "description": "Thumbnail URL for the media", + "type": "string" + }, + "type": { + "description": "The type of media (image, gif, video, link, document, unsupported). Note: 'video' is not supported via public API", + "enum": [ + "image", + "gif", + "video", + "link", + "document", + "unsupported" + ], + "type": "string" + }, + "url": { + "description": "The URL of the media", + "type": "string" + } + }, + "required": [ + "url", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "services": { + "description": "Services associated with the idea for targeting specific platforms", + "items": { + "description": "Services associated with the idea for targeting specific platforms", + "enum": [ + "bluesky", + "facebook", + "googlebusiness", + "instagram", + "linkedin", + "mastodon", + "pinterest", + "startPage", + "substack", + "threads", + "tiktok", + "twitter", + "whatsapp", + "youtube" + ], + "type": "string" + }, + "type": "array" + }, + "tags": { + "description": "Tags to categorize the idea", + "items": { + "additionalProperties": false, + "properties": { + "color": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "color" + ], + "type": "object" + }, + "type": "array" + }, + "text": { + "description": "Main body text or description", + "type": "string" + }, + "title": { + "description": "Title or headline of the idea", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "group": { + "additionalProperties": false, + "properties": { + "groupId": { + "description": "Target group ID (null for unassigned group)", + "type": "string" + }, + "placeAfterId": { + "description": "ID of idea to place after (null for top position)", + "type": "string" + } + }, + "required": [], + "type": "object" + } +} - changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true for this exact user-requested Buffer mutation."New value: +"Set true only when the user asked for exactly this action." - added
Input schema / properties / content / $refAdded value: +"#/$defs/content" - removed
Input schema / properties / content / additionalPropertiesRemoved value: -false - removed
Input schema / properties / content / propertiesRemoved value: -{ - "aiAssisted": { - "description": "Whether AI tools were used in creation", - "type": "boolean" - }, - "date": { - "description": "Target date for the idea, often used for planning publish schedules", - "type": "string" - }, - "media": { - "description": "List of media items to attach", - "items": { - "additionalProperties": false, - "properties": { - "alt": { - "description": "Alternative text for the media", - "type": "string" - }, - "size": { - "description": "The size of the media in bytes", - "type": "integer" - }, - "source": { - "additionalProperties": false, - "properties": { - "author": { - "description": "for unsplash only", - "type": "string" - }, - "authorUrl": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "trigger": { - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "thumbnailUrl": { - "description": "Thumbnail URL for the media", - "type": "string" - }, - "type": { - "description": "The type of media (image, gif, video, link, document, unsupported). Note: 'video' is not supported via public API", - "enum": [ - "image", - "gif", - "video", - "link", - "document", - "unsupported" - ], - "type": "string" - }, - "url": { - "description": "The URL of the media", - "type": "string" - } - }, - "required": [ - "url", - "type" - ], - "type": "object" - }, - "type": "array" - }, - "services": { - "description": "Services associated with the idea for targeting specific platforms", - "items": { - "description": "Services associated with the idea for targeting specific platforms", - "enum": [ - "bluesky", - "facebook", - "googlebusiness", - "instagram", - "linkedin", - "mastodon", - "pinterest", - "startPage", - "substack", - "threads", - "tiktok", - "twitter", - "whatsapp", - "youtube" - ], - "type": "string" - }, - "type": "array" - }, - "tags": { - "description": "Tags to categorize the idea", - "items": { - "additionalProperties": false, - "properties": { - "color": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": [ - "id", - "name", - "color" - ], - "type": "object" - }, - "type": "array" - }, - "text": { - "description": "Main body text or description", - "type": "string" - }, - "title": { - "description": "Title or headline of the idea", - "type": "string" - } -} - removed
Input schema / properties / content / requiredRemoved value: -[] - removed
Input schema / properties / content / typeRemoved value: -"object" - added
Input schema / properties / group / $refAdded value: +"#/$defs/group" - removed
Input schema / properties / group / additionalPropertiesRemoved value: -false - removed
Input schema / properties / group / propertiesRemoved value: -{ - "groupId": { - "description": "Target group ID (null for unassigned group)", - "type": "string" - }, - "placeAfterId": { - "description": "ID of idea to place after (null for top position)", - "type": "string" - } -} - removed
Input schema / properties / group / requiredRemoved value: -[] - removed
Input schema / properties / group / typeRemoved value: -"object" - added
Input schema / properties / payload / properties / content / $refAdded value: +"#/$defs/content" - removed
Input schema / properties / payload / properties / content / additionalPropertiesRemoved value: -false - removed
Input schema / properties / payload / properties / content / propertiesRemoved value: -{ - "aiAssisted": { - "description": "Whether AI tools were used in creation", - "type": "boolean" - }, - "date": { - "description": "Target date for the idea, often used for planning publish schedules", - "type": "string" - }, - "media": { - "description": "List of media items to attach", - "items": { - "additionalProperties": false, - "properties": { - "alt": { - "description": "Alternative text for the media", - "type": "string" - }, - "size": { - "description": "The size of the media in bytes", - "type": "integer" - }, - "source": { - "additionalProperties": false, - "properties": { - "author": { - "description": "for unsplash only", - "type": "string" - }, - "authorUrl": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "trigger": { - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "thumbnailUrl": { - "description": "Thumbnail URL for the media", - "type": "string" - }, - "type": { - "description": "The type of media (image, gif, video, link, document, unsupported). Note: 'video' is not supported via public API", - "enum": [ - "image", - "gif", - "video", - "link", - "document", - "unsupported" - ], - "type": "string" - }, - "url": { - "description": "The URL of the media", - "type": "string" - } - }, - "required": [ - "url", - "type" - ], - "type": "object" - }, - "type": "array" - }, - "services": { - "description": "Services associated with the idea for targeting specific platforms", - "items": { - "description": "Services associated with the idea for targeting specific platforms", - "enum": [ - "bluesky", - "facebook", - "googlebusiness", - "instagram", - "linkedin", - "mastodon", - "pinterest", - "startPage", - "substack", - "threads", - "tiktok", - "twitter", - "whatsapp", - "youtube" - ], - "type": "string" - }, - "type": "array" - }, - "tags": { - "description": "Tags to categorize the idea", - "items": { - "additionalProperties": false, - "properties": { - "color": { - "type": "string" - }, - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - }, - "required": [ - "id", - "name", - "color" - ], - "type": "object" - }, - "type": "array" - }, - "text": { - "description": "Main body text or description", - "type": "string" - }, - "title": { - "description": "Title or headline of the idea", - "type": "string" - } -} - removed
Input schema / properties / payload / properties / content / requiredRemoved value: -[] - removed
Input schema / properties / payload / properties / content / typeRemoved value: -"object" - added
Input schema / properties / payload / properties / group / $refAdded value: +"#/$defs/group" - removed
Input schema / properties / payload / properties / group / additionalPropertiesRemoved value: -false - removed
Input schema / properties / payload / properties / group / propertiesRemoved value: -{ - "groupId": { - "description": "Target group ID (null for unassigned group)", - "type": "string" - }, - "placeAfterId": { - "description": "ID of idea to place after (null for top position)", - "type": "string" - } -} - removed
Input schema / properties / payload / properties / group / requiredRemoved value: -[] - removed
Input schema / properties / payload / properties / group / typeRemoved value: -"object"
- Changed
create_post32 fields changed- added
Input schema / $defsAdded value: +{ + "assets": { + "description": "Ordered list of assets on this post.", + "items": { + "additionalProperties": false, + "properties": { + "document": { + "$ref": "#/$defs/document" + }, + "image": { + "additionalProperties": false, + "properties": { + "metadata": { + "additionalProperties": false, + "properties": { + "altText": { + "description": "Alternative text for accessibility", + "type": "string" + }, + "animatedThumbnail": { + "description": "Animated thumbnail URL", + "type": "string" + }, + "dimensions": { + "additionalProperties": false, + "properties": { + "height": { + "description": "Image height in pixels", + "type": "integer" + }, + "width": { + "description": "Image width in pixels", + "type": "integer" + } + }, + "required": [ + "height", + "width" + ], + "type": "object" + }, + "userTags": { + "description": "Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput.", + "items": { + "additionalProperties": false, + "properties": { + "handle": { + "description": "The handle (username) of the account to tag, without the leading @.", + "type": "string" + }, + "x": { + "description": "Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width.", + "type": "number" + }, + "y": { + "description": "Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height.", + "type": "number" + } + }, + "required": [ + "handle", + "x", + "y" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "altText" + ], + "type": "object" + }, + "thumbnailUrl": { + "description": "URL to the static thumbnail of the asset", + "type": "string" + }, + "url": { + "description": "URL to the file source", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "link": { + "$ref": "#/$defs/link" + }, + "video": { + "additionalProperties": false, + "properties": { + "metadata": { + "additionalProperties": false, + "properties": { + "thumbnailOffset": { + "description": "Offset of the thumbnail chosen for the video, in ms", + "type": "integer" + }, + "title": { + "description": "Video title", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "thumbnailUrl": { + "$ref": "#/$defs/thumbnailUrl" + }, + "url": { + "description": "URL to the file source", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + } + }, + "required": [], + "type": "object" + }, + "type": "array" + }, + "button": { + "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", + "enum": [ + "book", + "call", + "learn_more", + "none", + "order", + "shop", + "signup" + ], + "type": "string" + }, + "document": { + "additionalProperties": false, + "properties": { + "thumbnailUrl": { + "description": "Document thumbnail URL", + "type": "string" + }, + "title": { + "description": "Document title", + "type": "string" + }, + "url": { + "description": "Document URL", + "type": "string" + } + }, + "required": [ + "thumbnailUrl", + "title", + "url" + ], + "type": "object" + }, + "link": { + "additionalProperties": false, + "properties": { + "description": { + "description": "Description of the link", + "type": "string" + }, + "thumbnailUrl": { + "description": "Thumbnail URL of the link", + "type": "string" + }, + "title": { + "description": "Title of the link", + "type": "string" + }, + "url": { + "description": "URL to the link", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "linkAttachment": { + "additionalProperties": false, + "properties": { + "description": { + "description": "Description shown on the link card", + "type": "string" + }, + "thumbnail": { + "additionalProperties": false, + "properties": { + "url": { + "description": "URL of the thumbnail image", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "title": { + "description": "Title shown on the link card", + "type": "string" + }, + "url": { + "description": "URL that the link asset has been built from", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "metadata": { + "additionalProperties": false, + "properties": { + "bluesky": { + "additionalProperties": false, + "properties": { + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + }, + "thread": { + "$ref": "#/$defs/thread" + } + }, + "required": [], + "type": "object" + }, + "facebook": { + "additionalProperties": false, + "properties": { + "annotations": { + "description": "Annotations representing entities in the text", + "items": { + "additionalProperties": false, + "properties": { + "content": { + "description": "The content of the annotation, e.g. '107509875938399'", + "type": "string" + }, + "indices": { + "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", + "items": { + "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", + "type": "integer" + }, + "type": "array" + }, + "text": { + "description": "The text representation of the annotation, eg 'Buffer'", + "type": "string" + }, + "url": { + "description": "The URL the annotation points to, e.g. https://www.facebook.com/107509875938399", + "type": "string" + } + }, + "required": [ + "content", + "indices", + "text", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "firstComment": { + "description": "Facebook post's first comment", + "type": "string" + }, + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + }, + "type": { + "description": "The channel-specific type of the post, eg, post, story, reel for Facebook", + "enum": [ + "post", + "reel", + "story" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "google": { + "additionalProperties": false, + "properties": { + "detailsEvent": { + "additionalProperties": false, + "properties": { + "button": { + "$ref": "#/$defs/button" + }, + "endDate": { + "description": "End date of the event. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "isFullDayEvent": { + "description": "Indicate whether the event has a start or end time.", + "type": "boolean" + }, + "link": { + "description": "Link to the action", + "type": "string" + }, + "startDate": { + "description": "Start date of the event. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "title": { + "description": "Title of the event. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + } + }, + "required": [ + "isFullDayEvent" + ], + "type": "object" + }, + "detailsOffer": { + "additionalProperties": false, + "properties": { + "code": { + "description": "Coupon code for the offer", + "type": "string" + }, + "endDate": { + "description": "End date of the offer. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "link": { + "description": "Link to the offer", + "type": "string" + }, + "startDate": { + "description": "Start date of the offer. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "terms": { + "description": "Terms and Conditions", + "type": "string" + }, + "title": { + "description": "Title of the offer. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "detailsWhatsNew": { + "additionalProperties": false, + "properties": { + "button": { + "$ref": "#/$defs/button" + }, + "link": { + "description": "Link to the action", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "title": { + "description": "Title if available in the given GBP post type: event and offer", + "type": "string" + }, + "type": { + "description": "The channel-specific type of the post, eg, post, offer, event for Google Business Profile", + "enum": [ + "event", + "offer", + "whats_new" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "instagram": { + "additionalProperties": false, + "properties": { + "firstComment": { + "description": "Instagram post's first comment", + "type": "string" + }, + "geolocation": { + "additionalProperties": false, + "properties": { + "id": { + "description": "The id of this location", + "type": "string" + }, + "text": { + "description": "The name of this location", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "isAiGenerated": { + "description": "Whether the post discloses AI-generated content", + "type": "boolean" + }, + "link": { + "description": "Shop Grid link for the post", + "type": "string" + }, + "shouldShareToFeed": { + "description": "Indicates whether post should be shared to feed", + "type": "boolean" + }, + "stickerFields": { + "additionalProperties": false, + "properties": { + "music": { + "description": "Placeholder text for the post's music", + "type": "string" + }, + "other": { + "description": "Additional field for any other post content", + "type": "string" + }, + "products": { + "description": "Placeholder text for the post's linked products", + "type": "string" + }, + "text": { + "description": "Text for the Story or Reel", + "type": "string" + }, + "topics": { + "description": "Placeholder text for the post's topics (Reels only)", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "type": { + "description": "The channel-specific type of the post, eg, post, story, reel for Instagram", + "enum": [ + "carousel", + "event", + "ghost_post", + "offer", + "post", + "reel", + "short", + "story", + "thread", + "whats_new" + ], + "type": "string" + } + }, + "required": [ + "shouldShareToFeed", + "type" + ], + "type": "object" + }, + "linkedin": { + "additionalProperties": false, + "properties": { + "annotations": { + "description": "Annotations representing entities in the text", + "items": { + "additionalProperties": false, + "properties": { + "entity": { + "description": "The entity of the annotation, e.g. urn:li:organization:1521226", + "type": "string" + }, + "id": { + "description": "The id of the annotation, e.g. 1521226", + "type": "string" + }, + "length": { + "description": "The length of the annotation, e.g. 6", + "type": "integer" + }, + "link": { + "description": "The link of the annotation, e.g. https://www.linkedin.com/company/bufferapp", + "type": "string" + }, + "localizedName": { + "description": "The localized name of the annotation, e.g. Buffer", + "type": "string" + }, + "start": { + "description": "The start of the annotation, e.g. 5", + "type": "integer" + }, + "vanityName": { + "description": "The vanity name of the annotation, e.g. bufferapp", + "type": "string" + } + }, + "required": [ + "id", + "entity", + "length", + "link", + "localizedName", + "start", + "vanityName" + ], + "type": "object" + }, + "type": "array" + }, + "firstComment": { + "description": "LinkedIn post's first comment", + "type": "string" + }, + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + } + }, + "required": [], + "type": "object" + }, + "mastodon": { + "additionalProperties": false, + "properties": { + "spoilerText": { + "description": "Spoiler text hiding the root text of this post", + "type": "string" + }, + "thread": { + "$ref": "#/$defs/thread" + } + }, + "required": [], + "type": "object" + }, + "pinterest": { + "additionalProperties": false, + "properties": { + "boardServiceId": { + "description": "The board ID of the Pin, can be obtained when fetching the channel details with the following query:\n```\nquery GetChannelWithSubprofiles {\n channel(input: { id: \"[CHANNEL_ID_HERE]\" }) {\n metadata {\n ... on PinterestMetadata {\n boards {\n serviceId\n }\n }\n }\n }\n}\n```\nRequired on create; optional on edit (omitted preserves existing board).", + "type": "string" + }, + "title": { + "description": "The title of the Pin", + "type": "string" + }, + "url": { + "description": "The Pin destination link", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "substack": { + "additionalProperties": false, + "properties": { + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + } + }, + "required": [], + "type": "object" + }, + "threads": { + "additionalProperties": false, + "properties": { + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + }, + "locationId": { + "description": "LocationId associated with the post", + "type": "string" + }, + "locationName": { + "description": "Location name associated with the post", + "type": "string" + }, + "thread": { + "$ref": "#/$defs/thread" + }, + "topic": { + "description": "Topic associated with the post", + "type": "string" + }, + "type": { + "description": "The type of the post", + "enum": [ + "carousel", + "event", + "ghost_post", + "offer", + "post", + "reel", + "short", + "story", + "thread", + "whats_new" + ], + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "tiktok": { + "additionalProperties": false, + "properties": { + "isAiGenerated": { + "description": "Whether the post discloses AI-generated content (TikTok video only)", + "type": "boolean" + }, + "title": { + "description": "The title of the TikTok post (for photo posts)", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "twitter": { + "additionalProperties": false, + "properties": { + "isAiGenerated": { + "description": "Whether the post discloses AI-generated content (original tweets only, never retweets)", + "type": "boolean" + }, + "retweet": { + "additionalProperties": false, + "properties": { + "comment": { + "description": "Optional user comment shown above the embedded retweet", + "type": "string" + }, + "id": { + "description": "Retweet ID", + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "thread": { + "$ref": "#/$defs/thread" + } + }, + "required": [], + "type": "object" + }, + "youtube": { + "additionalProperties": false, + "properties": { + "categoryId": { + "description": "Youtube Category ID, one ID of this list:\nID: 1 -> Film & Animation\nID: 2 -> Autos & Vehicles\nID: 10 -> Music\nID: 15 -> Pets & Animals\nID: 17 -> Sports\nID: 19 -> Travel & Events\nID: 20 -> Gaming\nID: 22 -> People & Blogs\nID: 23 -> Comedy\nID: 24 -> Entertainment\nID: 25 -> News & Politics\nID: 26 -> Howto & Style\nID: 27 -> Education\nID: 28 -> Science & Technology\nID: 29 -> Nonprofits & Activism\n\nRequired on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "embeddable": { + "description": "Indicates whether the video allows embedding (default: true)", + "type": "boolean" + }, + "isAiGenerated": { + "description": "Whether the post discloses AI-generated content", + "type": "boolean" + }, + "license": { + "description": "Video license (default: youtube)", + "enum": [ + "creativeCommon", + "youtube" + ], + "type": "string" + }, + "madeForKids": { + "description": "Indicates whether the video is suitable for kids (default: false)", + "type": "boolean" + }, + "notifySubscribers": { + "description": "Indicates whether to notify subscribers on publish video (default: true)", + "type": "boolean" + }, + "privacy": { + "description": "Privacy setting for post (default: public)", + "enum": [ + "private", + "public", + "unlisted" + ], + "type": "string" + }, + "title": { + "description": "Title of the Youtube post. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + } + }, + "required": [], + "type": "object" + } + }, + "required": [], + "type": "object" + }, + "needsApproval": { + "description": "Submit the post for approval instead of scheduling it. A post submitted for\napproval is always a draft, so this conflicts with turning `saveToDraft` off.\n\nOnly valid when your posting policy on the target channel requires approval.", + "type": "boolean" + }, + "saveToDraft": { + "description": "If true, saves the post as a draft instead of scheduling it.\nWhen saving as draft:\n- Post status will be 'draft' instead of 'buffer'\n- Posting limits are not checked\n- The post will not be published until explicitly scheduled", + "type": "boolean" + }, + "thread": { + "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", + "items": { + "additionalProperties": false, + "properties": { + "assets": { + "description": "Ordered list of assets on this threaded post", + "items": { + "additionalProperties": false, + "properties": { + "document": { + "$ref": "#/$defs/document" + }, + "image": { + "additionalProperties": false, + "properties": { + "thumbnailUrl": { + "description": "URL to the static thumbnail of the asset", + "type": "string" + }, + "url": { + "description": "URL to the file source", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "link": { + "$ref": "#/$defs/link" + }, + "video": { + "additionalProperties": false, + "properties": { + "thumbnailUrl": { + "$ref": "#/$defs/thumbnailUrl" + }, + "url": { + "description": "URL to the file source", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + } + }, + "required": [], + "type": "object" + }, + "type": "array" + }, + "metadata": { + "additionalProperties": false, + "properties": { + "bluesky": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "threads": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + } + }, + "required": [], + "type": "object" + }, + "text": { + "description": "The text body content of the threaded post", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "type": "array" + }, + "thumbnailUrl": { + "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", + "type": "string" + } +} - added
Input schema / properties / assets / $refAdded value: +"#/$defs/assets" - removed
Input schema / properties / assets / descriptionRemoved value: -"Ordered list of assets on this post." - removed
Input schema / properties / assets / itemsRemoved value: -{ - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "altText": { - "description": "Alternative text for accessibility", - "type": "string" - }, - "animatedThumbnail": { - "description": "Animated thumbnail URL", - "type": "string" - }, - "dimensions": { - "additionalProperties": false, - "properties": { - "height": { - "description": "Image height in pixels", - "type": "integer" - }, - "width": { - "description": "Image width in pixels", - "type": "integer" - } - }, - "required": [ - "height", - "width" - ], - "type": "object" - }, - "userTags": { - "description": "Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput.", - "items": { - "additionalProperties": false, - "properties": { - "handle": { - "description": "The handle (username) of the account to tag, without the leading @.", - "type": "string" - }, - "x": { - "description": "Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width.", - "type": "number" - }, - "y": { - "description": "Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height.", - "type": "number" - } - }, - "required": [ - "handle", - "x", - "y" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "altText" - ], - "type": "object" - }, - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "thumbnailOffset": { - "description": "Offset of the thumbnail chosen for the video, in ms", - "type": "integer" - }, - "title": { - "description": "Video title", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" -} - removed
Input schema / properties / assets / typeRemoved value: -"array" - changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true for this exact user-requested Buffer mutation."New value: +"Set true only when the user asked for exactly this action." - added
Input schema / properties / metadata / $refAdded value: +"#/$defs/metadata" - removed
Input schema / properties / metadata / additionalPropertiesRemoved value: -false - removed
Input schema / properties / metadata / propertiesRemoved value: -{ - "bluesky": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "facebook": { - "additionalProperties": false, - "properties": { - "annotations": { - "description": "Annotations representing entities in the text", - "items": { - "additionalProperties": false, - "properties": { - "content": { - "description": "The content of the annotation, e.g. '107509875938399'", - "type": "string" - }, - "indices": { - "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", - "items": { - "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", - "type": "integer" - }, - "type": "array" - }, - "text": { - "description": "The text representation of the annotation, eg 'Buffer'", - "type": "string" - }, - "url": { - "description": "The URL the annotation points to, e.g. https://www.facebook.com/107509875938399", - "type": "string" - } - }, - "required": [ - "content", - "indices", - "text", - "url" - ], - "type": "object" - }, - "type": "array" - }, - "firstComment": { - "description": "Facebook post's first comment", - "type": "string" - }, - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, story, reel for Facebook", - "enum": [ - "post", - "reel", - "story" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "google": { - "additionalProperties": false, - "properties": { - "detailsEvent": { - "additionalProperties": false, - "properties": { - "button": { - "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", - "enum": [ - "book", - "call", - "learn_more", - "none", - "order", - "shop", - "signup" - ], - "type": "string" - }, - "endDate": { - "description": "End date of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "isFullDayEvent": { - "description": "Indicate whether the event has a start or end time.", - "type": "boolean" - }, - "link": { - "description": "Link to the action", - "type": "string" - }, - "startDate": { - "description": "Start date of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "title": { - "description": "Title of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [ - "isFullDayEvent" - ], - "type": "object" - }, - "detailsOffer": { - "additionalProperties": false, - "properties": { - "code": { - "description": "Coupon code for the offer", - "type": "string" - }, - "endDate": { - "description": "End date of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "link": { - "description": "Link to the offer", - "type": "string" - }, - "startDate": { - "description": "Start date of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "terms": { - "description": "Terms and Conditions", - "type": "string" - }, - "title": { - "description": "Title of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "detailsWhatsNew": { - "additionalProperties": false, - "properties": { - "button": { - "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", - "enum": [ - "book", - "call", - "learn_more", - "none", - "order", - "shop", - "signup" - ], - "type": "string" - }, - "link": { - "description": "Link to the action", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "title": { - "description": "Title if available in the given GBP post type: event and offer", - "type": "string" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, offer, event for Google Business Profile", - "enum": [ - "event", - "offer", - "whats_new" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "instagram": { - "additionalProperties": false, - "properties": { - "firstComment": { - "description": "Instagram post's first comment", - "type": "string" - }, - "geolocation": { - "additionalProperties": false, - "properties": { - "id": { - "description": "The id of this location", - "type": "string" - }, - "text": { - "description": "The name of this location", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content", - "type": "boolean" - }, - "link": { - "description": "Shop Grid link for the post", - "type": "string" - }, - "shouldShareToFeed": { - "description": "Indicates whether post should be shared to feed", - "type": "boolean" - }, - "stickerFields": { - "additionalProperties": false, - "properties": { - "music": { - "description": "Placeholder text for the post's music", - "type": "string" - }, - "other": { - "description": "Additional field for any other post content", - "type": "string" - }, - "products": { - "description": "Placeholder text for the post's linked products", - "type": "string" - }, - "text": { - "description": "Text for the Story or Reel", - "type": "string" - }, - "topics": { - "description": "Placeholder text for the post's topics (Reels only)", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, story, reel for Instagram", - "enum": [ - "carousel", - "event", - "ghost_post", - "offer", - "post", - "reel", - "short", - "story", - "thread", - "whats_new" - ], - "type": "string" - } - }, - "required": [ - "shouldShareToFeed", - "type" - ], - "type": "object" - }, - "linkedin": { - "additionalProperties": false, - "properties": { - "annotations": { - "description": "Annotations representing entities in the text", - "items": { - "additionalProperties": false, - "properties": { - "entity": { - "description": "The entity of the annotation, e.g. urn:li:organization:1521226", - "type": "string" - }, - "id": { - "description": "The id of the annotation, e.g. 1521226", - "type": "string" - }, - "length": { - "description": "The length of the annotation, e.g. 6", - "type": "integer" - }, - "link": { - "description": "The link of the annotation, e.g. https://www.linkedin.com/company/bufferapp", - "type": "string" - }, - "localizedName": { - "description": "The localized name of the annotation, e.g. Buffer", - "type": "string" - }, - "start": { - "description": "The start of the annotation, e.g. 5", - "type": "integer" - }, - "vanityName": { - "description": "The vanity name of the annotation, e.g. bufferapp", - "type": "string" - } - }, - "required": [ - "id", - "entity", - "length", - "link", - "localizedName", - "start", - "vanityName" - ], - "type": "object" - }, - "type": "array" - }, - "firstComment": { - "description": "LinkedIn post's first comment", - "type": "string" - }, - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "mastodon": { - "additionalProperties": false, - "properties": { - "spoilerText": { - "description": "Spoiler text hiding the root text of this post", - "type": "string" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "pinterest": { - "additionalProperties": false, - "properties": { - "boardServiceId": { - "description": "The board ID of the Pin, can be obtained when fetching the channel details with the following query:\n```\nquery GetChannelWithSubprofiles {\n channel(input: { id: \"[CHANNEL_ID_HERE]\" }) {\n metadata {\n ... on PinterestMetadata {\n boards {\n serviceId\n }\n }\n }\n }\n}\n```\nRequired on create; optional on edit (omitted preserves existing board).", - "type": "string" - }, - "title": { - "description": "The title of the Pin", - "type": "string" - }, - "url": { - "description": "The Pin destination link", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "substack": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "locationId": { - "description": "LocationId associated with the post", - "type": "string" - }, - "locationName": { - "description": "Location name associated with the post", - "type": "string" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "topic": { - "description": "Topic associated with the post", - "type": "string" - }, - "type": { - "description": "The type of the post", - "enum": [ - "carousel", - "event", - "ghost_post", - "offer", - "post", - "reel", - "short", - "story", - "thread", - "whats_new" - ], - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "tiktok": { - "additionalProperties": false, - "properties": { - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content (TikTok video only)", - "type": "boolean" - }, - "title": { - "description": "The title of the TikTok post (for photo posts)", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "twitter": { - "additionalProperties": false, - "properties": { - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content (original tweets only, never retweets)", - "type": "boolean" - }, - "retweet": { - "additionalProperties": false, - "properties": { - "comment": { - "description": "Optional user comment shown above the embedded retweet", - "type": "string" - }, - "id": { - "description": "Retweet ID", - "type": "string" - } - }, - "required": [ - "id" - ], - "type": "object" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "youtube": { - "additionalProperties": false, - "properties": { - "categoryId": { - "description": "Youtube Category ID, one ID of this list:\nID: 1 -> Film & Animation\nID: 2 -> Autos & Vehicles\nID: 10 -> Music\nID: 15 -> Pets & Animals\nID: 17 -> Sports\nID: 19 -> Travel & Events\nID: 20 -> Gaming\nID: 22 -> People & Blogs\nID: 23 -> Comedy\nID: 24 -> Entertainment\nID: 25 -> News & Politics\nID: 26 -> Howto & Style\nID: 27 -> Education\nID: 28 -> Science & Technology\nID: 29 -> Nonprofits & Activism\n\nRequired on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "embeddable": { - "description": "Indicates whether the video allows embedding (default: true)", - "type": "boolean" - }, - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content", - "type": "boolean" - }, - "license": { - "description": "Video license (default: youtube)", - "enum": [ - "creativeCommon", - "youtube" - ], - "type": "string" - }, - "madeForKids": { - "description": "Indicates whether the video is suitable for kids (default: false)", - "type": "boolean" - }, - "notifySubscribers": { - "description": "Indicates whether to notify subscribers on publish video (default: true)", - "type": "boolean" - }, - "privacy": { - "description": "Privacy setting for post (default: public)", - "enum": [ - "private", - "public", - "unlisted" - ], - "type": "string" - }, - "title": { - "description": "Title of the Youtube post. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [], - "type": "object" - } -} - removed
Input schema / properties / metadata / requiredRemoved value: -[] - removed
Input schema / properties / metadata / typeRemoved value: -"object" - added
Input schema / properties / needsApproval / $refAdded value: +"#/$defs/needsApproval" - removed
Input schema / properties / needsApproval / descriptionRemoved value: -"Submit the post for approval instead of scheduling it. A post submitted for\napproval is always a draft, so this conflicts with turning `saveToDraft` off.\n\nOnly valid when your posting policy on the target channel requires approval." - removed
Input schema / properties / needsApproval / typeRemoved value: -"boolean" - added
Input schema / properties / payload / properties / assets / $refAdded value: +"#/$defs/assets" - removed
Input schema / properties / payload / properties / assets / descriptionRemoved value: -"Ordered list of assets on this post." - removed
Input schema / properties / payload / properties / assets / itemsRemoved value: -{ - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "altText": { - "description": "Alternative text for accessibility", - "type": "string" - }, - "animatedThumbnail": { - "description": "Animated thumbnail URL", - "type": "string" - }, - "dimensions": { - "additionalProperties": false, - "properties": { - "height": { - "description": "Image height in pixels", - "type": "integer" - }, - "width": { - "description": "Image width in pixels", - "type": "integer" - } - }, - "required": [ - "height", - "width" - ], - "type": "object" - }, - "userTags": { - "description": "Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput.", - "items": { - "additionalProperties": false, - "properties": { - "handle": { - "description": "The handle (username) of the account to tag, without the leading @.", - "type": "string" - }, - "x": { - "description": "Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width.", - "type": "number" - }, - "y": { - "description": "Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height.", - "type": "number" - } - }, - "required": [ - "handle", - "x", - "y" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "altText" - ], - "type": "object" - }, - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "thumbnailOffset": { - "description": "Offset of the thumbnail chosen for the video, in ms", - "type": "integer" - }, - "title": { - "description": "Video title", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" -} - removed
Input schema / properties / payload / properties / assets / typeRemoved value: -"array" - added
Input schema / properties / payload / properties / metadata / $refAdded value: +"#/$defs/metadata" - removed
Input schema / properties / payload / properties / metadata / additionalPropertiesRemoved value: -false - removed
Input schema / properties / payload / properties / metadata / propertiesRemoved value: -{ - "bluesky": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "facebook": { - "additionalProperties": false, - "properties": { - "annotations": { - "description": "Annotations representing entities in the text", - "items": { - "additionalProperties": false, - "properties": { - "content": { - "description": "The content of the annotation, e.g. '107509875938399'", - "type": "string" - }, - "indices": { - "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", - "items": { - "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", - "type": "integer" - }, - "type": "array" - }, - "text": { - "description": "The text representation of the annotation, eg 'Buffer'", - "type": "string" - }, - "url": { - "description": "The URL the annotation points to, e.g. https://www.facebook.com/107509875938399", - "type": "string" - } - }, - "required": [ - "content", - "indices", - "text", - "url" - ], - "type": "object" - }, - "type": "array" - }, - "firstComment": { - "description": "Facebook post's first comment", - "type": "string" - }, - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, story, reel for Facebook", - "enum": [ - "post", - "reel", - "story" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "google": { - "additionalProperties": false, - "properties": { - "detailsEvent": { - "additionalProperties": false, - "properties": { - "button": { - "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", - "enum": [ - "book", - "call", - "learn_more", - "none", - "order", - "shop", - "signup" - ], - "type": "string" - }, - "endDate": { - "description": "End date of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "isFullDayEvent": { - "description": "Indicate whether the event has a start or end time.", - "type": "boolean" - }, - "link": { - "description": "Link to the action", - "type": "string" - }, - "startDate": { - "description": "Start date of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "title": { - "description": "Title of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [ - "isFullDayEvent" - ], - "type": "object" - }, - "detailsOffer": { - "additionalProperties": false, - "properties": { - "code": { - "description": "Coupon code for the offer", - "type": "string" - }, - "endDate": { - "description": "End date of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "link": { - "description": "Link to the offer", - "type": "string" - }, - "startDate": { - "description": "Start date of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "terms": { - "description": "Terms and Conditions", - "type": "string" - }, - "title": { - "description": "Title of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "detailsWhatsNew": { - "additionalProperties": false, - "properties": { - "button": { - "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", - "enum": [ - "book", - "call", - "learn_more", - "none", - "order", - "shop", - "signup" - ], - "type": "string" - }, - "link": { - "description": "Link to the action", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "title": { - "description": "Title if available in the given GBP post type: event and offer", - "type": "string" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, offer, event for Google Business Profile", - "enum": [ - "event", - "offer", - "whats_new" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "instagram": { - "additionalProperties": false, - "properties": { - "firstComment": { - "description": "Instagram post's first comment", - "type": "string" - }, - "geolocation": { - "additionalProperties": false, - "properties": { - "id": { - "description": "The id of this location", - "type": "string" - }, - "text": { - "description": "The name of this location", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content", - "type": "boolean" - }, - "link": { - "description": "Shop Grid link for the post", - "type": "string" - }, - "shouldShareToFeed": { - "description": "Indicates whether post should be shared to feed", - "type": "boolean" - }, - "stickerFields": { - "additionalProperties": false, - "properties": { - "music": { - "description": "Placeholder text for the post's music", - "type": "string" - }, - "other": { - "description": "Additional field for any other post content", - "type": "string" - }, - "products": { - "description": "Placeholder text for the post's linked products", - "type": "string" - }, - "text": { - "description": "Text for the Story or Reel", - "type": "string" - }, - "topics": { - "description": "Placeholder text for the post's topics (Reels only)", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, story, reel for Instagram", - "enum": [ - "carousel", - "event", - "ghost_post", - "offer", - "post", - "reel", - "short", - "story", - "thread", - "whats_new" - ], - "type": "string" - } - }, - "required": [ - "shouldShareToFeed", - "type" - ], - "type": "object" - }, - "linkedin": { - "additionalProperties": false, - "properties": { - "annotations": { - "description": "Annotations representing entities in the text", - "items": { - "additionalProperties": false, - "properties": { - "entity": { - "description": "The entity of the annotation, e.g. urn:li:organization:1521226", - "type": "string" - }, - "id": { - "description": "The id of the annotation, e.g. 1521226", - "type": "string" - }, - "length": { - "description": "The length of the annotation, e.g. 6", - "type": "integer" - }, - "link": { - "description": "The link of the annotation, e.g. https://www.linkedin.com/company/bufferapp", - "type": "string" - }, - "localizedName": { - "description": "The localized name of the annotation, e.g. Buffer", - "type": "string" - }, - "start": { - "description": "The start of the annotation, e.g. 5", - "type": "integer" - }, - "vanityName": { - "description": "The vanity name of the annotation, e.g. bufferapp", - "type": "string" - } - }, - "required": [ - "id", - "entity", - "length", - "link", - "localizedName", - "start", - "vanityName" - ], - "type": "object" - }, - "type": "array" - }, - "firstComment": { - "description": "LinkedIn post's first comment", - "type": "string" - }, - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "mastodon": { - "additionalProperties": false, - "properties": { - "spoilerText": { - "description": "Spoiler text hiding the root text of this post", - "type": "string" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "pinterest": { - "additionalProperties": false, - "properties": { - "boardServiceId": { - "description": "The board ID of the Pin, can be obtained when fetching the channel details with the following query:\n```\nquery GetChannelWithSubprofiles {\n channel(input: { id: \"[CHANNEL_ID_HERE]\" }) {\n metadata {\n ... on PinterestMetadata {\n boards {\n serviceId\n }\n }\n }\n }\n}\n```\nRequired on create; optional on edit (omitted preserves existing board).", - "type": "string" - }, - "title": { - "description": "The title of the Pin", - "type": "string" - }, - "url": { - "description": "The Pin destination link", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "substack": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "locationId": { - "description": "LocationId associated with the post", - "type": "string" - }, - "locationName": { - "description": "Location name associated with the post", - "type": "string" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "topic": { - "description": "Topic associated with the post", - "type": "string" - }, - "type": { - "description": "The type of the post", - "enum": [ - "carousel", - "event", - "ghost_post", - "offer", - "post", - "reel", - "short", - "story", - "thread", - "whats_new" - ], - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "tiktok": { - "additionalProperties": false, - "properties": { - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content (TikTok video only)", - "type": "boolean" - }, - "title": { - "description": "The title of the TikTok post (for photo posts)", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "twitter": { - "additionalProperties": false, - "properties": { - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content (original tweets only, never retweets)", - "type": "boolean" - }, - "retweet": { - "additionalProperties": false, - "properties": { - "comment": { - "description": "Optional user comment shown above the embedded retweet", - "type": "string" - }, - "id": { - "description": "Retweet ID", - "type": "string" - } - }, - "required": [ - "id" - ], - "type": "object" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "youtube": { - "additionalProperties": false, - "properties": { - "categoryId": { - "description": "Youtube Category ID, one ID of this list:\nID: 1 -> Film & Animation\nID: 2 -> Autos & Vehicles\nID: 10 -> Music\nID: 15 -> Pets & Animals\nID: 17 -> Sports\nID: 19 -> Travel & Events\nID: 20 -> Gaming\nID: 22 -> People & Blogs\nID: 23 -> Comedy\nID: 24 -> Entertainment\nID: 25 -> News & Politics\nID: 26 -> Howto & Style\nID: 27 -> Education\nID: 28 -> Science & Technology\nID: 29 -> Nonprofits & Activism\n\nRequired on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "embeddable": { - "description": "Indicates whether the video allows embedding (default: true)", - "type": "boolean" - }, - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content", - "type": "boolean" - }, - "license": { - "description": "Video license (default: youtube)", - "enum": [ - "creativeCommon", - "youtube" - ], - "type": "string" - }, - "madeForKids": { - "description": "Indicates whether the video is suitable for kids (default: false)", - "type": "boolean" - }, - "notifySubscribers": { - "description": "Indicates whether to notify subscribers on publish video (default: true)", - "type": "boolean" - }, - "privacy": { - "description": "Privacy setting for post (default: public)", - "enum": [ - "private", - "public", - "unlisted" - ], - "type": "string" - }, - "title": { - "description": "Title of the Youtube post. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [], - "type": "object" - } -} - removed
Input schema / properties / payload / properties / metadata / requiredRemoved value: -[] - removed
Input schema / properties / payload / properties / metadata / typeRemoved value: -"object" - added
Input schema / properties / payload / properties / needsApproval / $refAdded value: +"#/$defs/needsApproval" - removed
Input schema / properties / payload / properties / needsApproval / descriptionRemoved value: -"Submit the post for approval instead of scheduling it. A post submitted for\napproval is always a draft, so this conflicts with turning `saveToDraft` off.\n\nOnly valid when your posting policy on the target channel requires approval." - removed
Input schema / properties / payload / properties / needsApproval / typeRemoved value: -"boolean" - added
Input schema / properties / payload / properties / saveToDraft / $refAdded value: +"#/$defs/saveToDraft" - removed
Input schema / properties / payload / properties / saveToDraft / descriptionRemoved value: -"If true, saves the post as a draft instead of scheduling it.\nWhen saving as draft:\n- Post status will be 'draft' instead of 'buffer'\n- Posting limits are not checked\n- The post will not be published until explicitly scheduled" - removed
Input schema / properties / payload / properties / saveToDraft / typeRemoved value: -"boolean" - added
Input schema / properties / saveToDraft / $refAdded value: +"#/$defs/saveToDraft" - removed
Input schema / properties / saveToDraft / descriptionRemoved value: -"If true, saves the post as a draft instead of scheduling it.\nWhen saving as draft:\n- Post status will be 'draft' instead of 'buffer'\n- Posting limits are not checked\n- The post will not be published until explicitly scheduled" - removed
Input schema / properties / saveToDraft / typeRemoved value: -"boolean"
- Changed
create_post_template14 fields changed- added
Input schema / $defsAdded value: +{ + "description": { + "description": "A short user-facing description of the template. Nullable for\nbackwards-compat at the GraphQL boundary — the resolver rejects\nnull/empty values with a clear input error so the underlying\nstorage contract (non-empty string) is still honored.", + "type": "string" + }, + "organizationId": { + "description": "Organization the template belongs to. The caller must be a member of\nthis organization. For `internal` visibility this is the team scope;\nfor `private` it's recorded on the template but does not affect\nvisibility.", + "type": "string" + } +} - changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true for this exact user-requested Buffer mutation."New value: +"Set true only when the user asked for exactly this action." - added
Input schema / properties / description / $refAdded value: +"#/$defs/description" - removed
Input schema / properties / description / descriptionRemoved value: -"A short user-facing description of the template. Nullable for\nbackwards-compat at the GraphQL boundary — the resolver rejects\nnull/empty values with a clear input error so the underlying\nstorage contract (non-empty string) is still honored." - removed
Input schema / properties / description / typeRemoved value: -"string" - added
Input schema / properties / organizationId / $refAdded value: +"#/$defs/organizationId" - removed
Input schema / properties / organizationId / descriptionRemoved value: -"Organization the template belongs to. The caller must be a member of\nthis organization. For `internal` visibility this is the team scope;\nfor `private` it's recorded on the template but does not affect\nvisibility." - removed
Input schema / properties / organizationId / typeRemoved value: -"string" - added
Input schema / properties / payload / properties / description / $refAdded value: +"#/$defs/description" - removed
Input schema / properties / payload / properties / description / descriptionRemoved value: -"A short user-facing description of the template. Nullable for\nbackwards-compat at the GraphQL boundary — the resolver rejects\nnull/empty values with a clear input error so the underlying\nstorage contract (non-empty string) is still honored." - removed
Input schema / properties / payload / properties / description / typeRemoved value: -"string" - added
Input schema / properties / payload / properties / organizationId / $refAdded value: +"#/$defs/organizationId" - removed
Input schema / properties / payload / properties / organizationId / descriptionRemoved value: -"Organization the template belongs to. The caller must be a member of\nthis organization. For `internal` visibility this is the team scope;\nfor `private` it's recorded on the template but does not affect\nvisibility." - removed
Input schema / properties / payload / properties / organizationId / typeRemoved value: -"string"
- Changed
delete_content_item1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true for this exact user-requested Buffer mutation."New value: +"Set true only when the user asked for exactly this action."
- Changed
delete_post1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true for this exact user-requested Buffer mutation."New value: +"Set true only when the user asked for exactly this action."
- Changed
delete_post_template1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true for this exact user-requested Buffer mutation."New value: +"Set true only when the user asked for exactly this action."
- Changed
edit_post56 fields changed- added
Input schema / $defsAdded value: +{ + "approvalChange": { + "description": "Change the post's approval state alongside this edit. Leave unset to keep the\npost's current approval state.\n\nOnly valid when your posting policy on the post's channel requires approval,\nand only on your own drafts. Asking for the state the post is already in does\nnothing.", + "enum": [ + "request", + "revert" + ], + "type": "string" + }, + "assets": { + "description": "Ordered list of assets on this post. Omit to preserve the existing list,\npass an empty array to clear it", + "items": { + "additionalProperties": false, + "properties": { + "document": { + "$ref": "#/$defs/document" + }, + "image": { + "additionalProperties": false, + "properties": { + "metadata": { + "additionalProperties": false, + "properties": { + "altText": { + "description": "Alternative text for accessibility", + "type": "string" + }, + "animatedThumbnail": { + "description": "Animated thumbnail URL", + "type": "string" + }, + "dimensions": { + "additionalProperties": false, + "properties": { + "height": { + "description": "Image height in pixels", + "type": "integer" + }, + "width": { + "description": "Image width in pixels", + "type": "integer" + } + }, + "required": [ + "height", + "width" + ], + "type": "object" + }, + "userTags": { + "description": "Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput.", + "items": { + "additionalProperties": false, + "properties": { + "handle": { + "description": "The handle (username) of the account to tag, without the leading @.", + "type": "string" + }, + "x": { + "description": "Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width.", + "type": "number" + }, + "y": { + "description": "Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height.", + "type": "number" + } + }, + "required": [ + "handle", + "x", + "y" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "altText" + ], + "type": "object" + }, + "thumbnailUrl": { + "description": "URL to the static thumbnail of the asset", + "type": "string" + }, + "url": { + "description": "URL to the file source", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "link": { + "$ref": "#/$defs/link" + }, + "video": { + "additionalProperties": false, + "properties": { + "metadata": { + "additionalProperties": false, + "properties": { + "thumbnailOffset": { + "description": "Offset of the thumbnail chosen for the video, in ms", + "type": "integer" + }, + "title": { + "description": "Video title", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "thumbnailUrl": { + "$ref": "#/$defs/thumbnailUrl" + }, + "url": { + "description": "URL to the file source", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + } + }, + "required": [], + "type": "object" + }, + "type": "array" + }, + "button": { + "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", + "enum": [ + "book", + "call", + "learn_more", + "none", + "order", + "shop", + "signup" + ], + "type": "string" + }, + "document": { + "additionalProperties": false, + "properties": { + "thumbnailUrl": { + "description": "Document thumbnail URL", + "type": "string" + }, + "title": { + "description": "Document title", + "type": "string" + }, + "url": { + "description": "Document URL", + "type": "string" + } + }, + "required": [ + "thumbnailUrl", + "title", + "url" + ], + "type": "object" + }, + "link": { + "additionalProperties": false, + "properties": { + "description": { + "description": "Description of the link", + "type": "string" + }, + "thumbnailUrl": { + "description": "Thumbnail URL of the link", + "type": "string" + }, + "title": { + "description": "Title of the link", + "type": "string" + }, + "url": { + "description": "URL to the link", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "linkAttachment": { + "additionalProperties": false, + "properties": { + "description": { + "description": "Description shown on the link card", + "type": "string" + }, + "thumbnail": { + "additionalProperties": false, + "properties": { + "url": { + "description": "URL of the thumbnail image", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "title": { + "description": "Title shown on the link card", + "type": "string" + }, + "url": { + "description": "URL that the link asset has been built from", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "metadata": { + "additionalProperties": false, + "properties": { + "bluesky": { + "additionalProperties": false, + "properties": { + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + }, + "thread": { + "$ref": "#/$defs/thread" + } + }, + "required": [], + "type": "object" + }, + "facebook": { + "additionalProperties": false, + "properties": { + "annotations": { + "description": "Annotations representing entities in the text", + "items": { + "additionalProperties": false, + "properties": { + "content": { + "description": "The content of the annotation, e.g. '107509875938399'", + "type": "string" + }, + "indices": { + "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", + "items": { + "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", + "type": "integer" + }, + "type": "array" + }, + "text": { + "description": "The text representation of the annotation, eg 'Buffer'", + "type": "string" + }, + "url": { + "description": "The URL the annotation points to, e.g. https://www.facebook.com/107509875938399", + "type": "string" + } + }, + "required": [ + "content", + "indices", + "text", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "firstComment": { + "description": "Facebook post's first comment", + "type": "string" + }, + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + }, + "type": { + "description": "The channel-specific type of the post, eg, post, story, reel for Facebook", + "enum": [ + "post", + "reel", + "story" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "google": { + "additionalProperties": false, + "properties": { + "detailsEvent": { + "additionalProperties": false, + "properties": { + "button": { + "$ref": "#/$defs/button" + }, + "endDate": { + "description": "End date of the event. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "isFullDayEvent": { + "description": "Indicate whether the event has a start or end time.", + "type": "boolean" + }, + "link": { + "description": "Link to the action", + "type": "string" + }, + "startDate": { + "description": "Start date of the event. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "title": { + "description": "Title of the event. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + } + }, + "required": [ + "isFullDayEvent" + ], + "type": "object" + }, + "detailsOffer": { + "additionalProperties": false, + "properties": { + "code": { + "description": "Coupon code for the offer", + "type": "string" + }, + "endDate": { + "description": "End date of the offer. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "link": { + "description": "Link to the offer", + "type": "string" + }, + "startDate": { + "description": "Start date of the offer. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "terms": { + "description": "Terms and Conditions", + "type": "string" + }, + "title": { + "description": "Title of the offer. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "detailsWhatsNew": { + "additionalProperties": false, + "properties": { + "button": { + "$ref": "#/$defs/button" + }, + "link": { + "description": "Link to the action", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "title": { + "description": "Title if available in the given GBP post type: event and offer", + "type": "string" + }, + "type": { + "description": "The channel-specific type of the post, eg, post, offer, event for Google Business Profile", + "enum": [ + "event", + "offer", + "whats_new" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "instagram": { + "additionalProperties": false, + "properties": { + "firstComment": { + "description": "Instagram post's first comment", + "type": "string" + }, + "geolocation": { + "additionalProperties": false, + "properties": { + "id": { + "description": "The id of this location", + "type": "string" + }, + "text": { + "description": "The name of this location", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "isAiGenerated": { + "description": "Whether the post discloses AI-generated content", + "type": "boolean" + }, + "link": { + "description": "Shop Grid link for the post", + "type": "string" + }, + "shouldShareToFeed": { + "description": "Indicates whether post should be shared to feed", + "type": "boolean" + }, + "stickerFields": { + "additionalProperties": false, + "properties": { + "music": { + "description": "Placeholder text for the post's music", + "type": "string" + }, + "other": { + "description": "Additional field for any other post content", + "type": "string" + }, + "products": { + "description": "Placeholder text for the post's linked products", + "type": "string" + }, + "text": { + "description": "Text for the Story or Reel", + "type": "string" + }, + "topics": { + "description": "Placeholder text for the post's topics (Reels only)", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "type": { + "description": "The channel-specific type of the post, eg, post, story, reel for Instagram", + "enum": [ + "carousel", + "event", + "ghost_post", + "offer", + "post", + "reel", + "short", + "story", + "thread", + "whats_new" + ], + "type": "string" + } + }, + "required": [ + "shouldShareToFeed", + "type" + ], + "type": "object" + }, + "linkedin": { + "additionalProperties": false, + "properties": { + "annotations": { + "description": "Annotations representing entities in the text", + "items": { + "additionalProperties": false, + "properties": { + "entity": { + "description": "The entity of the annotation, e.g. urn:li:organization:1521226", + "type": "string" + }, + "id": { + "description": "The id of the annotation, e.g. 1521226", + "type": "string" + }, + "length": { + "description": "The length of the annotation, e.g. 6", + "type": "integer" + }, + "link": { + "description": "The link of the annotation, e.g. https://www.linkedin.com/company/bufferapp", + "type": "string" + }, + "localizedName": { + "description": "The localized name of the annotation, e.g. Buffer", + "type": "string" + }, + "start": { + "description": "The start of the annotation, e.g. 5", + "type": "integer" + }, + "vanityName": { + "description": "The vanity name of the annotation, e.g. bufferapp", + "type": "string" + } + }, + "required": [ + "id", + "entity", + "length", + "link", + "localizedName", + "start", + "vanityName" + ], + "type": "object" + }, + "type": "array" + }, + "firstComment": { + "description": "LinkedIn post's first comment", + "type": "string" + }, + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + } + }, + "required": [], + "type": "object" + }, + "mastodon": { + "additionalProperties": false, + "properties": { + "spoilerText": { + "description": "Spoiler text hiding the root text of this post", + "type": "string" + }, + "thread": { + "$ref": "#/$defs/thread" + } + }, + "required": [], + "type": "object" + }, + "pinterest": { + "additionalProperties": false, + "properties": { + "boardServiceId": { + "description": "The board ID of the Pin, can be obtained when fetching the channel details with the following query:\n```\nquery GetChannelWithSubprofiles {\n channel(input: { id: \"[CHANNEL_ID_HERE]\" }) {\n metadata {\n ... on PinterestMetadata {\n boards {\n serviceId\n }\n }\n }\n }\n}\n```\nRequired on create; optional on edit (omitted preserves existing board).", + "type": "string" + }, + "title": { + "description": "The title of the Pin", + "type": "string" + }, + "url": { + "description": "The Pin destination link", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "substack": { + "additionalProperties": false, + "properties": { + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + } + }, + "required": [], + "type": "object" + }, + "threads": { + "additionalProperties": false, + "properties": { + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + }, + "locationId": { + "description": "LocationId associated with the post", + "type": "string" + }, + "locationName": { + "description": "Location name associated with the post", + "type": "string" + }, + "thread": { + "$ref": "#/$defs/thread" + }, + "topic": { + "description": "Topic associated with the post", + "type": "string" + }, + "type": { + "description": "The type of the post", + "enum": [ + "carousel", + "event", + "ghost_post", + "offer", + "post", + "reel", + "short", + "story", + "thread", + "whats_new" + ], + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "tiktok": { + "additionalProperties": false, + "properties": { + "isAiGenerated": { + "description": "Whether the post discloses AI-generated content (TikTok video only)", + "type": "boolean" + }, + "title": { + "description": "The title of the TikTok post (for photo posts)", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "twitter": { + "additionalProperties": false, + "properties": { + "isAiGenerated": { + "description": "Whether the post discloses AI-generated content (original tweets only, never retweets)", + "type": "boolean" + }, + "retweet": { + "additionalProperties": false, + "properties": { + "comment": { + "description": "Optional user comment shown above the embedded retweet", + "type": "string" + }, + "id": { + "description": "Retweet ID", + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "thread": { + "$ref": "#/$defs/thread" + } + }, + "required": [], + "type": "object" + }, + "youtube": { + "additionalProperties": false, + "properties": { + "categoryId": { + "description": "Youtube Category ID, one ID of this list:\nID: 1 -> Film & Animation\nID: 2 -> Autos & Vehicles\nID: 10 -> Music\nID: 15 -> Pets & Animals\nID: 17 -> Sports\nID: 19 -> Travel & Events\nID: 20 -> Gaming\nID: 22 -> People & Blogs\nID: 23 -> Comedy\nID: 24 -> Entertainment\nID: 25 -> News & Politics\nID: 26 -> Howto & Style\nID: 27 -> Education\nID: 28 -> Science & Technology\nID: 29 -> Nonprofits & Activism\n\nRequired on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "embeddable": { + "description": "Indicates whether the video allows embedding (default: true)", + "type": "boolean" + }, + "isAiGenerated": { + "description": "Whether the post discloses AI-generated content", + "type": "boolean" + }, + "license": { + "description": "Video license (default: youtube)", + "enum": [ + "creativeCommon", + "youtube" + ], + "type": "string" + }, + "madeForKids": { + "description": "Indicates whether the video is suitable for kids (default: false)", + "type": "boolean" + }, + "notifySubscribers": { + "description": "Indicates whether to notify subscribers on publish video (default: true)", + "type": "boolean" + }, + "privacy": { + "description": "Privacy setting for post (default: public)", + "enum": [ + "private", + "public", + "unlisted" + ], + "type": "string" + }, + "title": { + "description": "Title of the Youtube post. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + } + }, + "required": [], + "type": "object" + } + }, + "required": [], + "type": "object" + }, + "mode": { + "description": "How the post is being scheduled. Omit the field or pass null to make no\nscheduling change — null does not clear or reset the schedule: a scheduled post\nkeeps its current share mode, queue slot, and any custom time, and the edit\napplies only the other provided fields. Pass a non-null ShareMode to apply that\nmode.", + "enum": [ + "addToQueue", + "customScheduled", + "shareNext", + "shareNow" + ], + "type": "string" + }, + "saveToDraft": { + "description": "If true, saves the post as a draft instead of keeping it scheduled.\nWhen saving as draft:\n- Post status will be 'draft' instead of 'buffer'\n- The post will not be published until explicitly scheduled", + "type": "boolean" + }, + "schedulingType": { + "description": "Scheduling type to indicate notification publishing or automatic publishing.\n\nOmit it, or send null, to leave the post publishing the way it already does.", + "enum": [ + "automatic", + "notification" + ], + "type": "string" + }, + "text": { + "description": "Text content of the Post. Omit the field to keep the current text; pass an\nempty string or null to clear it.\n\nNote: for threaded posts, this needs to match the first item in the `thread` array.", + "type": "string" + }, + "thread": { + "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", + "items": { + "additionalProperties": false, + "properties": { + "assets": { + "description": "Ordered list of assets on this threaded post", + "items": { + "additionalProperties": false, + "properties": { + "document": { + "$ref": "#/$defs/document" + }, + "image": { + "additionalProperties": false, + "properties": { + "thumbnailUrl": { + "description": "URL to the static thumbnail of the asset", + "type": "string" + }, + "url": { + "description": "URL to the file source", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "link": { + "$ref": "#/$defs/link" + }, + "video": { + "additionalProperties": false, + "properties": { + "thumbnailUrl": { + "$ref": "#/$defs/thumbnailUrl" + }, + "url": { + "description": "URL to the file source", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + } + }, + "required": [], + "type": "object" + }, + "type": "array" + }, + "metadata": { + "additionalProperties": false, + "properties": { + "bluesky": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "threads": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + } + }, + "required": [], + "type": "object" + }, + "text": { + "description": "The text body content of the threaded post", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "type": "array" + }, + "thumbnailUrl": { + "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", + "type": "string" + } +} - added
Input schema / properties / approvalChange / $refAdded value: +"#/$defs/approvalChange" - removed
Input schema / properties / approvalChange / descriptionRemoved value: -"Change the post's approval state alongside this edit. Leave unset to keep the\npost's current approval state.\n\nOnly valid when your posting policy on the post's channel requires approval,\nand only on your own drafts. Asking for the state the post is already in does\nnothing." - removed
Input schema / properties / approvalChange / enumRemoved value: -[ - "request", - "revert" -] - removed
Input schema / properties / approvalChange / typeRemoved value: -"string" - added
Input schema / properties / assets / $refAdded value: +"#/$defs/assets" - removed
Input schema / properties / assets / descriptionRemoved value: -"Ordered list of assets on this post. Omit to preserve the existing list,\npass an empty array to clear it" - removed
Input schema / properties / assets / itemsRemoved value: -{ - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "altText": { - "description": "Alternative text for accessibility", - "type": "string" - }, - "animatedThumbnail": { - "description": "Animated thumbnail URL", - "type": "string" - }, - "dimensions": { - "additionalProperties": false, - "properties": { - "height": { - "description": "Image height in pixels", - "type": "integer" - }, - "width": { - "description": "Image width in pixels", - "type": "integer" - } - }, - "required": [ - "height", - "width" - ], - "type": "object" - }, - "userTags": { - "description": "Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput.", - "items": { - "additionalProperties": false, - "properties": { - "handle": { - "description": "The handle (username) of the account to tag, without the leading @.", - "type": "string" - }, - "x": { - "description": "Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width.", - "type": "number" - }, - "y": { - "description": "Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height.", - "type": "number" - } - }, - "required": [ - "handle", - "x", - "y" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "altText" - ], - "type": "object" - }, - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "thumbnailOffset": { - "description": "Offset of the thumbnail chosen for the video, in ms", - "type": "integer" - }, - "title": { - "description": "Video title", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" -} - removed
Input schema / properties / assets / typeRemoved value: -"array" - changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true for this exact user-requested Buffer mutation."New value: +"Set true only when the user asked for exactly this action." - added
Input schema / properties / metadata / $refAdded value: +"#/$defs/metadata" - removed
Input schema / properties / metadata / additionalPropertiesRemoved value: -false - removed
Input schema / properties / metadata / propertiesRemoved value: -{ - "bluesky": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "facebook": { - "additionalProperties": false, - "properties": { - "annotations": { - "description": "Annotations representing entities in the text", - "items": { - "additionalProperties": false, - "properties": { - "content": { - "description": "The content of the annotation, e.g. '107509875938399'", - "type": "string" - }, - "indices": { - "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", - "items": { - "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", - "type": "integer" - }, - "type": "array" - }, - "text": { - "description": "The text representation of the annotation, eg 'Buffer'", - "type": "string" - }, - "url": { - "description": "The URL the annotation points to, e.g. https://www.facebook.com/107509875938399", - "type": "string" - } - }, - "required": [ - "content", - "indices", - "text", - "url" - ], - "type": "object" - }, - "type": "array" - }, - "firstComment": { - "description": "Facebook post's first comment", - "type": "string" - }, - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, story, reel for Facebook", - "enum": [ - "post", - "reel", - "story" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "google": { - "additionalProperties": false, - "properties": { - "detailsEvent": { - "additionalProperties": false, - "properties": { - "button": { - "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", - "enum": [ - "book", - "call", - "learn_more", - "none", - "order", - "shop", - "signup" - ], - "type": "string" - }, - "endDate": { - "description": "End date of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "isFullDayEvent": { - "description": "Indicate whether the event has a start or end time.", - "type": "boolean" - }, - "link": { - "description": "Link to the action", - "type": "string" - }, - "startDate": { - "description": "Start date of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "title": { - "description": "Title of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [ - "isFullDayEvent" - ], - "type": "object" - }, - "detailsOffer": { - "additionalProperties": false, - "properties": { - "code": { - "description": "Coupon code for the offer", - "type": "string" - }, - "endDate": { - "description": "End date of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "link": { - "description": "Link to the offer", - "type": "string" - }, - "startDate": { - "description": "Start date of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "terms": { - "description": "Terms and Conditions", - "type": "string" - }, - "title": { - "description": "Title of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "detailsWhatsNew": { - "additionalProperties": false, - "properties": { - "button": { - "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", - "enum": [ - "book", - "call", - "learn_more", - "none", - "order", - "shop", - "signup" - ], - "type": "string" - }, - "link": { - "description": "Link to the action", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "title": { - "description": "Title if available in the given GBP post type: event and offer", - "type": "string" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, offer, event for Google Business Profile", - "enum": [ - "event", - "offer", - "whats_new" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "instagram": { - "additionalProperties": false, - "properties": { - "firstComment": { - "description": "Instagram post's first comment", - "type": "string" - }, - "geolocation": { - "additionalProperties": false, - "properties": { - "id": { - "description": "The id of this location", - "type": "string" - }, - "text": { - "description": "The name of this location", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content", - "type": "boolean" - }, - "link": { - "description": "Shop Grid link for the post", - "type": "string" - }, - "shouldShareToFeed": { - "description": "Indicates whether post should be shared to feed", - "type": "boolean" - }, - "stickerFields": { - "additionalProperties": false, - "properties": { - "music": { - "description": "Placeholder text for the post's music", - "type": "string" - }, - "other": { - "description": "Additional field for any other post content", - "type": "string" - }, - "products": { - "description": "Placeholder text for the post's linked products", - "type": "string" - }, - "text": { - "description": "Text for the Story or Reel", - "type": "string" - }, - "topics": { - "description": "Placeholder text for the post's topics (Reels only)", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, story, reel for Instagram", - "enum": [ - "carousel", - "event", - "ghost_post", - "offer", - "post", - "reel", - "short", - "story", - "thread", - "whats_new" - ], - "type": "string" - } - }, - "required": [ - "shouldShareToFeed", - "type" - ], - "type": "object" - }, - "linkedin": { - "additionalProperties": false, - "properties": { - "annotations": { - "description": "Annotations representing entities in the text", - "items": { - "additionalProperties": false, - "properties": { - "entity": { - "description": "The entity of the annotation, e.g. urn:li:organization:1521226", - "type": "string" - }, - "id": { - "description": "The id of the annotation, e.g. 1521226", - "type": "string" - }, - "length": { - "description": "The length of the annotation, e.g. 6", - "type": "integer" - }, - "link": { - "description": "The link of the annotation, e.g. https://www.linkedin.com/company/bufferapp", - "type": "string" - }, - "localizedName": { - "description": "The localized name of the annotation, e.g. Buffer", - "type": "string" - }, - "start": { - "description": "The start of the annotation, e.g. 5", - "type": "integer" - }, - "vanityName": { - "description": "The vanity name of the annotation, e.g. bufferapp", - "type": "string" - } - }, - "required": [ - "id", - "entity", - "length", - "link", - "localizedName", - "start", - "vanityName" - ], - "type": "object" - }, - "type": "array" - }, - "firstComment": { - "description": "LinkedIn post's first comment", - "type": "string" - }, - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "mastodon": { - "additionalProperties": false, - "properties": { - "spoilerText": { - "description": "Spoiler text hiding the root text of this post", - "type": "string" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "pinterest": { - "additionalProperties": false, - "properties": { - "boardServiceId": { - "description": "The board ID of the Pin, can be obtained when fetching the channel details with the following query:\n```\nquery GetChannelWithSubprofiles {\n channel(input: { id: \"[CHANNEL_ID_HERE]\" }) {\n metadata {\n ... on PinterestMetadata {\n boards {\n serviceId\n }\n }\n }\n }\n}\n```\nRequired on create; optional on edit (omitted preserves existing board).", - "type": "string" - }, - "title": { - "description": "The title of the Pin", - "type": "string" - }, - "url": { - "description": "The Pin destination link", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "substack": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "locationId": { - "description": "LocationId associated with the post", - "type": "string" - }, - "locationName": { - "description": "Location name associated with the post", - "type": "string" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "topic": { - "description": "Topic associated with the post", - "type": "string" - }, - "type": { - "description": "The type of the post", - "enum": [ - "carousel", - "event", - "ghost_post", - "offer", - "post", - "reel", - "short", - "story", - "thread", - "whats_new" - ], - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "tiktok": { - "additionalProperties": false, - "properties": { - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content (TikTok video only)", - "type": "boolean" - }, - "title": { - "description": "The title of the TikTok post (for photo posts)", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "twitter": { - "additionalProperties": false, - "properties": { - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content (original tweets only, never retweets)", - "type": "boolean" - }, - "retweet": { - "additionalProperties": false, - "properties": { - "comment": { - "description": "Optional user comment shown above the embedded retweet", - "type": "string" - }, - "id": { - "description": "Retweet ID", - "type": "string" - } - }, - "required": [ - "id" - ], - "type": "object" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "youtube": { - "additionalProperties": false, - "properties": { - "categoryId": { - "description": "Youtube Category ID, one ID of this list:\nID: 1 -> Film & Animation\nID: 2 -> Autos & Vehicles\nID: 10 -> Music\nID: 15 -> Pets & Animals\nID: 17 -> Sports\nID: 19 -> Travel & Events\nID: 20 -> Gaming\nID: 22 -> People & Blogs\nID: 23 -> Comedy\nID: 24 -> Entertainment\nID: 25 -> News & Politics\nID: 26 -> Howto & Style\nID: 27 -> Education\nID: 28 -> Science & Technology\nID: 29 -> Nonprofits & Activism\n\nRequired on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "embeddable": { - "description": "Indicates whether the video allows embedding (default: true)", - "type": "boolean" - }, - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content", - "type": "boolean" - }, - "license": { - "description": "Video license (default: youtube)", - "enum": [ - "creativeCommon", - "youtube" - ], - "type": "string" - }, - "madeForKids": { - "description": "Indicates whether the video is suitable for kids (default: false)", - "type": "boolean" - }, - "notifySubscribers": { - "description": "Indicates whether to notify subscribers on publish video (default: true)", - "type": "boolean" - }, - "privacy": { - "description": "Privacy setting for post (default: public)", - "enum": [ - "private", - "public", - "unlisted" - ], - "type": "string" - }, - "title": { - "description": "Title of the Youtube post. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [], - "type": "object" - } -} - removed
Input schema / properties / metadata / requiredRemoved value: -[] - removed
Input schema / properties / metadata / typeRemoved value: -"object" - added
Input schema / properties / mode / $refAdded value: +"#/$defs/mode" - removed
Input schema / properties / mode / descriptionRemoved value: -"How the post is being scheduled. Omit the field or pass null to make no\nscheduling change — null does not clear or reset the schedule: a scheduled post\nkeeps its current share mode, queue slot, and any custom time, and the edit\napplies only the other provided fields. Pass a non-null ShareMode to apply that\nmode." - removed
Input schema / properties / mode / enumRemoved value: -[ - "addToQueue", - "customScheduled", - "shareNext", - "shareNow" -] - removed
Input schema / properties / mode / typeRemoved value: -"string" - added
Input schema / properties / payload / properties / approvalChange / $refAdded value: +"#/$defs/approvalChange" - removed
Input schema / properties / payload / properties / approvalChange / descriptionRemoved value: -"Change the post's approval state alongside this edit. Leave unset to keep the\npost's current approval state.\n\nOnly valid when your posting policy on the post's channel requires approval,\nand only on your own drafts. Asking for the state the post is already in does\nnothing." - removed
Input schema / properties / payload / properties / approvalChange / enumRemoved value: -[ - "request", - "revert" -] - removed
Input schema / properties / payload / properties / approvalChange / typeRemoved value: -"string" - added
Input schema / properties / payload / properties / assets / $refAdded value: +"#/$defs/assets" - removed
Input schema / properties / payload / properties / assets / descriptionRemoved value: -"Ordered list of assets on this post. Omit to preserve the existing list,\npass an empty array to clear it" - removed
Input schema / properties / payload / properties / assets / itemsRemoved value: -{ - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "altText": { - "description": "Alternative text for accessibility", - "type": "string" - }, - "animatedThumbnail": { - "description": "Animated thumbnail URL", - "type": "string" - }, - "dimensions": { - "additionalProperties": false, - "properties": { - "height": { - "description": "Image height in pixels", - "type": "integer" - }, - "width": { - "description": "Image width in pixels", - "type": "integer" - } - }, - "required": [ - "height", - "width" - ], - "type": "object" - }, - "userTags": { - "description": "Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput.", - "items": { - "additionalProperties": false, - "properties": { - "handle": { - "description": "The handle (username) of the account to tag, without the leading @.", - "type": "string" - }, - "x": { - "description": "Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width.", - "type": "number" - }, - "y": { - "description": "Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height.", - "type": "number" - } - }, - "required": [ - "handle", - "x", - "y" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "altText" - ], - "type": "object" - }, - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "thumbnailOffset": { - "description": "Offset of the thumbnail chosen for the video, in ms", - "type": "integer" - }, - "title": { - "description": "Video title", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" -} - removed
Input schema / properties / payload / properties / assets / typeRemoved value: -"array" - added
Input schema / properties / payload / properties / metadata / $refAdded value: +"#/$defs/metadata" - removed
Input schema / properties / payload / properties / metadata / additionalPropertiesRemoved value: -false - removed
Input schema / properties / payload / properties / metadata / propertiesRemoved value: -{ - "bluesky": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "facebook": { - "additionalProperties": false, - "properties": { - "annotations": { - "description": "Annotations representing entities in the text", - "items": { - "additionalProperties": false, - "properties": { - "content": { - "description": "The content of the annotation, e.g. '107509875938399'", - "type": "string" - }, - "indices": { - "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", - "items": { - "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", - "type": "integer" - }, - "type": "array" - }, - "text": { - "description": "The text representation of the annotation, eg 'Buffer'", - "type": "string" - }, - "url": { - "description": "The URL the annotation points to, e.g. https://www.facebook.com/107509875938399", - "type": "string" - } - }, - "required": [ - "content", - "indices", - "text", - "url" - ], - "type": "object" - }, - "type": "array" - }, - "firstComment": { - "description": "Facebook post's first comment", - "type": "string" - }, - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, story, reel for Facebook", - "enum": [ - "post", - "reel", - "story" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "google": { - "additionalProperties": false, - "properties": { - "detailsEvent": { - "additionalProperties": false, - "properties": { - "button": { - "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", - "enum": [ - "book", - "call", - "learn_more", - "none", - "order", - "shop", - "signup" - ], - "type": "string" - }, - "endDate": { - "description": "End date of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "isFullDayEvent": { - "description": "Indicate whether the event has a start or end time.", - "type": "boolean" - }, - "link": { - "description": "Link to the action", - "type": "string" - }, - "startDate": { - "description": "Start date of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "title": { - "description": "Title of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [ - "isFullDayEvent" - ], - "type": "object" - }, - "detailsOffer": { - "additionalProperties": false, - "properties": { - "code": { - "description": "Coupon code for the offer", - "type": "string" - }, - "endDate": { - "description": "End date of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "link": { - "description": "Link to the offer", - "type": "string" - }, - "startDate": { - "description": "Start date of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "terms": { - "description": "Terms and Conditions", - "type": "string" - }, - "title": { - "description": "Title of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "detailsWhatsNew": { - "additionalProperties": false, - "properties": { - "button": { - "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", - "enum": [ - "book", - "call", - "learn_more", - "none", - "order", - "shop", - "signup" - ], - "type": "string" - }, - "link": { - "description": "Link to the action", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "title": { - "description": "Title if available in the given GBP post type: event and offer", - "type": "string" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, offer, event for Google Business Profile", - "enum": [ - "event", - "offer", - "whats_new" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "instagram": { - "additionalProperties": false, - "properties": { - "firstComment": { - "description": "Instagram post's first comment", - "type": "string" - }, - "geolocation": { - "additionalProperties": false, - "properties": { - "id": { - "description": "The id of this location", - "type": "string" - }, - "text": { - "description": "The name of this location", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content", - "type": "boolean" - }, - "link": { - "description": "Shop Grid link for the post", - "type": "string" - }, - "shouldShareToFeed": { - "description": "Indicates whether post should be shared to feed", - "type": "boolean" - }, - "stickerFields": { - "additionalProperties": false, - "properties": { - "music": { - "description": "Placeholder text for the post's music", - "type": "string" - }, - "other": { - "description": "Additional field for any other post content", - "type": "string" - }, - "products": { - "description": "Placeholder text for the post's linked products", - "type": "string" - }, - "text": { - "description": "Text for the Story or Reel", - "type": "string" - }, - "topics": { - "description": "Placeholder text for the post's topics (Reels only)", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, story, reel for Instagram", - "enum": [ - "carousel", - "event", - "ghost_post", - "offer", - "post", - "reel", - "short", - "story", - "thread", - "whats_new" - ], - "type": "string" - } - }, - "required": [ - "shouldShareToFeed", - "type" - ], - "type": "object" - }, - "linkedin": { - "additionalProperties": false, - "properties": { - "annotations": { - "description": "Annotations representing entities in the text", - "items": { - "additionalProperties": false, - "properties": { - "entity": { - "description": "The entity of the annotation, e.g. urn:li:organization:1521226", - "type": "string" - }, - "id": { - "description": "The id of the annotation, e.g. 1521226", - "type": "string" - }, - "length": { - "description": "The length of the annotation, e.g. 6", - "type": "integer" - }, - "link": { - "description": "The link of the annotation, e.g. https://www.linkedin.com/company/bufferapp", - "type": "string" - }, - "localizedName": { - "description": "The localized name of the annotation, e.g. Buffer", - "type": "string" - }, - "start": { - "description": "The start of the annotation, e.g. 5", - "type": "integer" - }, - "vanityName": { - "description": "The vanity name of the annotation, e.g. bufferapp", - "type": "string" - } - }, - "required": [ - "id", - "entity", - "length", - "link", - "localizedName", - "start", - "vanityName" - ], - "type": "object" - }, - "type": "array" - }, - "firstComment": { - "description": "LinkedIn post's first comment", - "type": "string" - }, - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "mastodon": { - "additionalProperties": false, - "properties": { - "spoilerText": { - "description": "Spoiler text hiding the root text of this post", - "type": "string" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "pinterest": { - "additionalProperties": false, - "properties": { - "boardServiceId": { - "description": "The board ID of the Pin, can be obtained when fetching the channel details with the following query:\n```\nquery GetChannelWithSubprofiles {\n channel(input: { id: \"[CHANNEL_ID_HERE]\" }) {\n metadata {\n ... on PinterestMetadata {\n boards {\n serviceId\n }\n }\n }\n }\n}\n```\nRequired on create; optional on edit (omitted preserves existing board).", - "type": "string" - }, - "title": { - "description": "The title of the Pin", - "type": "string" - }, - "url": { - "description": "The Pin destination link", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "substack": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "locationId": { - "description": "LocationId associated with the post", - "type": "string" - }, - "locationName": { - "description": "Location name associated with the post", - "type": "string" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "topic": { - "description": "Topic associated with the post", - "type": "string" - }, - "type": { - "description": "The type of the post", - "enum": [ - "carousel", - "event", - "ghost_post", - "offer", - "post", - "reel", - "short", - "story", - "thread", - "whats_new" - ], - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "tiktok": { - "additionalProperties": false, - "properties": { - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content (TikTok video only)", - "type": "boolean" - }, - "title": { - "description": "The title of the TikTok post (for photo posts)", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "twitter": { - "additionalProperties": false, - "properties": { - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content (original tweets only, never retweets)", - "type": "boolean" - }, - "retweet": { - "additionalProperties": false, - "properties": { - "comment": { - "description": "Optional user comment shown above the embedded retweet", - "type": "string" - }, - "id": { - "description": "Retweet ID", - "type": "string" - } - }, - "required": [ - "id" - ], - "type": "object" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "youtube": { - "additionalProperties": false, - "properties": { - "categoryId": { - "description": "Youtube Category ID, one ID of this list:\nID: 1 -> Film & Animation\nID: 2 -> Autos & Vehicles\nID: 10 -> Music\nID: 15 -> Pets & Animals\nID: 17 -> Sports\nID: 19 -> Travel & Events\nID: 20 -> Gaming\nID: 22 -> People & Blogs\nID: 23 -> Comedy\nID: 24 -> Entertainment\nID: 25 -> News & Politics\nID: 26 -> Howto & Style\nID: 27 -> Education\nID: 28 -> Science & Technology\nID: 29 -> Nonprofits & Activism\n\nRequired on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "embeddable": { - "description": "Indicates whether the video allows embedding (default: true)", - "type": "boolean" - }, - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content", - "type": "boolean" - }, - "license": { - "description": "Video license (default: youtube)", - "enum": [ - "creativeCommon", - "youtube" - ], - "type": "string" - }, - "madeForKids": { - "description": "Indicates whether the video is suitable for kids (default: false)", - "type": "boolean" - }, - "notifySubscribers": { - "description": "Indicates whether to notify subscribers on publish video (default: true)", - "type": "boolean" - }, - "privacy": { - "description": "Privacy setting for post (default: public)", - "enum": [ - "private", - "public", - "unlisted" - ], - "type": "string" - }, - "title": { - "description": "Title of the Youtube post. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [], - "type": "object" - } -} - removed
Input schema / properties / payload / properties / metadata / requiredRemoved value: -[] - removed
Input schema / properties / payload / properties / metadata / typeRemoved value: -"object" - added
Input schema / properties / payload / properties / mode / $refAdded value: +"#/$defs/mode" - removed
Input schema / properties / payload / properties / mode / descriptionRemoved value: -"How the post is being scheduled. Omit the field or pass null to make no\nscheduling change — null does not clear or reset the schedule: a scheduled post\nkeeps its current share mode, queue slot, and any custom time, and the edit\napplies only the other provided fields. Pass a non-null ShareMode to apply that\nmode." - removed
Input schema / properties / payload / properties / mode / enumRemoved value: -[ - "addToQueue", - "customScheduled", - "shareNext", - "shareNow" -] - removed
Input schema / properties / payload / properties / mode / typeRemoved value: -"string" - added
Input schema / properties / payload / properties / saveToDraft / $refAdded value: +"#/$defs/saveToDraft" - removed
Input schema / properties / payload / properties / saveToDraft / descriptionRemoved value: -"If true, saves the post as a draft instead of keeping it scheduled.\nWhen saving as draft:\n- Post status will be 'draft' instead of 'buffer'\n- The post will not be published until explicitly scheduled" - removed
Input schema / properties / payload / properties / saveToDraft / typeRemoved value: -"boolean" - added
Input schema / properties / payload / properties / schedulingType / $refAdded value: +"#/$defs/schedulingType" - removed
Input schema / properties / payload / properties / schedulingType / descriptionRemoved value: -"Scheduling type to indicate notification publishing or automatic publishing.\n\nOmit it, or send null, to leave the post publishing the way it already does." - removed
Input schema / properties / payload / properties / schedulingType / enumRemoved value: -[ - "automatic", - "notification" -] - removed
Input schema / properties / payload / properties / schedulingType / typeRemoved value: -"string" - added
Input schema / properties / payload / properties / text / $refAdded value: +"#/$defs/text" - removed
Input schema / properties / payload / properties / text / descriptionRemoved value: -"Text content of the Post. Omit the field to keep the current text; pass an\nempty string or null to clear it.\n\nNote: for threaded posts, this needs to match the first item in the `thread` array." - removed
Input schema / properties / payload / properties / text / typeRemoved value: -"string" - added
Input schema / properties / saveToDraft / $refAdded value: +"#/$defs/saveToDraft" - removed
Input schema / properties / saveToDraft / descriptionRemoved value: -"If true, saves the post as a draft instead of keeping it scheduled.\nWhen saving as draft:\n- Post status will be 'draft' instead of 'buffer'\n- The post will not be published until explicitly scheduled" - removed
Input schema / properties / saveToDraft / typeRemoved value: -"boolean" - added
Input schema / properties / schedulingType / $refAdded value: +"#/$defs/schedulingType" - removed
Input schema / properties / schedulingType / descriptionRemoved value: -"Scheduling type to indicate notification publishing or automatic publishing.\n\nOmit it, or send null, to leave the post publishing the way it already does." - removed
Input schema / properties / schedulingType / enumRemoved value: -[ - "automatic", - "notification" -] - removed
Input schema / properties / schedulingType / typeRemoved value: -"string" - added
Input schema / properties / text / $refAdded value: +"#/$defs/text" - removed
Input schema / properties / text / descriptionRemoved value: -"Text content of the Post. Omit the field to keep the current text; pass an\nempty string or null to clear it.\n\nNote: for threaded posts, this needs to match the first item in the `thread` array." - removed
Input schema / properties / text / typeRemoved value: -"string"
- Changed
get_aggregated_post_metrics25 fields changed- added
Input schema / $defsAdded value: +{ + "channelIds": { + "description": "Optional list of channel IDs to filter by. When omitted (null), the\naggregate spans every channel in the organization the actor has\ninsights access to. When set to an empty array, no channels match and\nthe result is empty.", + "items": { + "description": "Optional list of channel IDs to filter by. When omitted (null), the\naggregate spans every channel in the organization the actor has\ninsights access to. When set to an empty array, no channels match and\nthe result is empty.", + "type": "string" + }, + "type": "array" + }, + "endDateTime": { + "description": "End of the aggregation window. Consumers typically pass UTC midnight of\nthe last calendar day in the window (the backend treats the range as\ninclusive of that day), for example `2026-01-31T00:00:00Z`. Date range\nis capped to 365 days.", + "type": "string" + }, + "tags": { + "additionalProperties": false, + "properties": { + "in": { + "description": "Include results that have any of the specified tags (union/OR).", + "items": { + "description": "Include results that have any of the specified tags (union/OR).", + "type": "string" + }, + "type": "array" + }, + "isEmpty": { + "description": "When true, include results that have no tags assigned.\nCan be combined with 'in' for union filtering.\nDefaults to false if not specified.", + "type": "boolean" + } + }, + "required": [ + "in" + ], + "type": "object" + } +} - added
Input schema / properties / channelIds / $refAdded value: +"#/$defs/channelIds" - removed
Input schema / properties / channelIds / descriptionRemoved value: -"Optional list of channel IDs to filter by. When omitted (null), the\naggregate spans every channel in the organization the actor has\ninsights access to. When set to an empty array, no channels match and\nthe result is empty." - removed
Input schema / properties / channelIds / itemsRemoved value: -{ - "description": "Optional list of channel IDs to filter by. When omitted (null), the\naggregate spans every channel in the organization the actor has\ninsights access to. When set to an empty array, no channels match and\nthe result is empty.", - "type": "string" -} - removed
Input schema / properties / channelIds / typeRemoved value: -"array" - added
Input schema / properties / endDateTime / $refAdded value: +"#/$defs/endDateTime" - removed
Input schema / properties / endDateTime / descriptionRemoved value: -"End of the aggregation window. Consumers typically pass UTC midnight of\nthe last calendar day in the window (the backend treats the range as\ninclusive of that day), for example `2026-01-31T00:00:00Z`. Date range\nis capped to 365 days." - removed
Input schema / properties / endDateTime / typeRemoved value: -"string" - added
Input schema / properties / payload / properties / channelIds / $refAdded value: +"#/$defs/channelIds" - removed
Input schema / properties / payload / properties / channelIds / descriptionRemoved value: -"Optional list of channel IDs to filter by. When omitted (null), the\naggregate spans every channel in the organization the actor has\ninsights access to. When set to an empty array, no channels match and\nthe result is empty." - removed
Input schema / properties / payload / properties / channelIds / itemsRemoved value: -{ - "description": "Optional list of channel IDs to filter by. When omitted (null), the\naggregate spans every channel in the organization the actor has\ninsights access to. When set to an empty array, no channels match and\nthe result is empty.", - "type": "string" -} - removed
Input schema / properties / payload / properties / channelIds / typeRemoved value: -"array" - added
Input schema / properties / payload / properties / endDateTime / $refAdded value: +"#/$defs/endDateTime" - removed
Input schema / properties / payload / properties / endDateTime / descriptionRemoved value: -"End of the aggregation window. Consumers typically pass UTC midnight of\nthe last calendar day in the window (the backend treats the range as\ninclusive of that day), for example `2026-01-31T00:00:00Z`. Date range\nis capped to 365 days." - removed
Input schema / properties / payload / properties / endDateTime / typeRemoved value: -"string" - added
Input schema / properties / payload / properties / tags / $refAdded value: +"#/$defs/tags" - removed
Input schema / properties / payload / properties / tags / additionalPropertiesRemoved value: -false - removed
Input schema / properties / payload / properties / tags / propertiesRemoved value: -{ - "in": { - "description": "Include results that have any of the specified tags (union/OR).", - "items": { - "description": "Include results that have any of the specified tags (union/OR).", - "type": "string" - }, - "type": "array" - }, - "isEmpty": { - "description": "When true, include results that have no tags assigned.\nCan be combined with 'in' for union filtering.\nDefaults to false if not specified.", - "type": "boolean" - } -} - removed
Input schema / properties / payload / properties / tags / requiredRemoved value: -[ - "in" -] - removed
Input schema / properties / payload / properties / tags / typeRemoved value: -"object" - added
Input schema / properties / tags / $refAdded value: +"#/$defs/tags" - removed
Input schema / properties / tags / additionalPropertiesRemoved value: -false - removed
Input schema / properties / tags / propertiesRemoved value: -{ - "in": { - "description": "Include results that have any of the specified tags (union/OR).", - "items": { - "description": "Include results that have any of the specified tags (union/OR).", - "type": "string" - }, - "type": "array" - }, - "isEmpty": { - "description": "When true, include results that have no tags assigned.\nCan be combined with 'in' for union filtering.\nDefaults to false if not specified.", - "type": "boolean" - } -} - removed
Input schema / properties / tags / requiredRemoved value: -[ - "in" -] - removed
Input schema / properties / tags / typeRemoved value: -"object"
- Changed
get_channels11 fields changed- added
Input schema / $defsAdded value: +{ + "filter": { + "additionalProperties": false, + "properties": { + "isLocked": { + "description": "If not defined, it returns all channels\nElse,\n if true, it only returns locked channels\n if false, it only returns not locked channels", + "type": "boolean" + }, + "product": { + "description": "If not passed, it return all channels\nElse, it filters the channels based on what the product supports.", + "enum": [ + "analyze", + "buffer", + "comments", + "engage", + "publish", + "startPage" + ], + "type": "string" + } + }, + "required": [], + "type": "object" + } +} - added
Input schema / properties / filter / $refAdded value: +"#/$defs/filter" - removed
Input schema / properties / filter / additionalPropertiesRemoved value: -false - removed
Input schema / properties / filter / propertiesRemoved value: -{ - "isLocked": { - "description": "If not defined, it returns all channels\nElse,\n if true, it only returns locked channels\n if false, it only returns not locked channels", - "type": "boolean" - }, - "product": { - "description": "If not passed, it return all channels\nElse, it filters the channels based on what the product supports.", - "enum": [ - "analyze", - "buffer", - "comments", - "engage", - "publish", - "startPage" - ], - "type": "string" - } -} - removed
Input schema / properties / filter / requiredRemoved value: -[] - removed
Input schema / properties / filter / typeRemoved value: -"object" - added
Input schema / properties / payload / properties / filter / $refAdded value: +"#/$defs/filter" - removed
Input schema / properties / payload / properties / filter / additionalPropertiesRemoved value: -false - removed
Input schema / properties / payload / properties / filter / propertiesRemoved value: -{ - "isLocked": { - "description": "If not defined, it returns all channels\nElse,\n if true, it only returns locked channels\n if false, it only returns not locked channels", - "type": "boolean" - }, - "product": { - "description": "If not passed, it return all channels\nElse, it filters the channels based on what the product supports.", - "enum": [ - "analyze", - "buffer", - "comments", - "engage", - "publish", - "startPage" - ], - "type": "string" - } -} - removed
Input schema / properties / payload / properties / filter / requiredRemoved value: -[] - removed
Input schema / properties / payload / properties / filter / typeRemoved value: -"object"
- Changed
get_content_items19 fields changed- added
Input schema / $defsAdded value: +{ + "filter": { + "additionalProperties": false, + "properties": { + "contentStatus": { + "description": "Only return content items with this content status. When omitted, content\nitems in every status are returned.", + "enum": [ + "draftContent", + "postContent" + ], + "type": "string" + }, + "tags": { + "additionalProperties": false, + "properties": { + "in": { + "description": "Include results that have any of the specified tags (union/OR).", + "items": { + "description": "Include results that have any of the specified tags (union/OR).", + "type": "string" + }, + "type": "array" + }, + "isEmpty": { + "description": "When true, include results that have no tags assigned.\nCan be combined with 'in' for union filtering.\nDefaults to false if not specified.", + "type": "boolean" + } + }, + "required": [ + "in" + ], + "type": "object" + }, + "targetDate": { + "additionalProperties": false, + "properties": { + "presence": { + "description": "Only return content items by whether a target date is set: `present`\nreturns only dated items, `absent` only undated ones.", + "enum": [ + "absent", + "present" + ], + "type": "string" + }, + "range": { + "additionalProperties": false, + "properties": { + "end": { + "description": "Include results with dates equal to or before\nthe specified date", + "type": "string" + }, + "start": { + "description": "Include results with dates equal to or after\nthe specified date", + "type": "string" + } + }, + "required": [], + "type": "object" + } + }, + "required": [], + "type": "object" + } + }, + "required": [], + "type": "object" + }, + "sort": { + "description": "Sorting to apply, each entry breaking ties in the one before it. Defaults to\nnewest first. A pagination cursor is only valid for the sort that produced\nit, so reset `after` to null whenever the sort changes.", + "items": { + "additionalProperties": false, + "properties": { + "direction": { + "description": "The direction to sort by.", + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, + "field": { + "description": "The field to sort by.", + "enum": [ + "targetDate", + "createdAt" + ], + "type": "string" + } + }, + "required": [ + "direction", + "field" + ], + "type": "object" + }, + "type": "array" + } +} - added
Input schema / properties / filter / $refAdded value: +"#/$defs/filter" - removed
Input schema / properties / filter / additionalPropertiesRemoved value: -false - removed
Input schema / properties / filter / propertiesRemoved value: -{ - "contentStatus": { - "description": "Only return content items with this content status. When omitted, content\nitems in every status are returned.", - "enum": [ - "draftContent", - "postContent" - ], - "type": "string" - }, - "tags": { - "additionalProperties": false, - "properties": { - "in": { - "description": "Include results that have any of the specified tags (union/OR).", - "items": { - "description": "Include results that have any of the specified tags (union/OR).", - "type": "string" - }, - "type": "array" - }, - "isEmpty": { - "description": "When true, include results that have no tags assigned.\nCan be combined with 'in' for union filtering.\nDefaults to false if not specified.", - "type": "boolean" - } - }, - "required": [ - "in" - ], - "type": "object" - }, - "targetDate": { - "additionalProperties": false, - "properties": { - "presence": { - "description": "Only return content items by whether a target date is set: `present`\nreturns only dated items, `absent` only undated ones.", - "enum": [ - "absent", - "present" - ], - "type": "string" - }, - "range": { - "additionalProperties": false, - "properties": { - "end": { - "description": "Include results with dates equal to or before\nthe specified date", - "type": "string" - }, - "start": { - "description": "Include results with dates equal to or after\nthe specified date", - "type": "string" - } - }, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - } -} - removed
Input schema / properties / filter / requiredRemoved value: -[] - removed
Input schema / properties / filter / typeRemoved value: -"object" - added
Input schema / properties / payload / properties / filter / $refAdded value: +"#/$defs/filter" - removed
Input schema / properties / payload / properties / filter / additionalPropertiesRemoved value: -false - removed
Input schema / properties / payload / properties / filter / propertiesRemoved value: -{ - "contentStatus": { - "description": "Only return content items with this content status. When omitted, content\nitems in every status are returned.", - "enum": [ - "draftContent", - "postContent" - ], - "type": "string" - }, - "tags": { - "additionalProperties": false, - "properties": { - "in": { - "description": "Include results that have any of the specified tags (union/OR).", - "items": { - "description": "Include results that have any of the specified tags (union/OR).", - "type": "string" - }, - "type": "array" - }, - "isEmpty": { - "description": "When true, include results that have no tags assigned.\nCan be combined with 'in' for union filtering.\nDefaults to false if not specified.", - "type": "boolean" - } - }, - "required": [ - "in" - ], - "type": "object" - }, - "targetDate": { - "additionalProperties": false, - "properties": { - "presence": { - "description": "Only return content items by whether a target date is set: `present`\nreturns only dated items, `absent` only undated ones.", - "enum": [ - "absent", - "present" - ], - "type": "string" - }, - "range": { - "additionalProperties": false, - "properties": { - "end": { - "description": "Include results with dates equal to or before\nthe specified date", - "type": "string" - }, - "start": { - "description": "Include results with dates equal to or after\nthe specified date", - "type": "string" - } - }, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - } -} - removed
Input schema / properties / payload / properties / filter / requiredRemoved value: -[] - removed
Input schema / properties / payload / properties / filter / typeRemoved value: -"object" - added
Input schema / properties / payload / properties / sort / $refAdded value: +"#/$defs/sort" - removed
Input schema / properties / payload / properties / sort / descriptionRemoved value: -"Sorting to apply, each entry breaking ties in the one before it. Defaults to\nnewest first. A pagination cursor is only valid for the sort that produced\nit, so reset `after` to null whenever the sort changes." - removed
Input schema / properties / payload / properties / sort / itemsRemoved value: -{ - "additionalProperties": false, - "properties": { - "direction": { - "description": "The direction to sort by.", - "enum": [ - "asc", - "desc" - ], - "type": "string" - }, - "field": { - "description": "The field to sort by.", - "enum": [ - "targetDate", - "createdAt" - ], - "type": "string" - } - }, - "required": [ - "direction", - "field" - ], - "type": "object" -} - removed
Input schema / properties / payload / properties / sort / typeRemoved value: -"array" - added
Input schema / properties / sort / $refAdded value: +"#/$defs/sort" - removed
Input schema / properties / sort / descriptionRemoved value: -"Sorting to apply, each entry breaking ties in the one before it. Defaults to\nnewest first. A pagination cursor is only valid for the sort that produced\nit, so reset `after` to null whenever the sort changes." - removed
Input schema / properties / sort / itemsRemoved value: -{ - "additionalProperties": false, - "properties": { - "direction": { - "description": "The direction to sort by.", - "enum": [ - "asc", - "desc" - ], - "type": "string" - }, - "field": { - "description": "The field to sort by.", - "enum": [ - "targetDate", - "createdAt" - ], - "type": "string" - } - }, - "required": [ - "direction", - "field" - ], - "type": "object" -} - removed
Input schema / properties / sort / typeRemoved value: -"array"
- Changed
get_daily_posting_limits9 fields changed- added
Input schema / $defsAdded value: +{ + "channelIds": { + "description": "List of channel IDs to check limits for. All channels must belong to the same organization.", + "items": { + "description": "List of channel IDs to check limits for. All channels must belong to the same organization.", + "type": "string" + }, + "type": "array" + } +} - added
Input schema / properties / channelIds / $refAdded value: +"#/$defs/channelIds" - removed
Input schema / properties / channelIds / descriptionRemoved value: -"List of channel IDs to check limits for. All channels must belong to the same organization." - removed
Input schema / properties / channelIds / itemsRemoved value: -{ - "description": "List of channel IDs to check limits for. All channels must belong to the same organization.", - "type": "string" -} - removed
Input schema / properties / channelIds / typeRemoved value: -"array" - added
Input schema / properties / payload / properties / channelIds / $refAdded value: +"#/$defs/channelIds" - removed
Input schema / properties / payload / properties / channelIds / descriptionRemoved value: -"List of channel IDs to check limits for. All channels must belong to the same organization." - removed
Input schema / properties / payload / properties / channelIds / itemsRemoved value: -{ - "description": "List of channel IDs to check limits for. All channels must belong to the same organization.", - "type": "string" -} - removed
Input schema / properties / payload / properties / channelIds / typeRemoved value: -"array"
- Changed
get_ideas21 fields changed- added
Input schema / $defsAdded value: +{ + "groupFilter": { + "additionalProperties": false, + "properties": { + "groups": { + "description": "Return only ideas that belong to these specific groups (union/OR).", + "items": { + "description": "Return only ideas that belong to these specific groups (union/OR).", + "type": "string" + }, + "type": "array" + }, + "membership": { + "description": "Return ideas by a group-membership bucket rather than by specific group IDs.", + "enum": [ + "grouped", + "ungrouped" + ], + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "tagsFilter": { + "additionalProperties": false, + "properties": { + "in": { + "description": "Include results that have any of the specified tags (union/OR).", + "items": { + "description": "Include results that have any of the specified tags (union/OR).", + "type": "string" + }, + "type": "array" + }, + "isEmpty": { + "description": "When true, include results that have no tags assigned.\nCan be combined with 'in' for union filtering.\nDefaults to false if not specified.", + "type": "boolean" + } + }, + "required": [ + "in" + ], + "type": "object" + } +} - added
Input schema / properties / groupFilter / $refAdded value: +"#/$defs/groupFilter" - removed
Input schema / properties / groupFilter / additionalPropertiesRemoved value: -false - removed
Input schema / properties / groupFilter / propertiesRemoved value: -{ - "groups": { - "description": "Return only ideas that belong to these specific groups (union/OR).", - "items": { - "description": "Return only ideas that belong to these specific groups (union/OR).", - "type": "string" - }, - "type": "array" - }, - "membership": { - "description": "Return ideas by a group-membership bucket rather than by specific group IDs.", - "enum": [ - "grouped", - "ungrouped" - ], - "type": "string" - } -} - removed
Input schema / properties / groupFilter / requiredRemoved value: -[] - removed
Input schema / properties / groupFilter / typeRemoved value: -"object" - added
Input schema / properties / payload / properties / groupFilter / $refAdded value: +"#/$defs/groupFilter" - removed
Input schema / properties / payload / properties / groupFilter / additionalPropertiesRemoved value: -false - removed
Input schema / properties / payload / properties / groupFilter / propertiesRemoved value: -{ - "groups": { - "description": "Return only ideas that belong to these specific groups (union/OR).", - "items": { - "description": "Return only ideas that belong to these specific groups (union/OR).", - "type": "string" - }, - "type": "array" - }, - "membership": { - "description": "Return ideas by a group-membership bucket rather than by specific group IDs.", - "enum": [ - "grouped", - "ungrouped" - ], - "type": "string" - } -} - removed
Input schema / properties / payload / properties / groupFilter / requiredRemoved value: -[] - removed
Input schema / properties / payload / properties / groupFilter / typeRemoved value: -"object" - added
Input schema / properties / payload / properties / tagsFilter / $refAdded value: +"#/$defs/tagsFilter" - removed
Input schema / properties / payload / properties / tagsFilter / additionalPropertiesRemoved value: -false - removed
Input schema / properties / payload / properties / tagsFilter / propertiesRemoved value: -{ - "in": { - "description": "Include results that have any of the specified tags (union/OR).", - "items": { - "description": "Include results that have any of the specified tags (union/OR).", - "type": "string" - }, - "type": "array" - }, - "isEmpty": { - "description": "When true, include results that have no tags assigned.\nCan be combined with 'in' for union filtering.\nDefaults to false if not specified.", - "type": "boolean" - } -} - removed
Input schema / properties / payload / properties / tagsFilter / requiredRemoved value: -[ - "in" -] - removed
Input schema / properties / payload / properties / tagsFilter / typeRemoved value: -"object" - added
Input schema / properties / tagsFilter / $refAdded value: +"#/$defs/tagsFilter" - removed
Input schema / properties / tagsFilter / additionalPropertiesRemoved value: -false - removed
Input schema / properties / tagsFilter / propertiesRemoved value: -{ - "in": { - "description": "Include results that have any of the specified tags (union/OR).", - "items": { - "description": "Include results that have any of the specified tags (union/OR).", - "type": "string" - }, - "type": "array" - }, - "isEmpty": { - "description": "When true, include results that have no tags assigned.\nCan be combined with 'in' for union filtering.\nDefaults to false if not specified.", - "type": "boolean" - } -} - removed
Input schema / properties / tagsFilter / requiredRemoved value: -[ - "in" -] - removed
Input schema / properties / tagsFilter / typeRemoved value: -"object"
- Changed
get_post_templates11 fields changed- added
Input schema / $defsAdded value: +{ + "filter": { + "additionalProperties": false, + "properties": { + "visibility": { + "description": "Narrow the result to a single visibility scope. Omit to receive the\nunion of: public templates, internal templates from the supplied\norganization, and private templates from the actor's account.", + "enum": [ + "internal", + "private", + "public" + ], + "type": "string" + } + }, + "required": [], + "type": "object" + } +} - added
Input schema / properties / filter / $refAdded value: +"#/$defs/filter" - removed
Input schema / properties / filter / additionalPropertiesRemoved value: -false - removed
Input schema / properties / filter / propertiesRemoved value: -{ - "visibility": { - "description": "Narrow the result to a single visibility scope. Omit to receive the\nunion of: public templates, internal templates from the supplied\norganization, and private templates from the actor's account.", - "enum": [ - "internal", - "private", - "public" - ], - "type": "string" - } -} - removed
Input schema / properties / filter / requiredRemoved value: -[] - removed
Input schema / properties / filter / typeRemoved value: -"object" - added
Input schema / properties / payload / properties / filter / $refAdded value: +"#/$defs/filter" - removed
Input schema / properties / payload / properties / filter / additionalPropertiesRemoved value: -false - removed
Input schema / properties / payload / properties / filter / propertiesRemoved value: -{ - "visibility": { - "description": "Narrow the result to a single visibility scope. Omit to receive the\nunion of: public templates, internal templates from the supplied\norganization, and private templates from the actor's account.", - "enum": [ - "internal", - "private", - "public" - ], - "type": "string" - } -} - removed
Input schema / properties / payload / properties / filter / requiredRemoved value: -[] - removed
Input schema / properties / payload / properties / filter / typeRemoved value: -"object"
- Changed
get_posts19 fields changed- added
Input schema / $defsAdded value: +{ + "dueAt": { + "additionalProperties": false, + "properties": { + "end": { + "description": "Include results with dates equal to or before\nthe specified date", + "type": "string" + }, + "start": { + "description": "Include results with dates equal to or after\nthe specified date", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "filter": { + "additionalProperties": false, + "properties": { + "channelIds": { + "description": "When set, it will filter posts by channel", + "items": { + "description": "When set, it will filter posts by channel", + "type": "string" + }, + "type": "array" + }, + "createdAt": { + "$ref": "#/$defs/dueAt" + }, + "dueAt": { + "$ref": "#/$defs/dueAt" + }, + "dueAtPresence": { + "description": "When set, it will filter posts by whether their scheduled posting date exists.\n`absent` cannot be combined with `dueAt`, because absent dates cannot also match a date range.", + "enum": [ + "absent", + "present" + ], + "type": "string" + }, + "endDate": { + "description": "When set, it will return posts with createdAt or dueAt date before endDate", + "type": "string" + }, + "postTypes": { + "description": "When set, it will filter posts by format.\n\n`post` is a fallback bucket rather than one stored format: it matches every\npost the other formats do not claim, which is what `Post.metadata.type`\nreports for the same post. `carousel` and `thread` are rejected, because no\nstored value resolves to them.", + "items": { + "description": "When set, it will filter posts by format.\n\n`post` is a fallback bucket rather than one stored format: it matches every\npost the other formats do not claim, which is what `Post.metadata.type`\nreports for the same post. `carousel` and `thread` are rejected, because no\nstored value resolves to them.", + "enum": [ + "carousel", + "event", + "ghost_post", + "offer", + "post", + "reel", + "short", + "story", + "thread", + "whats_new" + ], + "type": "string" + }, + "type": "array" + }, + "startDate": { + "description": "When set, it will return posts with createdAt or dueAt date after startDate", + "type": "string" + }, + "status": { + "description": "When set, it will filter posts by status", + "items": { + "description": "When set, it will filter posts by status", + "enum": [ + "draft", + "error", + "needs_approval", + "scheduled", + "sending", + "sent" + ], + "type": "string" + }, + "type": "array" + }, + "tagIds": { + "description": "When set, it will filter posts by tag", + "items": { + "description": "When set, it will filter posts by tag", + "type": "string" + }, + "type": "array" + }, + "tags": { + "additionalProperties": false, + "properties": { + "in": { + "description": "Include results that have any of the specified tags (union/OR).", + "items": { + "description": "Include results that have any of the specified tags (union/OR).", + "type": "string" + }, + "type": "array" + }, + "isEmpty": { + "description": "When true, include results that have no tags assigned.\nCan be combined with 'in' for union filtering.\nDefaults to false if not specified.", + "type": "boolean" + } + }, + "required": [ + "in" + ], + "type": "object" + } + }, + "required": [], + "type": "object" + }, + "sort": { + "description": "The sort to apply to the posts results", + "items": { + "additionalProperties": false, + "properties": { + "direction": { + "description": "The direction to sort by.", + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, + "field": { + "description": "The field to sort by.", + "enum": [ + "dueAt", + "createdAt" + ], + "type": "string" + } + }, + "required": [ + "direction", + "field" + ], + "type": "object" + }, + "type": "array" + } +} - added
Input schema / properties / filter / $refAdded value: +"#/$defs/filter" - removed
Input schema / properties / filter / additionalPropertiesRemoved value: -false - removed
Input schema / properties / filter / propertiesRemoved value: -{ - "channelIds": { - "description": "When set, it will filter posts by channel", - "items": { - "description": "When set, it will filter posts by channel", - "type": "string" - }, - "type": "array" - }, - "createdAt": { - "additionalProperties": false, - "properties": { - "end": { - "description": "Include results with dates equal to or before\nthe specified date", - "type": "string" - }, - "start": { - "description": "Include results with dates equal to or after\nthe specified date", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "dueAt": { - "additionalProperties": false, - "properties": { - "end": { - "description": "Include results with dates equal to or before\nthe specified date", - "type": "string" - }, - "start": { - "description": "Include results with dates equal to or after\nthe specified date", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "dueAtPresence": { - "description": "When set, it will filter posts by whether their scheduled posting date exists.\n`absent` cannot be combined with `dueAt`, because absent dates cannot also match a date range.", - "enum": [ - "absent", - "present" - ], - "type": "string" - }, - "endDate": { - "description": "When set, it will return posts with createdAt or dueAt date before endDate", - "type": "string" - }, - "postTypes": { - "description": "When set, it will filter posts by format.\n\n`post` is a fallback bucket rather than one stored format: it matches every\npost the other formats do not claim, which is what `Post.metadata.type`\nreports for the same post. `carousel` and `thread` are rejected, because no\nstored value resolves to them.", - "items": { - "description": "When set, it will filter posts by format.\n\n`post` is a fallback bucket rather than one stored format: it matches every\npost the other formats do not claim, which is what `Post.metadata.type`\nreports for the same post. `carousel` and `thread` are rejected, because no\nstored value resolves to them.", - "enum": [ - "carousel", - "event", - "ghost_post", - "offer", - "post", - "reel", - "short", - "story", - "thread", - "whats_new" - ], - "type": "string" - }, - "type": "array" - }, - "startDate": { - "description": "When set, it will return posts with createdAt or dueAt date after startDate", - "type": "string" - }, - "status": { - "description": "When set, it will filter posts by status", - "items": { - "description": "When set, it will filter posts by status", - "enum": [ - "draft", - "error", - "needs_approval", - "scheduled", - "sending", - "sent" - ], - "type": "string" - }, - "type": "array" - }, - "tagIds": { - "description": "When set, it will filter posts by tag", - "items": { - "description": "When set, it will filter posts by tag", - "type": "string" - }, - "type": "array" - }, - "tags": { - "additionalProperties": false, - "properties": { - "in": { - "description": "Include results that have any of the specified tags (union/OR).", - "items": { - "description": "Include results that have any of the specified tags (union/OR).", - "type": "string" - }, - "type": "array" - }, - "isEmpty": { - "description": "When true, include results that have no tags assigned.\nCan be combined with 'in' for union filtering.\nDefaults to false if not specified.", - "type": "boolean" - } - }, - "required": [ - "in" - ], - "type": "object" - } -} - removed
Input schema / properties / filter / requiredRemoved value: -[] - removed
Input schema / properties / filter / typeRemoved value: -"object" - added
Input schema / properties / payload / properties / filter / $refAdded value: +"#/$defs/filter" - removed
Input schema / properties / payload / properties / filter / additionalPropertiesRemoved value: -false - removed
Input schema / properties / payload / properties / filter / propertiesRemoved value: -{ - "channelIds": { - "description": "When set, it will filter posts by channel", - "items": { - "description": "When set, it will filter posts by channel", - "type": "string" - }, - "type": "array" - }, - "createdAt": { - "additionalProperties": false, - "properties": { - "end": { - "description": "Include results with dates equal to or before\nthe specified date", - "type": "string" - }, - "start": { - "description": "Include results with dates equal to or after\nthe specified date", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "dueAt": { - "additionalProperties": false, - "properties": { - "end": { - "description": "Include results with dates equal to or before\nthe specified date", - "type": "string" - }, - "start": { - "description": "Include results with dates equal to or after\nthe specified date", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "dueAtPresence": { - "description": "When set, it will filter posts by whether their scheduled posting date exists.\n`absent` cannot be combined with `dueAt`, because absent dates cannot also match a date range.", - "enum": [ - "absent", - "present" - ], - "type": "string" - }, - "endDate": { - "description": "When set, it will return posts with createdAt or dueAt date before endDate", - "type": "string" - }, - "postTypes": { - "description": "When set, it will filter posts by format.\n\n`post` is a fallback bucket rather than one stored format: it matches every\npost the other formats do not claim, which is what `Post.metadata.type`\nreports for the same post. `carousel` and `thread` are rejected, because no\nstored value resolves to them.", - "items": { - "description": "When set, it will filter posts by format.\n\n`post` is a fallback bucket rather than one stored format: it matches every\npost the other formats do not claim, which is what `Post.metadata.type`\nreports for the same post. `carousel` and `thread` are rejected, because no\nstored value resolves to them.", - "enum": [ - "carousel", - "event", - "ghost_post", - "offer", - "post", - "reel", - "short", - "story", - "thread", - "whats_new" - ], - "type": "string" - }, - "type": "array" - }, - "startDate": { - "description": "When set, it will return posts with createdAt or dueAt date after startDate", - "type": "string" - }, - "status": { - "description": "When set, it will filter posts by status", - "items": { - "description": "When set, it will filter posts by status", - "enum": [ - "draft", - "error", - "needs_approval", - "scheduled", - "sending", - "sent" - ], - "type": "string" - }, - "type": "array" - }, - "tagIds": { - "description": "When set, it will filter posts by tag", - "items": { - "description": "When set, it will filter posts by tag", - "type": "string" - }, - "type": "array" - }, - "tags": { - "additionalProperties": false, - "properties": { - "in": { - "description": "Include results that have any of the specified tags (union/OR).", - "items": { - "description": "Include results that have any of the specified tags (union/OR).", - "type": "string" - }, - "type": "array" - }, - "isEmpty": { - "description": "When true, include results that have no tags assigned.\nCan be combined with 'in' for union filtering.\nDefaults to false if not specified.", - "type": "boolean" - } - }, - "required": [ - "in" - ], - "type": "object" - } -} - removed
Input schema / properties / payload / properties / filter / requiredRemoved value: -[] - removed
Input schema / properties / payload / properties / filter / typeRemoved value: -"object" - added
Input schema / properties / payload / properties / sort / $refAdded value: +"#/$defs/sort" - removed
Input schema / properties / payload / properties / sort / descriptionRemoved value: -"The sort to apply to the posts results" - removed
Input schema / properties / payload / properties / sort / itemsRemoved value: -{ - "additionalProperties": false, - "properties": { - "direction": { - "description": "The direction to sort by.", - "enum": [ - "asc", - "desc" - ], - "type": "string" - }, - "field": { - "description": "The field to sort by.", - "enum": [ - "dueAt", - "createdAt" - ], - "type": "string" - } - }, - "required": [ - "direction", - "field" - ], - "type": "object" -} - removed
Input schema / properties / payload / properties / sort / typeRemoved value: -"array" - added
Input schema / properties / sort / $refAdded value: +"#/$defs/sort" - removed
Input schema / properties / sort / descriptionRemoved value: -"The sort to apply to the posts results" - removed
Input schema / properties / sort / itemsRemoved value: -{ - "additionalProperties": false, - "properties": { - "direction": { - "description": "The direction to sort by.", - "enum": [ - "asc", - "desc" - ], - "type": "string" - }, - "field": { - "description": "The field to sort by.", - "enum": [ - "dueAt", - "createdAt" - ], - "type": "string" - } - }, - "required": [ - "direction", - "field" - ], - "type": "object" -} - removed
Input schema / properties / sort / typeRemoved value: -"array"
- Changed
get_tags_v211 fields changed- added
Input schema / $defsAdded value: +{ + "filter": { + "additionalProperties": false, + "properties": { + "isLocked": { + "description": "Return only locked tags when true, only unlocked tags when false. Omit to\nreturn both. See `Tag.isLocked` for what locking means.", + "type": "boolean" + } + }, + "required": [], + "type": "object" + } +} - added
Input schema / properties / filter / $refAdded value: +"#/$defs/filter" - removed
Input schema / properties / filter / additionalPropertiesRemoved value: -false - removed
Input schema / properties / filter / propertiesRemoved value: -{ - "isLocked": { - "description": "Return only locked tags when true, only unlocked tags when false. Omit to\nreturn both. See `Tag.isLocked` for what locking means.", - "type": "boolean" - } -} - removed
Input schema / properties / filter / requiredRemoved value: -[] - removed
Input schema / properties / filter / typeRemoved value: -"object" - added
Input schema / properties / payload / properties / filter / $refAdded value: +"#/$defs/filter" - removed
Input schema / properties / payload / properties / filter / additionalPropertiesRemoved value: -false - removed
Input schema / properties / payload / properties / filter / propertiesRemoved value: -{ - "isLocked": { - "description": "Return only locked tags when true, only unlocked tags when false. Omit to\nreturn both. See `Tag.isLocked` for what locking means.", - "type": "boolean" - } -} - removed
Input schema / properties / payload / properties / filter / requiredRemoved value: -[] - removed
Input schema / properties / payload / properties / filter / typeRemoved value: -"object"
- Changed
graphql_mutation1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true for this exact user-requested Buffer mutation."New value: +"Set true only when the user asked for exactly this action."
- Changed
move_post_in_queue1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true for this exact user-requested Buffer mutation."New value: +"Set true only when the user asked for exactly this action."
- Changed
promote_content_item_draft_to_posts18 fields changed- added
Input schema / $defsAdded value: +{ + "button": { + "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", + "enum": [ + "book", + "call", + "learn_more", + "none", + "order", + "shop", + "signup" + ], + "type": "string" + }, + "linkAttachment": { + "additionalProperties": false, + "properties": { + "description": { + "description": "Description shown on the link card", + "type": "string" + }, + "thumbnail": { + "additionalProperties": false, + "properties": { + "url": { + "description": "URL of the thumbnail image", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "title": { + "description": "Title shown on the link card", + "type": "string" + }, + "url": { + "description": "URL that the link asset has been built from", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "posts": { + "description": "The channel-specific posts to create, one per channel. Provide at least\none post, and at most one post per channel.", + "items": { + "additionalProperties": false, + "properties": { + "aiAssisted": { + "description": "If this post was created with the help of AI", + "type": "boolean" + }, + "assets": { + "description": "Ordered list of assets on this post.", + "items": { + "additionalProperties": false, + "properties": { + "document": { + "additionalProperties": false, + "properties": { + "thumbnailUrl": { + "description": "Document thumbnail URL", + "type": "string" + }, + "title": { + "description": "Document title", + "type": "string" + }, + "url": { + "description": "Document URL", + "type": "string" + } + }, + "required": [ + "thumbnailUrl", + "title", + "url" + ], + "type": "object" + }, + "image": { + "additionalProperties": false, + "properties": { + "metadata": { + "additionalProperties": false, + "properties": { + "altText": { + "description": "Alternative text for accessibility", + "type": "string" + }, + "animatedThumbnail": { + "description": "Animated thumbnail URL", + "type": "string" + }, + "dimensions": { + "additionalProperties": false, + "properties": { + "height": { + "description": "Image height in pixels", + "type": "integer" + }, + "width": { + "description": "Image width in pixels", + "type": "integer" + } + }, + "required": [ + "height", + "width" + ], + "type": "object" + }, + "userTags": { + "description": "Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput.", + "items": { + "additionalProperties": false, + "properties": { + "handle": { + "description": "The handle (username) of the account to tag, without the leading @.", + "type": "string" + }, + "x": { + "description": "Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width.", + "type": "number" + }, + "y": { + "description": "Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height.", + "type": "number" + } + }, + "required": [ + "handle", + "x", + "y" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "altText" + ], + "type": "object" + }, + "thumbnailUrl": { + "description": "URL to the static thumbnail of the asset", + "type": "string" + }, + "url": { + "description": "URL to the file source", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "link": { + "additionalProperties": false, + "properties": { + "description": { + "description": "Description of the link", + "type": "string" + }, + "thumbnailUrl": { + "description": "Thumbnail URL of the link", + "type": "string" + }, + "title": { + "description": "Title of the link", + "type": "string" + }, + "url": { + "description": "URL to the link", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "video": { + "additionalProperties": false, + "properties": { + "metadata": { + "additionalProperties": false, + "properties": { + "thumbnailOffset": { + "description": "Offset of the thumbnail chosen for the video, in ms", + "type": "integer" + }, + "title": { + "description": "Video title", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "thumbnailUrl": { + "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", + "type": "string" + }, + "url": { + "description": "URL to the file source", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + } + }, + "required": [], + "type": "object" + }, + "type": "array" + }, + "channelId": { + "description": "Channel's Id for which we want to create the post", + "type": "string" + }, + "draftId": { + "description": "Is set when the Post is generated from a Draft", + "type": "string" + }, + "dueAt": { + "description": "Date when the post is scheduled to be published", + "type": "string" + }, + "ideaId": { + "description": "Is set when the Post is generated from an Idea", + "type": "string" + }, + "metadata": { + "additionalProperties": false, + "properties": { + "bluesky": { + "additionalProperties": false, + "properties": { + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + }, + "thread": { + "$ref": "#/$defs/thread" + } + }, + "required": [], + "type": "object" + }, + "facebook": { + "additionalProperties": false, + "properties": { + "annotations": { + "description": "Annotations representing entities in the text", + "items": { + "additionalProperties": false, + "properties": { + "content": { + "description": "The content of the annotation, e.g. '107509875938399'", + "type": "string" + }, + "indices": { + "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", + "items": { + "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", + "type": "integer" + }, + "type": "array" + }, + "text": { + "description": "The text representation of the annotation, eg 'Buffer'", + "type": "string" + }, + "url": { + "description": "The URL the annotation points to, e.g. https://www.facebook.com/107509875938399", + "type": "string" + } + }, + "required": [ + "content", + "indices", + "text", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "firstComment": { + "description": "Facebook post's first comment", + "type": "string" + }, + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + }, + "type": { + "description": "The channel-specific type of the post, eg, post, story, reel for Facebook", + "enum": [ + "post", + "reel", + "story" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "google": { + "additionalProperties": false, + "properties": { + "detailsEvent": { + "additionalProperties": false, + "properties": { + "button": { + "$ref": "#/$defs/button" + }, + "endDate": { + "description": "End date of the event. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "isFullDayEvent": { + "description": "Indicate whether the event has a start or end time.", + "type": "boolean" + }, + "link": { + "description": "Link to the action", + "type": "string" + }, + "startDate": { + "description": "Start date of the event. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "title": { + "description": "Title of the event. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + } + }, + "required": [ + "isFullDayEvent" + ], + "type": "object" + }, + "detailsOffer": { + "additionalProperties": false, + "properties": { + "code": { + "description": "Coupon code for the offer", + "type": "string" + }, + "endDate": { + "description": "End date of the offer. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "link": { + "description": "Link to the offer", + "type": "string" + }, + "startDate": { + "description": "Start date of the offer. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "terms": { + "description": "Terms and Conditions", + "type": "string" + }, + "title": { + "description": "Title of the offer. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "detailsWhatsNew": { + "additionalProperties": false, + "properties": { + "button": { + "$ref": "#/$defs/button" + }, + "link": { + "description": "Link to the action", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "title": { + "description": "Title if available in the given GBP post type: event and offer", + "type": "string" + }, + "type": { + "description": "The channel-specific type of the post, eg, post, offer, event for Google Business Profile", + "enum": [ + "event", + "offer", + "whats_new" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "instagram": { + "additionalProperties": false, + "properties": { + "firstComment": { + "description": "Instagram post's first comment", + "type": "string" + }, + "geolocation": { + "additionalProperties": false, + "properties": { + "id": { + "description": "The id of this location", + "type": "string" + }, + "text": { + "description": "The name of this location", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "isAiGenerated": { + "description": "Whether the post discloses AI-generated content", + "type": "boolean" + }, + "link": { + "description": "Shop Grid link for the post", + "type": "string" + }, + "shouldShareToFeed": { + "description": "Indicates whether post should be shared to feed", + "type": "boolean" + }, + "stickerFields": { + "additionalProperties": false, + "properties": { + "music": { + "description": "Placeholder text for the post's music", + "type": "string" + }, + "other": { + "description": "Additional field for any other post content", + "type": "string" + }, + "products": { + "description": "Placeholder text for the post's linked products", + "type": "string" + }, + "text": { + "description": "Text for the Story or Reel", + "type": "string" + }, + "topics": { + "description": "Placeholder text for the post's topics (Reels only)", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "type": { + "description": "The channel-specific type of the post, eg, post, story, reel for Instagram", + "enum": [ + "carousel", + "event", + "ghost_post", + "offer", + "post", + "reel", + "short", + "story", + "thread", + "whats_new" + ], + "type": "string" + } + }, + "required": [ + "shouldShareToFeed", + "type" + ], + "type": "object" + }, + "linkedin": { + "additionalProperties": false, + "properties": { + "annotations": { + "description": "Annotations representing entities in the text", + "items": { + "additionalProperties": false, + "properties": { + "entity": { + "description": "The entity of the annotation, e.g. urn:li:organization:1521226", + "type": "string" + }, + "id": { + "description": "The id of the annotation, e.g. 1521226", + "type": "string" + }, + "length": { + "description": "The length of the annotation, e.g. 6", + "type": "integer" + }, + "link": { + "description": "The link of the annotation, e.g. https://www.linkedin.com/company/bufferapp", + "type": "string" + }, + "localizedName": { + "description": "The localized name of the annotation, e.g. Buffer", + "type": "string" + }, + "start": { + "description": "The start of the annotation, e.g. 5", + "type": "integer" + }, + "vanityName": { + "description": "The vanity name of the annotation, e.g. bufferapp", + "type": "string" + } + }, + "required": [ + "id", + "entity", + "length", + "link", + "localizedName", + "start", + "vanityName" + ], + "type": "object" + }, + "type": "array" + }, + "firstComment": { + "description": "LinkedIn post's first comment", + "type": "string" + }, + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + } + }, + "required": [], + "type": "object" + }, + "mastodon": { + "additionalProperties": false, + "properties": { + "spoilerText": { + "description": "Spoiler text hiding the root text of this post", + "type": "string" + }, + "thread": { + "$ref": "#/$defs/thread" + } + }, + "required": [], + "type": "object" + }, + "pinterest": { + "additionalProperties": false, + "properties": { + "boardServiceId": { + "description": "The board ID of the Pin, can be obtained when fetching the channel details with the following query:\n```\nquery GetChannelWithSubprofiles {\n channel(input: { id: \"[CHANNEL_ID_HERE]\" }) {\n metadata {\n ... on PinterestMetadata {\n boards {\n serviceId\n }\n }\n }\n }\n}\n```\nRequired on create; optional on edit (omitted preserves existing board).", + "type": "string" + }, + "title": { + "description": "The title of the Pin", + "type": "string" + }, + "url": { + "description": "The Pin destination link", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "substack": { + "additionalProperties": false, + "properties": { + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + } + }, + "required": [], + "type": "object" + }, + "threads": { + "additionalProperties": false, + "properties": { + "linkAttachment": { + "$ref": "#/$defs/linkAttachment" + }, + "locationId": { + "description": "LocationId associated with the post", + "type": "string" + }, + "locationName": { + "description": "Location name associated with the post", + "type": "string" + }, + "thread": { + "$ref": "#/$defs/thread" + }, + "topic": { + "description": "Topic associated with the post", + "type": "string" + }, + "type": { + "description": "The type of the post", + "enum": [ + "carousel", + "event", + "ghost_post", + "offer", + "post", + "reel", + "short", + "story", + "thread", + "whats_new" + ], + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "tiktok": { + "additionalProperties": false, + "properties": { + "isAiGenerated": { + "description": "Whether the post discloses AI-generated content (TikTok video only)", + "type": "boolean" + }, + "title": { + "description": "The title of the TikTok post (for photo posts)", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "twitter": { + "additionalProperties": false, + "properties": { + "isAiGenerated": { + "description": "Whether the post discloses AI-generated content (original tweets only, never retweets)", + "type": "boolean" + }, + "retweet": { + "additionalProperties": false, + "properties": { + "comment": { + "description": "Optional user comment shown above the embedded retweet", + "type": "string" + }, + "id": { + "description": "Retweet ID", + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "thread": { + "$ref": "#/$defs/thread" + } + }, + "required": [], + "type": "object" + }, + "youtube": { + "additionalProperties": false, + "properties": { + "categoryId": { + "description": "Youtube Category ID, one ID of this list:\nID: 1 -> Film & Animation\nID: 2 -> Autos & Vehicles\nID: 10 -> Music\nID: 15 -> Pets & Animals\nID: 17 -> Sports\nID: 19 -> Travel & Events\nID: 20 -> Gaming\nID: 22 -> People & Blogs\nID: 23 -> Comedy\nID: 24 -> Entertainment\nID: 25 -> News & Politics\nID: 26 -> Howto & Style\nID: 27 -> Education\nID: 28 -> Science & Technology\nID: 29 -> Nonprofits & Activism\n\nRequired on create; optional on edit (omitted preserves existing value).", + "type": "string" + }, + "embeddable": { + "description": "Indicates whether the video allows embedding (default: true)", + "type": "boolean" + }, + "isAiGenerated": { + "description": "Whether the post discloses AI-generated content", + "type": "boolean" + }, + "license": { + "description": "Video license (default: youtube)", + "enum": [ + "creativeCommon", + "youtube" + ], + "type": "string" + }, + "madeForKids": { + "description": "Indicates whether the video is suitable for kids (default: false)", + "type": "boolean" + }, + "notifySubscribers": { + "description": "Indicates whether to notify subscribers on publish video (default: true)", + "type": "boolean" + }, + "privacy": { + "description": "Privacy setting for post (default: public)", + "enum": [ + "private", + "public", + "unlisted" + ], + "type": "string" + }, + "title": { + "description": "Title of the Youtube post. Required on create; optional on edit (omitted preserves existing value).", + "type": "string" + } + }, + "required": [], + "type": "object" + } + }, + "required": [], + "type": "object" + }, + "mode": { + "description": "How the post is being scheduled.", + "enum": [ + "addToQueue", + "customScheduled", + "shareNext", + "shareNow" + ], + "type": "string" + }, + "needsApproval": { + "description": "Submit the post for approval instead of scheduling it. A post submitted for\napproval is always a draft, so this conflicts with turning `saveToDraft` off.\n\nOnly valid when your posting policy on the target channel requires approval.", + "type": "boolean" + }, + "saveToDraft": { + "description": "If true, saves the post as a draft instead of scheduling it.\nWhen saving as draft:\n- Post status will be 'draft' instead of 'buffer'\n- Posting limits are not checked\n- The post will not be published until explicitly scheduled", + "type": "boolean" + }, + "schedulingType": { + "description": "Scheduling type to indicate notification publishing or automatic publishing", + "enum": [ + "automatic", + "notification" + ], + "type": "string" + }, + "source": { + "description": "source where the composer was initiated from, used for tracking.", + "type": "string" + }, + "tagIds": { + "description": "List of tag IDs", + "items": { + "description": "List of tag IDs", + "type": "string" + }, + "type": "array" + }, + "text": { + "description": "Text content of the Post.\n\nNote: for threaded posts, this needs to match the first item in the `thread` array.", + "type": "string" + } + }, + "required": [ + "channelId", + "mode", + "schedulingType" + ], + "type": "object" + }, + "type": "array" + }, + "tagIds": { + "description": "Tags to apply to this content item. Omit to keep the current tags. An\nempty list or null removes them all.", + "items": { + "description": "Tags to apply to this content item. Omit to keep the current tags. An\nempty list or null removes them all.", + "type": "string" + }, + "type": "array" + }, + "thread": { + "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", + "items": { + "additionalProperties": false, + "properties": { + "assets": { + "description": "Ordered list of assets on this threaded post", + "items": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "type": "array" + }, + "metadata": { + "additionalProperties": false, + "properties": {}, + "required": [], + "type": "object" + }, + "text": { + "description": "The text body content of the threaded post", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "type": "array" + } +} - changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true for this exact user-requested Buffer mutation."New value: +"Set true only when the user asked for exactly this action." - added
Input schema / properties / payload / properties / posts / $refAdded value: +"#/$defs/posts" - removed
Input schema / properties / payload / properties / posts / descriptionRemoved value: -"The channel-specific posts to create, one per channel. Provide at least\none post, and at most one post per channel." - removed
Input schema / properties / payload / properties / posts / itemsRemoved value: -{ - "additionalProperties": false, - "properties": { - "aiAssisted": { - "description": "If this post was created with the help of AI", - "type": "boolean" - }, - "assets": { - "description": "Ordered list of assets on this post.", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "altText": { - "description": "Alternative text for accessibility", - "type": "string" - }, - "animatedThumbnail": { - "description": "Animated thumbnail URL", - "type": "string" - }, - "dimensions": { - "additionalProperties": false, - "properties": { - "height": { - "description": "Image height in pixels", - "type": "integer" - }, - "width": { - "description": "Image width in pixels", - "type": "integer" - } - }, - "required": [ - "height", - "width" - ], - "type": "object" - }, - "userTags": { - "description": "Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput.", - "items": { - "additionalProperties": false, - "properties": { - "handle": { - "description": "The handle (username) of the account to tag, without the leading @.", - "type": "string" - }, - "x": { - "description": "Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width.", - "type": "number" - }, - "y": { - "description": "Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height.", - "type": "number" - } - }, - "required": [ - "handle", - "x", - "y" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "altText" - ], - "type": "object" - }, - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "thumbnailOffset": { - "description": "Offset of the thumbnail chosen for the video, in ms", - "type": "integer" - }, - "title": { - "description": "Video title", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "channelId": { - "description": "Channel's Id for which we want to create the post", - "type": "string" - }, - "draftId": { - "description": "Is set when the Post is generated from a Draft", - "type": "string" - }, - "dueAt": { - "description": "Date when the post is scheduled to be published", - "type": "string" - }, - "ideaId": { - "description": "Is set when the Post is generated from an Idea", - "type": "string" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "facebook": { - "additionalProperties": false, - "properties": { - "annotations": { - "description": "Annotations representing entities in the text", - "items": { - "additionalProperties": false, - "properties": { - "content": { - "description": "The content of the annotation, e.g. '107509875938399'", - "type": "string" - }, - "indices": { - "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", - "items": { - "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", - "type": "integer" - }, - "type": "array" - }, - "text": { - "description": "The text representation of the annotation, eg 'Buffer'", - "type": "string" - }, - "url": { - "description": "The URL the annotation points to, e.g. https://www.facebook.com/107509875938399", - "type": "string" - } - }, - "required": [ - "content", - "indices", - "text", - "url" - ], - "type": "object" - }, - "type": "array" - }, - "firstComment": { - "description": "Facebook post's first comment", - "type": "string" - }, - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, story, reel for Facebook", - "enum": [ - "post", - "reel", - "story" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "google": { - "additionalProperties": false, - "properties": { - "detailsEvent": { - "additionalProperties": false, - "properties": { - "button": { - "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", - "enum": [ - "book", - "call", - "learn_more", - "none", - "order", - "shop", - "signup" - ], - "type": "string" - }, - "endDate": { - "description": "End date of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "isFullDayEvent": { - "description": "Indicate whether the event has a start or end time.", - "type": "boolean" - }, - "link": { - "description": "Link to the action", - "type": "string" - }, - "startDate": { - "description": "Start date of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "title": { - "description": "Title of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [ - "isFullDayEvent" - ], - "type": "object" - }, - "detailsOffer": { - "additionalProperties": false, - "properties": { - "code": { - "description": "Coupon code for the offer", - "type": "string" - }, - "endDate": { - "description": "End date of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "link": { - "description": "Link to the offer", - "type": "string" - }, - "startDate": { - "description": "Start date of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "terms": { - "description": "Terms and Conditions", - "type": "string" - }, - "title": { - "description": "Title of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "detailsWhatsNew": { - "additionalProperties": false, - "properties": { - "button": { - "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", - "enum": [ - "book", - "call", - "learn_more", - "none", - "order", - "shop", - "signup" - ], - "type": "string" - }, - "link": { - "description": "Link to the action", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "title": { - "description": "Title if available in the given GBP post type: event and offer", - "type": "string" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, offer, event for Google Business Profile", - "enum": [ - "event", - "offer", - "whats_new" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "instagram": { - "additionalProperties": false, - "properties": { - "firstComment": { - "description": "Instagram post's first comment", - "type": "string" - }, - "geolocation": { - "additionalProperties": false, - "properties": { - "id": { - "description": "The id of this location", - "type": "string" - }, - "text": { - "description": "The name of this location", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content", - "type": "boolean" - }, - "link": { - "description": "Shop Grid link for the post", - "type": "string" - }, - "shouldShareToFeed": { - "description": "Indicates whether post should be shared to feed", - "type": "boolean" - }, - "stickerFields": { - "additionalProperties": false, - "properties": { - "music": { - "description": "Placeholder text for the post's music", - "type": "string" - }, - "other": { - "description": "Additional field for any other post content", - "type": "string" - }, - "products": { - "description": "Placeholder text for the post's linked products", - "type": "string" - }, - "text": { - "description": "Text for the Story or Reel", - "type": "string" - }, - "topics": { - "description": "Placeholder text for the post's topics (Reels only)", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, story, reel for Instagram", - "enum": [ - "carousel", - "event", - "ghost_post", - "offer", - "post", - "reel", - "short", - "story", - "thread", - "whats_new" - ], - "type": "string" - } - }, - "required": [ - "shouldShareToFeed", - "type" - ], - "type": "object" - }, - "linkedin": { - "additionalProperties": false, - "properties": { - "annotations": { - "description": "Annotations representing entities in the text", - "items": { - "additionalProperties": false, - "properties": { - "entity": { - "description": "The entity of the annotation, e.g. urn:li:organization:1521226", - "type": "string" - }, - "id": { - "description": "The id of the annotation, e.g. 1521226", - "type": "string" - }, - "length": { - "description": "The length of the annotation, e.g. 6", - "type": "integer" - }, - "link": { - "description": "The link of the annotation, e.g. https://www.linkedin.com/company/bufferapp", - "type": "string" - }, - "localizedName": { - "description": "The localized name of the annotation, e.g. Buffer", - "type": "string" - }, - "start": { - "description": "The start of the annotation, e.g. 5", - "type": "integer" - }, - "vanityName": { - "description": "The vanity name of the annotation, e.g. bufferapp", - "type": "string" - } - }, - "required": [ - "id", - "entity", - "length", - "link", - "localizedName", - "start", - "vanityName" - ], - "type": "object" - }, - "type": "array" - }, - "firstComment": { - "description": "LinkedIn post's first comment", - "type": "string" - }, - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "mastodon": { - "additionalProperties": false, - "properties": { - "spoilerText": { - "description": "Spoiler text hiding the root text of this post", - "type": "string" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "pinterest": { - "additionalProperties": false, - "properties": { - "boardServiceId": { - "description": "The board ID of the Pin, can be obtained when fetching the channel details with the following query:\n```\nquery GetChannelWithSubprofiles {\n channel(input: { id: \"[CHANNEL_ID_HERE]\" }) {\n metadata {\n ... on PinterestMetadata {\n boards {\n serviceId\n }\n }\n }\n }\n}\n```\nRequired on create; optional on edit (omitted preserves existing board).", - "type": "string" - }, - "title": { - "description": "The title of the Pin", - "type": "string" - }, - "url": { - "description": "The Pin destination link", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "substack": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "locationId": { - "description": "LocationId associated with the post", - "type": "string" - }, - "locationName": { - "description": "Location name associated with the post", - "type": "string" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "topic": { - "description": "Topic associated with the post", - "type": "string" - }, - "type": { - "description": "The type of the post", - "enum": [ - "carousel", - "event", - "ghost_post", - "offer", - "post", - "reel", - "short", - "story", - "thread", - "whats_new" - ], - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "tiktok": { - "additionalProperties": false, - "properties": { - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content (TikTok video only)", - "type": "boolean" - }, - "title": { - "description": "The title of the TikTok post (for photo posts)", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "twitter": { - "additionalProperties": false, - "properties": { - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content (original tweets only, never retweets)", - "type": "boolean" - }, - "retweet": { - "additionalProperties": false, - "properties": { - "comment": { - "description": "Optional user comment shown above the embedded retweet", - "type": "string" - }, - "id": { - "description": "Retweet ID", - "type": "string" - } - }, - "required": [ - "id" - ], - "type": "object" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "youtube": { - "additionalProperties": false, - "properties": { - "categoryId": { - "description": "Youtube Category ID, one ID of this list:\nID: 1 -> Film & Animation\nID: 2 -> Autos & Vehicles\nID: 10 -> Music\nID: 15 -> Pets & Animals\nID: 17 -> Sports\nID: 19 -> Travel & Events\nID: 20 -> Gaming\nID: 22 -> People & Blogs\nID: 23 -> Comedy\nID: 24 -> Entertainment\nID: 25 -> News & Politics\nID: 26 -> Howto & Style\nID: 27 -> Education\nID: 28 -> Science & Technology\nID: 29 -> Nonprofits & Activism\n\nRequired on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "embeddable": { - "description": "Indicates whether the video allows embedding (default: true)", - "type": "boolean" - }, - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content", - "type": "boolean" - }, - "license": { - "description": "Video license (default: youtube)", - "enum": [ - "creativeCommon", - "youtube" - ], - "type": "string" - }, - "madeForKids": { - "description": "Indicates whether the video is suitable for kids (default: false)", - "type": "boolean" - }, - "notifySubscribers": { - "description": "Indicates whether to notify subscribers on publish video (default: true)", - "type": "boolean" - }, - "privacy": { - "description": "Privacy setting for post (default: public)", - "enum": [ - "private", - "public", - "unlisted" - ], - "type": "string" - }, - "title": { - "description": "Title of the Youtube post. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "mode": { - "description": "How the post is being scheduled.", - "enum": [ - "addToQueue", - "customScheduled", - "shareNext", - "shareNow" - ], - "type": "string" - }, - "needsApproval": { - "description": "Submit the post for approval instead of scheduling it. A post submitted for\napproval is always a draft, so this conflicts with turning `saveToDraft` off.\n\nOnly valid when your posting policy on the target channel requires approval.", - "type": "boolean" - }, - "saveToDraft": { - "description": "If true, saves the post as a draft instead of scheduling it.\nWhen saving as draft:\n- Post status will be 'draft' instead of 'buffer'\n- Posting limits are not checked\n- The post will not be published until explicitly scheduled", - "type": "boolean" - }, - "schedulingType": { - "description": "Scheduling type to indicate notification publishing or automatic publishing", - "enum": [ - "automatic", - "notification" - ], - "type": "string" - }, - "source": { - "description": "source where the composer was initiated from, used for tracking.", - "type": "string" - }, - "tagIds": { - "description": "List of tag IDs", - "items": { - "description": "List of tag IDs", - "type": "string" - }, - "type": "array" - }, - "text": { - "description": "Text content of the Post.\n\nNote: for threaded posts, this needs to match the first item in the `thread` array.", - "type": "string" - } - }, - "required": [ - "channelId", - "mode", - "schedulingType" - ], - "type": "object" -} - removed
Input schema / properties / payload / properties / posts / typeRemoved value: -"array" - added
Input schema / properties / payload / properties / tagIds / $refAdded value: +"#/$defs/tagIds" - removed
Input schema / properties / payload / properties / tagIds / descriptionRemoved value: -"Tags to apply to this content item. Omit to keep the current tags. An\nempty list or null removes them all." - removed
Input schema / properties / payload / properties / tagIds / itemsRemoved value: -{ - "description": "Tags to apply to this content item. Omit to keep the current tags. An\nempty list or null removes them all.", - "type": "string" -} - removed
Input schema / properties / payload / properties / tagIds / typeRemoved value: -"array" - added
Input schema / properties / posts / $refAdded value: +"#/$defs/posts" - removed
Input schema / properties / posts / descriptionRemoved value: -"The channel-specific posts to create, one per channel. Provide at least\none post, and at most one post per channel." - removed
Input schema / properties / posts / itemsRemoved value: -{ - "additionalProperties": false, - "properties": { - "aiAssisted": { - "description": "If this post was created with the help of AI", - "type": "boolean" - }, - "assets": { - "description": "Ordered list of assets on this post.", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "altText": { - "description": "Alternative text for accessibility", - "type": "string" - }, - "animatedThumbnail": { - "description": "Animated thumbnail URL", - "type": "string" - }, - "dimensions": { - "additionalProperties": false, - "properties": { - "height": { - "description": "Image height in pixels", - "type": "integer" - }, - "width": { - "description": "Image width in pixels", - "type": "integer" - } - }, - "required": [ - "height", - "width" - ], - "type": "object" - }, - "userTags": { - "description": "Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput.", - "items": { - "additionalProperties": false, - "properties": { - "handle": { - "description": "The handle (username) of the account to tag, without the leading @.", - "type": "string" - }, - "x": { - "description": "Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width.", - "type": "number" - }, - "y": { - "description": "Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height.", - "type": "number" - } - }, - "required": [ - "handle", - "x", - "y" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "altText" - ], - "type": "object" - }, - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "thumbnailOffset": { - "description": "Offset of the thumbnail chosen for the video, in ms", - "type": "integer" - }, - "title": { - "description": "Video title", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "channelId": { - "description": "Channel's Id for which we want to create the post", - "type": "string" - }, - "draftId": { - "description": "Is set when the Post is generated from a Draft", - "type": "string" - }, - "dueAt": { - "description": "Date when the post is scheduled to be published", - "type": "string" - }, - "ideaId": { - "description": "Is set when the Post is generated from an Idea", - "type": "string" - }, - "metadata": { - "additionalProperties": false, - "properties": { - "bluesky": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "facebook": { - "additionalProperties": false, - "properties": { - "annotations": { - "description": "Annotations representing entities in the text", - "items": { - "additionalProperties": false, - "properties": { - "content": { - "description": "The content of the annotation, e.g. '107509875938399'", - "type": "string" - }, - "indices": { - "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", - "items": { - "description": "The indices of the annotation in the text, e.g. [6, 9] (from 6 to 9 characters in the text)", - "type": "integer" - }, - "type": "array" - }, - "text": { - "description": "The text representation of the annotation, eg 'Buffer'", - "type": "string" - }, - "url": { - "description": "The URL the annotation points to, e.g. https://www.facebook.com/107509875938399", - "type": "string" - } - }, - "required": [ - "content", - "indices", - "text", - "url" - ], - "type": "object" - }, - "type": "array" - }, - "firstComment": { - "description": "Facebook post's first comment", - "type": "string" - }, - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, story, reel for Facebook", - "enum": [ - "post", - "reel", - "story" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "google": { - "additionalProperties": false, - "properties": { - "detailsEvent": { - "additionalProperties": false, - "properties": { - "button": { - "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", - "enum": [ - "book", - "call", - "learn_more", - "none", - "order", - "shop", - "signup" - ], - "type": "string" - }, - "endDate": { - "description": "End date of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "isFullDayEvent": { - "description": "Indicate whether the event has a start or end time.", - "type": "boolean" - }, - "link": { - "description": "Link to the action", - "type": "string" - }, - "startDate": { - "description": "Start date of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "title": { - "description": "Title of the event. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [ - "isFullDayEvent" - ], - "type": "object" - }, - "detailsOffer": { - "additionalProperties": false, - "properties": { - "code": { - "description": "Coupon code for the offer", - "type": "string" - }, - "endDate": { - "description": "End date of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "link": { - "description": "Link to the offer", - "type": "string" - }, - "startDate": { - "description": "Start date of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "terms": { - "description": "Terms and Conditions", - "type": "string" - }, - "title": { - "description": "Title of the offer. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "detailsWhatsNew": { - "additionalProperties": false, - "properties": { - "button": { - "description": "Action button. Optional: a post with no button, or `none`, publishes without a call-to-action. On edit, omitting it preserves the existing value.", - "enum": [ - "book", - "call", - "learn_more", - "none", - "order", - "shop", - "signup" - ], - "type": "string" - }, - "link": { - "description": "Link to the action", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "title": { - "description": "Title if available in the given GBP post type: event and offer", - "type": "string" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, offer, event for Google Business Profile", - "enum": [ - "event", - "offer", - "whats_new" - ], - "type": "string" - } - }, - "required": [ - "type" - ], - "type": "object" - }, - "instagram": { - "additionalProperties": false, - "properties": { - "firstComment": { - "description": "Instagram post's first comment", - "type": "string" - }, - "geolocation": { - "additionalProperties": false, - "properties": { - "id": { - "description": "The id of this location", - "type": "string" - }, - "text": { - "description": "The name of this location", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content", - "type": "boolean" - }, - "link": { - "description": "Shop Grid link for the post", - "type": "string" - }, - "shouldShareToFeed": { - "description": "Indicates whether post should be shared to feed", - "type": "boolean" - }, - "stickerFields": { - "additionalProperties": false, - "properties": { - "music": { - "description": "Placeholder text for the post's music", - "type": "string" - }, - "other": { - "description": "Additional field for any other post content", - "type": "string" - }, - "products": { - "description": "Placeholder text for the post's linked products", - "type": "string" - }, - "text": { - "description": "Text for the Story or Reel", - "type": "string" - }, - "topics": { - "description": "Placeholder text for the post's topics (Reels only)", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": { - "description": "The channel-specific type of the post, eg, post, story, reel for Instagram", - "enum": [ - "carousel", - "event", - "ghost_post", - "offer", - "post", - "reel", - "short", - "story", - "thread", - "whats_new" - ], - "type": "string" - } - }, - "required": [ - "shouldShareToFeed", - "type" - ], - "type": "object" - }, - "linkedin": { - "additionalProperties": false, - "properties": { - "annotations": { - "description": "Annotations representing entities in the text", - "items": { - "additionalProperties": false, - "properties": { - "entity": { - "description": "The entity of the annotation, e.g. urn:li:organization:1521226", - "type": "string" - }, - "id": { - "description": "The id of the annotation, e.g. 1521226", - "type": "string" - }, - "length": { - "description": "The length of the annotation, e.g. 6", - "type": "integer" - }, - "link": { - "description": "The link of the annotation, e.g. https://www.linkedin.com/company/bufferapp", - "type": "string" - }, - "localizedName": { - "description": "The localized name of the annotation, e.g. Buffer", - "type": "string" - }, - "start": { - "description": "The start of the annotation, e.g. 5", - "type": "integer" - }, - "vanityName": { - "description": "The vanity name of the annotation, e.g. bufferapp", - "type": "string" - } - }, - "required": [ - "id", - "entity", - "length", - "link", - "localizedName", - "start", - "vanityName" - ], - "type": "object" - }, - "type": "array" - }, - "firstComment": { - "description": "LinkedIn post's first comment", - "type": "string" - }, - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "mastodon": { - "additionalProperties": false, - "properties": { - "spoilerText": { - "description": "Spoiler text hiding the root text of this post", - "type": "string" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "pinterest": { - "additionalProperties": false, - "properties": { - "boardServiceId": { - "description": "The board ID of the Pin, can be obtained when fetching the channel details with the following query:\n```\nquery GetChannelWithSubprofiles {\n channel(input: { id: \"[CHANNEL_ID_HERE]\" }) {\n metadata {\n ... on PinterestMetadata {\n boards {\n serviceId\n }\n }\n }\n }\n}\n```\nRequired on create; optional on edit (omitted preserves existing board).", - "type": "string" - }, - "title": { - "description": "The title of the Pin", - "type": "string" - }, - "url": { - "description": "The Pin destination link", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "substack": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "threads": { - "additionalProperties": false, - "properties": { - "linkAttachment": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description shown on the link card", - "type": "string" - }, - "thumbnail": { - "additionalProperties": false, - "properties": { - "url": { - "description": "URL of the thumbnail image", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "title": { - "description": "Title shown on the link card", - "type": "string" - }, - "url": { - "description": "URL that the link asset has been built from", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "locationId": { - "description": "LocationId associated with the post", - "type": "string" - }, - "locationName": { - "description": "Location name associated with the post", - "type": "string" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "topic": { - "description": "Topic associated with the post", - "type": "string" - }, - "type": { - "description": "The type of the post", - "enum": [ - "carousel", - "event", - "ghost_post", - "offer", - "post", - "reel", - "short", - "story", - "thread", - "whats_new" - ], - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "tiktok": { - "additionalProperties": false, - "properties": { - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content (TikTok video only)", - "type": "boolean" - }, - "title": { - "description": "The title of the TikTok post (for photo posts)", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "twitter": { - "additionalProperties": false, - "properties": { - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content (original tweets only, never retweets)", - "type": "boolean" - }, - "retweet": { - "additionalProperties": false, - "properties": { - "comment": { - "description": "Optional user comment shown above the embedded retweet", - "type": "string" - }, - "id": { - "description": "Retweet ID", - "type": "string" - } - }, - "required": [ - "id" - ], - "type": "object" - }, - "thread": { - "description": "The ordered list of posts that make up the thread (not paginated). This\narray is the source of truth for what gets published: every post in the\nthread, including the root post, must be provided here. Posts are\npublished in order, each replying to the previous one. The first item is\nthe root post and should match the top-level `text` on the post input.", - "items": { - "additionalProperties": false, - "properties": { - "assets": { - "description": "Ordered list of assets on this threaded post", - "items": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "type": "array" - }, - "metadata": { - "additionalProperties": false, - "properties": {}, - "required": [], - "type": "object" - }, - "text": { - "description": "The text body content of the threaded post", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - } - }, - "required": [], - "type": "object" - }, - "youtube": { - "additionalProperties": false, - "properties": { - "categoryId": { - "description": "Youtube Category ID, one ID of this list:\nID: 1 -> Film & Animation\nID: 2 -> Autos & Vehicles\nID: 10 -> Music\nID: 15 -> Pets & Animals\nID: 17 -> Sports\nID: 19 -> Travel & Events\nID: 20 -> Gaming\nID: 22 -> People & Blogs\nID: 23 -> Comedy\nID: 24 -> Entertainment\nID: 25 -> News & Politics\nID: 26 -> Howto & Style\nID: 27 -> Education\nID: 28 -> Science & Technology\nID: 29 -> Nonprofits & Activism\n\nRequired on create; optional on edit (omitted preserves existing value).", - "type": "string" - }, - "embeddable": { - "description": "Indicates whether the video allows embedding (default: true)", - "type": "boolean" - }, - "isAiGenerated": { - "description": "Whether the post discloses AI-generated content", - "type": "boolean" - }, - "license": { - "description": "Video license (default: youtube)", - "enum": [ - "creativeCommon", - "youtube" - ], - "type": "string" - }, - "madeForKids": { - "description": "Indicates whether the video is suitable for kids (default: false)", - "type": "boolean" - }, - "notifySubscribers": { - "description": "Indicates whether to notify subscribers on publish video (default: true)", - "type": "boolean" - }, - "privacy": { - "description": "Privacy setting for post (default: public)", - "enum": [ - "private", - "public", - "unlisted" - ], - "type": "string" - }, - "title": { - "description": "Title of the Youtube post. Required on create; optional on edit (omitted preserves existing value).", - "type": "string" - } - }, - "required": [], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "mode": { - "description": "How the post is being scheduled.", - "enum": [ - "addToQueue", - "customScheduled", - "shareNext", - "shareNow" - ], - "type": "string" - }, - "needsApproval": { - "description": "Submit the post for approval instead of scheduling it. A post submitted for\napproval is always a draft, so this conflicts with turning `saveToDraft` off.\n\nOnly valid when your posting policy on the target channel requires approval.", - "type": "boolean" - }, - "saveToDraft": { - "description": "If true, saves the post as a draft instead of scheduling it.\nWhen saving as draft:\n- Post status will be 'draft' instead of 'buffer'\n- Posting limits are not checked\n- The post will not be published until explicitly scheduled", - "type": "boolean" - }, - "schedulingType": { - "description": "Scheduling type to indicate notification publishing or automatic publishing", - "enum": [ - "automatic", - "notification" - ], - "type": "string" - }, - "source": { - "description": "source where the composer was initiated from, used for tracking.", - "type": "string" - }, - "tagIds": { - "description": "List of tag IDs", - "items": { - "description": "List of tag IDs", - "type": "string" - }, - "type": "array" - }, - "text": { - "description": "Text content of the Post.\n\nNote: for threaded posts, this needs to match the first item in the `thread` array.", - "type": "string" - } - }, - "required": [ - "channelId", - "mode", - "schedulingType" - ], - "type": "object" -} - removed
Input schema / properties / posts / typeRemoved value: -"array" - added
Input schema / properties / tagIds / $refAdded value: +"#/$defs/tagIds" - removed
Input schema / properties / tagIds / descriptionRemoved value: -"Tags to apply to this content item. Omit to keep the current tags. An\nempty list or null removes them all." - removed
Input schema / properties / tagIds / itemsRemoved value: -{ - "description": "Tags to apply to this content item. Omit to keep the current tags. An\nempty list or null removes them all.", - "type": "string" -} - removed
Input schema / properties / tagIds / typeRemoved value: -"array"
- Changed
remove_post_from_content_item1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true for this exact user-requested Buffer mutation."New value: +"Set true only when the user asked for exactly this action."
- Changed
update_content_item1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true for this exact user-requested Buffer mutation."New value: +"Set true only when the user asked for exactly this action."
- Changed
update_content_item_draft26 fields changed- added
Input schema / $defsAdded value: +{ + "draft": { + "additionalProperties": false, + "properties": { + "aiAssisted": { + "description": "Set to true when the draft content was written with the help of AI.", + "type": "boolean" + }, + "assets": { + "description": "Images, videos, or documents to attach to the draft, in display order.", + "items": { + "additionalProperties": false, + "properties": { + "document": { + "additionalProperties": false, + "properties": { + "thumbnailUrl": { + "description": "Document thumbnail URL", + "type": "string" + }, + "title": { + "description": "Document title", + "type": "string" + }, + "url": { + "description": "Document URL", + "type": "string" + } + }, + "required": [ + "thumbnailUrl", + "title", + "url" + ], + "type": "object" + }, + "image": { + "additionalProperties": false, + "properties": { + "metadata": { + "additionalProperties": false, + "properties": { + "altText": { + "description": "Alternative text for accessibility", + "type": "string" + }, + "animatedThumbnail": { + "description": "Animated thumbnail URL", + "type": "string" + }, + "dimensions": { + "additionalProperties": false, + "properties": { + "height": { + "description": "Image height in pixels", + "type": "integer" + }, + "width": { + "description": "Image width in pixels", + "type": "integer" + } + }, + "required": [ + "height", + "width" + ], + "type": "object" + }, + "userTags": { + "description": "Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput.", + "items": { + "additionalProperties": false, + "properties": { + "handle": { + "description": "The handle (username) of the account to tag, without the leading @.", + "type": "string" + }, + "x": { + "description": "Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width.", + "type": "number" + }, + "y": { + "description": "Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height.", + "type": "number" + } + }, + "required": [ + "handle", + "x", + "y" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "altText" + ], + "type": "object" + }, + "thumbnailUrl": { + "description": "URL to the static thumbnail of the asset", + "type": "string" + }, + "url": { + "description": "URL to the file source", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "link": { + "additionalProperties": false, + "properties": { + "description": { + "description": "Description of the link", + "type": "string" + }, + "thumbnailUrl": { + "description": "Thumbnail URL of the link", + "type": "string" + }, + "title": { + "description": "Title of the link", + "type": "string" + }, + "url": { + "description": "URL to the link", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + "video": { + "additionalProperties": false, + "properties": { + "metadata": { + "additionalProperties": false, + "properties": { + "thumbnailOffset": { + "description": "Offset of the thumbnail chosen for the video, in ms", + "type": "integer" + }, + "title": { + "description": "Video title", + "type": "string" + } + }, + "required": [], + "type": "object" + }, + "thumbnailUrl": { + "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", + "type": "string" + }, + "url": { + "description": "URL to the file source", + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + } + }, + "required": [], + "type": "object" + }, + "type": "array" + }, + "text": { + "description": "The written content of the draft. Can be empty when the draft holds at\nleast one asset.", + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + }, + "tagIds": { + "description": "Tags to apply to this content item. Omit to keep the current tags. An\nempty list or null removes them all.", + "items": { + "description": "Tags to apply to this content item. Omit to keep the current tags. An\nempty list or null removes them all.", + "type": "string" + }, + "type": "array" + }, + "targetDate": { + "description": "Date indicating when this piece of content should go out. This is a\nplanning aid only and does not schedule any posts. Omit to preserve the\nexisting target date. Null clears it.", + "type": "string" + } +} - changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true for this exact user-requested Buffer mutation."New value: +"Set true only when the user asked for exactly this action." - added
Input schema / properties / draft / $refAdded value: +"#/$defs/draft" - removed
Input schema / properties / draft / additionalPropertiesRemoved value: -false - removed
Input schema / properties / draft / propertiesRemoved value: -{ - "aiAssisted": { - "description": "Set to true when the draft content was written with the help of AI.", - "type": "boolean" - }, - "assets": { - "description": "Images, videos, or documents to attach to the draft, in display order.", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "altText": { - "description": "Alternative text for accessibility", - "type": "string" - }, - "animatedThumbnail": { - "description": "Animated thumbnail URL", - "type": "string" - }, - "dimensions": { - "additionalProperties": false, - "properties": { - "height": { - "description": "Image height in pixels", - "type": "integer" - }, - "width": { - "description": "Image width in pixels", - "type": "integer" - } - }, - "required": [ - "height", - "width" - ], - "type": "object" - }, - "userTags": { - "description": "Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput.", - "items": { - "additionalProperties": false, - "properties": { - "handle": { - "description": "The handle (username) of the account to tag, without the leading @.", - "type": "string" - }, - "x": { - "description": "Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width.", - "type": "number" - }, - "y": { - "description": "Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height.", - "type": "number" - } - }, - "required": [ - "handle", - "x", - "y" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "altText" - ], - "type": "object" - }, - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "thumbnailOffset": { - "description": "Offset of the thumbnail chosen for the video, in ms", - "type": "integer" - }, - "title": { - "description": "Video title", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "text": { - "description": "The written content of the draft. Can be empty when the draft holds at\nleast one asset.", - "type": "string" - } -} - removed
Input schema / properties / draft / requiredRemoved value: -[ - "text" -] - removed
Input schema / properties / draft / typeRemoved value: -"object" - added
Input schema / properties / payload / properties / draft / $refAdded value: +"#/$defs/draft" - removed
Input schema / properties / payload / properties / draft / additionalPropertiesRemoved value: -false - removed
Input schema / properties / payload / properties / draft / propertiesRemoved value: -{ - "aiAssisted": { - "description": "Set to true when the draft content was written with the help of AI.", - "type": "boolean" - }, - "assets": { - "description": "Images, videos, or documents to attach to the draft, in display order.", - "items": { - "additionalProperties": false, - "properties": { - "document": { - "additionalProperties": false, - "properties": { - "thumbnailUrl": { - "description": "Document thumbnail URL", - "type": "string" - }, - "title": { - "description": "Document title", - "type": "string" - }, - "url": { - "description": "Document URL", - "type": "string" - } - }, - "required": [ - "thumbnailUrl", - "title", - "url" - ], - "type": "object" - }, - "image": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "altText": { - "description": "Alternative text for accessibility", - "type": "string" - }, - "animatedThumbnail": { - "description": "Animated thumbnail URL", - "type": "string" - }, - "dimensions": { - "additionalProperties": false, - "properties": { - "height": { - "description": "Image height in pixels", - "type": "integer" - }, - "width": { - "description": "Image width in pixels", - "type": "integer" - } - }, - "required": [ - "height", - "width" - ], - "type": "object" - }, - "userTags": { - "description": "Accounts to tag at specific points on the image. Each tag's x/y position uses normalized 0.0-1.0 coordinates - see UserTagInput.", - "items": { - "additionalProperties": false, - "properties": { - "handle": { - "description": "The handle (username) of the account to tag, without the leading @.", - "type": "string" - }, - "x": { - "description": "Horizontal position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image width from the left edge (0.5 is the horizontal center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel X by the image width.", - "type": "number" - }, - "y": { - "description": "Vertical position of the tag as a normalized decimal float between 0.0 and 1.0 - the fraction of the image height from the top edge (0.5 is the vertical center). Pass a number, not a string, and do not use pixel coordinates; to convert, divide the pixel Y by the image height.", - "type": "number" - } - }, - "required": [ - "handle", - "x", - "y" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "altText" - ], - "type": "object" - }, - "thumbnailUrl": { - "description": "URL to the static thumbnail of the asset", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "link": { - "additionalProperties": false, - "properties": { - "description": { - "description": "Description of the link", - "type": "string" - }, - "thumbnailUrl": { - "description": "Thumbnail URL of the link", - "type": "string" - }, - "title": { - "description": "Title of the link", - "type": "string" - }, - "url": { - "description": "URL to the link", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - }, - "video": { - "additionalProperties": false, - "properties": { - "metadata": { - "additionalProperties": false, - "properties": { - "thumbnailOffset": { - "description": "Offset of the thumbnail chosen for the video, in ms", - "type": "integer" - }, - "title": { - "description": "Video title", - "type": "string" - } - }, - "required": [], - "type": "object" - }, - "thumbnailUrl": { - "description": "Do not use: social networks do not accept custom video thumbnail images, and\nthe API rejects video assets that set this field. To choose the video\nthumbnail, set `metadata.thumbnailOffset` to select a frame from the video\n(supported for Instagram, TikTok, and Pinterest only).", - "type": "string" - }, - "url": { - "description": "URL to the file source", - "type": "string" - } - }, - "required": [ - "url" - ], - "type": "object" - } - }, - "required": [], - "type": "object" - }, - "type": "array" - }, - "text": { - "description": "The written content of the draft. Can be empty when the draft holds at\nleast one asset.", - "type": "string" - } -} - removed
Input schema / properties / payload / properties / draft / requiredRemoved value: -[ - "text" -] - removed
Input schema / properties / payload / properties / draft / typeRemoved value: -"object" - added
Input schema / properties / payload / properties / tagIds / $refAdded value: +"#/$defs/tagIds" - removed
Input schema / properties / payload / properties / tagIds / descriptionRemoved value: -"Tags to apply to this content item. Omit to keep the current tags. An\nempty list or null removes them all." - removed
Input schema / properties / payload / properties / tagIds / itemsRemoved value: -{ - "description": "Tags to apply to this content item. Omit to keep the current tags. An\nempty list or null removes them all.", - "type": "string" -} - removed
Input schema / properties / payload / properties / tagIds / typeRemoved value: -"array" - added
Input schema / properties / payload / properties / targetDate / $refAdded value: +"#/$defs/targetDate" - removed
Input schema / properties / payload / properties / targetDate / descriptionRemoved value: -"Date indicating when this piece of content should go out. This is a\nplanning aid only and does not schedule any posts. Omit to preserve the\nexisting target date. Null clears it." - removed
Input schema / properties / payload / properties / targetDate / typeRemoved value: -"string" - added
Input schema / properties / tagIds / $refAdded value: +"#/$defs/tagIds" - removed
Input schema / properties / tagIds / descriptionRemoved value: -"Tags to apply to this content item. Omit to keep the current tags. An\nempty list or null removes them all." - removed
Input schema / properties / tagIds / itemsRemoved value: -{ - "description": "Tags to apply to this content item. Omit to keep the current tags. An\nempty list or null removes them all.", - "type": "string" -} - removed
Input schema / properties / tagIds / typeRemoved value: -"array" - added
Input schema / properties / targetDate / $refAdded value: +"#/$defs/targetDate" - removed
Input schema / properties / targetDate / descriptionRemoved value: -"Date indicating when this piece of content should go out. This is a\nplanning aid only and does not schedule any posts. Omit to preserve the\nexisting target date. Null clears it." - removed
Input schema / properties / targetDate / typeRemoved value: -"string"
- Changed
update_post_template1 field changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"Must be true for this exact user-requested Buffer mutation."New value: +"Set true only when the user asked for exactly this action."
41 tool updates
v2.0.0- First observed
add_post_to_content_item - First observed
create_content_item - First observed
create_content_item_draft - First observed
create_idea - First observed
create_post - First observed
create_post_template - First observed
delete_content_item - First observed
delete_post - First observed
delete_post_template - First observed
edit_post - First observed
get_account - First observed
get_aggregated_post_metrics - First observed
get_channel - First observed
get_channels - First observed
get_configuration - First observed
get_content_item - First observed
get_content_items - First observed
get_daily_posting_limits - First observed
get_idea_groups - First observed
get_ideas - First observed
get_instagram_audio - First observed
get_operation_schema - First observed
get_post - First observed
get_post_template - First observed
get_post_templates - First observed
get_posts - First observed
get_search_instagram_audio - First observed
get_tag - First observed
get_tags_v2 - First observed
get_trending_instagram_audio - First observed
graphql_mutation - First observed
graphql_query - First observed
list_accounts - First observed
move_post_in_queue - First observed
preview_operation - First observed
promote_content_item_draft_to_posts - First observed
query_pages - First observed
remove_post_from_content_item - First observed
update_content_item - First observed
update_content_item_draft - First observed
update_post_template
TDQS
Scored across 41 tools
Most resource-specific tools (content items, posts, templates, ideas, audio) are reasonably distinct, though pairs like create_content_item vs create_content_item_draft and update_content_item vs update_content_item_draft require careful reading. The generic escape-hatch tools (graphql_query, graphql_mutation, query_pages, preview_operation, get_operation_schema) heavily overlap with every named tool and with each other, creating real misselection risk.
The surface is overwhelmingly predictable verb_noun snake_case (create_/get_/update_/delete_/list_ + resource), which makes scanning easy. Minor deviations exist: edit_post instead of update_post, the versioned get_tags_v2, and list_accounts vs get_account blur the verb convention slightly.
41 tools is well above the comfortable band for an agent surface, and several are near-duplicates or meta-tools (five GraphQL/validation helpers). While the domain is genuinely broad, the count is heavy enough to dilute selection accuracy and inflate context.
Coverage is strong: full CRUD for content items, posts, and post templates, plus idea creation/listing, tag reads, Instagram audio reads, metrics, and channel/account config. Gaps are minor and mostly read-only areas (no tag create/update/delete, no idea update/delete), which agents can largely work around.
Maintenance
Related MCP Connectors
Post, schedule, and track social posts on X, Bluesky, LinkedIn, Instagram and more from AI agents.
Schedule and publish social posts across 9 platforms (Instagram, LinkedIn, X, TikTok, Facebook, Threads, Pinterest, Bluesky, Mastodon) straight from Claude, ChatGPT, Cursor, or any MCP client. Create, edit, and reschedule posts, upload media, and pull account and post analytics, follower demographics, and best-time windows. 20 tools, free on every plan.
Hosted MCP for Instagram, Facebook, X, LinkedIn, Pinterest, and Ghost. OAuth 2.1, 38 tools.
Connect any AI agent to 11+ social platforms: schedule, publish & track posts via hosted MCP.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to create, schedule, and manage social media posts across 10 platforms via a unified API.-
- AlicenseNot gradedqualityAmaintenanceSocial media scheduling and publishing for AI agents. 17 validation-first tools to post to X, LinkedIn, Instagram, TikTok, YouTube, Reddit, Discord, Telegram, and more through one connected workspace.111 npm96MIT
- AlicenseAqualityDmaintenanceProvides AI agents with unified access to 21 social media platforms and 105 endpoints for retrieving profiles, posts, comments, search results, trending content, and analytics without per-platform authentication.4100 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to draft, schedule, and publish social media content, generate AI text and image variations, analyze performance, and automate social workflows.MIT