Retrieves the authenticated user's account information
Example Response
{
"data": {
"account": {
"id": "...",
"email": "...",
"backupEmail": "...",
"avatar": "..."
}
}
}
Connect Buffer to your agents, automation tools, or build something entirely new.
Retrieves the authenticated user's account information
{
"data": {
"account": {
"id": "...",
"email": "...",
"backupEmail": "...",
"avatar": "..."
}
}
}
Fetches a single channel using the provided ID
| Name | Type | Description |
|---|---|---|
| input Required | ChannelInput! | Query's input. |
{
"data": {
"channel": {
"id": "...",
"allowedActions": [
"backfillChannel"
],
"avatar": "...",
"descriptor": "..."
}
}
}
Fetch all channels for the organization taking into account the current's user permissions
| Name | Type | Description |
|---|---|---|
| input Required | ChannelsInput! | Query's input. |
{
"data": {
"channels": [
{
"id": "...",
"allowedActions": [
"backfillChannel"
],
"avatar": "...",
"descriptor": "..."
}
]
}
}
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.
| Name | Type | Description |
|---|---|---|
| input Required | TagByIdInput! | Identifies the tag to fetch. |
{
"data": {
"tag": {
"id": "...",
"color": "...",
"colorName": "blue",
"isLocked": true
}
}
}
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.
| Name | Type | Description |
|---|---|---|
| after Optional | String | The cursor after which to return results. Cursors are opaque: treat them as a black box and reset to null when the input changes, since a cursor from a different result set produces undefined behavior. |
| first Optional | Int | The number of tags to return, up to 100. |
| input Required | TagsInput! | Identifies the organization whose tags to list, and how to filter them. |
{
"data": {
"tagsV2": {
"edges": [
{
"cursor": "...",
"node": {}
}
],
"pageInfo": {
"endCursor": "...",
"hasNextPage": true,
"hasPreviousPage": true,
"startCursor": "..."
},
"totalCount": 0
}
}
}
Create a tag for an organization.
The name must be unique within the organization; a duplicate is refused with
DuplicateError. Creation is refused with LimitReachedError once the
organization already holds as many tags as its plan allows.
This API is an early preview and can change without a deprecation period.
| Name | Type | Description |
|---|---|---|
| input Required | CreateTagInput! | Identifies the organization to create the tag in, and the name and color to give the tag. |
{
"data": {
"createTag": {}
}
}
Delete a tag.
The tag is removed from every post, idea and content item carrying it; those
items are otherwise untouched. A locked tag can be deleted, and deleting an
unlocked tag frees a slot for the oldest locked one. See Tag.isLocked.
This API is an early preview and can change without a deprecation period.
| Name | Type | Description |
|---|---|---|
| input Required | DeleteTagInput! | Identifies the tag to delete. |
{
"data": {
"deleteTag": {}
}
}
Update a tag's name and color.
Both values are replaced, so send the current value for the one you are not
changing. The new name must still be unique within the organization; a
duplicate is refused with DuplicateError.
A locked tag cannot be edited and the update is refused. See Tag.isLocked.
This API is an early preview and can change without a deprecation period.
| Name | Type | Description |
|---|---|---|
| input Required | UpdateTagInput! | Identifies the tag to update, and the name and color to set on it. |
{
"data": {
"updateTag": {}
}
}
Aggregate normalized post metrics across a filtered post set. Useful for yearly summaries, channel-level rollups, and BI exports without paginating through thousands of posts.
For per-post metrics, use posts(input) or post(input) with a
metrics { … } selection — this query is purely for aggregation.
The result always contains a baseline trio of entries: postCount
(number of matched posts in the window), reactions, and comments.
Posts on networks that don't track reactions or comments contribute 0
to those totals.
Beyond the baseline, additional metric types are returned only when every channel in the filter set supports them. A single-network filter surfaces that network's richer metrics (e.g. impressions, reach, engagementRate on LinkedIn); a mixed-network filter trims the extras to those common to every network in the set.
| Name | Type | Description |
|---|---|---|
| input Required | AggregatedPostMetricsInput! | Query's input: organization, date range, optional channel and tag filters. Date range is capped to 365 days. |
{
"data": {
"aggregatedPostMetrics": {
"metrics": [
{
"description": "...",
"name": "...",
"type": "averageTimeWatched",
"unit": "count"
}
],
"metricsUpdatedAt": "..."
}
}
}
Returns daily posting limit status for the given channels on the specified date.
| Name | Type | Description |
|---|---|---|
| input Required | DailyPostingLimitsInput! | Query's input. |
{
"data": {
"dailyPostingLimits": [
{
"channelId": "...",
"isAtLimit": true,
"limit": 0,
"scheduled": 0
}
]
}
}
Refresh metadata and preview availability for one Instagram audio asset. Requires Facebook Login. Instagram Login channels return ChannelRefreshRequired.
| Name | Type | Description |
|---|---|---|
| input Required | InstagramAudioInput! | Channel and audio asset used to refresh metadata. |
{
"data": {
"instagramAudio": {}
}
}
Fetches a post by PostID for the given organization: first and last can be set for forward pagination using Relay convention
| Name | Type | Description |
|---|---|---|
| input Required | PostInput! | Query's input. |
{
"data": {
"post": {
"id": "...",
"allowedActions": [
"addPostNote"
],
"assets": [
{
"id": "...",
"mimeType": "...",
"source": "...",
"thumbnail": "..."
}
],
"author": {
"id": "...",
"avatar": "...",
"email": "...",
"isDeleted": true
}
}
}
}
Fetches posts for the given organization: first and last can be set for forward pagination using Relay convention
| Name | Type | Description |
|---|---|---|
| after Optional | String | The cursor of the post to start fetching from |
| first Optional | Int | The number of posts to return |
| input Required | PostsInput! | Query's input. |
{
"data": {
"posts": {
"edges": [
{
"cursor": "...",
"node": {}
}
],
"pageInfo": {
"endCursor": "...",
"hasNextPage": true,
"hasPreviousPage": true,
"startCursor": "..."
}
}
}
}
Fetch a single post template by ID. Returns null if not found.
| Name | Type | Description |
|---|---|---|
| input Required | PostTemplateInput! | Input for fetching a single post template. |
{
"data": {
"postTemplate": {
"id": "...",
"body": "...",
"description": "...",
"emoji": "..."
}
}
}
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.
| Name | Type | Description |
|---|---|---|
| after Optional | String | The cursor after which to return results. |
| first Optional | Int | The number of templates to return. |
| input Required | PostTemplatesInput! | Input containing the organization scope and optional filters. |
{
"data": {
"postTemplates": {
"edges": [
{
"cursor": "...",
"node": {}
}
],
"pageInfo": {
"endCursor": "...",
"hasNextPage": true,
"hasPreviousPage": true,
"startCursor": "..."
},
"totalCount": 0
}
}
}
Search Instagram audio for one channel. Requires Facebook Login. Instagram Login channels return ChannelRefreshRequired.
| Name | Type | Description |
|---|---|---|
| input Required | SearchInstagramAudioInput! | Channel, catalog type, and search text. |
{
"data": {
"searchInstagramAudio": {}
}
}
Return Meta trending Instagram audio for one channel. Requires Facebook Login. Instagram Login channels return ChannelRefreshRequired.
| Name | Type | Description |
|---|---|---|
| input Required | TrendingInstagramAudioInput! | Channel and catalog type for Meta trending audio. |
{
"data": {
"trendingInstagramAudio": {}
}
}
Add a post that already exists to a content item. The mutation creates no post. To add a new post, call createPost first.
| Name | Type | Description |
|---|---|---|
| input Required | AddPostToContentItemInput! | Input for addPostToContentItem. |
{
"data": {
"addPostToContentItem": {}
}
}
Create post for channel
| Name | Type | Description |
|---|---|---|
| input Required | CreatePostInput! | The mutation's input |
{
"data": {
"createPost": {}
}
}
Create a post template visible only to the caller (private) or to
the caller's organization (internal).
| Name | Type | Description |
|---|---|---|
| input Required | CreatePostTemplateInput! | Input for creating a post template. |
{
"data": {
"createPostTemplate": {}
}
}
Delete a post by id.
| Name | Type | Description |
|---|---|---|
| input Required | DeletePostInput! | Input for the deletePost mutation. |
{
"data": {
"deletePost": {}
}
}
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).
| Name | Type | Description |
|---|---|---|
| input Required | DeletePostTemplateInput! | Input for deleting a post template. |
{
"data": {
"deletePostTemplate": {}
}
}
Edit post for channel
| Name | Type | Description |
|---|---|---|
| input Required | EditPostInput! | The mutation's input |
{
"data": {
"editPost": {}
}
}
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.
| Name | Type | Description |
|---|---|---|
| input Required | MovePostInQueueInput! | The mutation's input |
{
"data": {
"movePostInQueue": {}
}
}
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.
| Name | Type | Description |
|---|---|---|
| input Required | PromoteContentItemDraftToPostsInput! | Input for promoteContentItemDraftToPosts. |
{
"data": {
"promoteContentItemDraftToPosts": {}
}
}
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.
| Name | Type | Description |
|---|---|---|
| input Required | RemovePostFromContentItemInput! | Input for removePostFromContentItem. |
{
"data": {
"removePostFromContentItem": {}
}
}
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.
| Name | Type | Description |
|---|---|---|
| input Required | UpdateContentItemInput! | Input for updateContentItem. |
{
"data": {
"updateContentItem": {}
}
}
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.
| Name | Type | Description |
|---|---|---|
| input Required | UpdateContentItemDraftInput! | Input for updateContentItemDraft. |
{
"data": {
"updateContentItemDraft": {}
}
}
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).
| Name | Type | Description |
|---|---|---|
| input Required | UpdatePostTemplateInput! | Input for updating a post template. |
{
"data": {
"updatePostTemplate": {}
}
}
Replaces the name and text of a snippet.
| Name | Type | Description |
|---|---|---|
| input Required | UpdateSnippetInput! | Input for updateSnippet. |
{
"data": {
"updateSnippet": {}
}
}
Retrieves idea groups based on the provided input parameters.
| Name | Type | Description |
|---|---|---|
| input Required | IdeaGroupsInput! | Input for retrieving idea groups. |
{
"data": {
"ideaGroups": [
{
"id": "...",
"isLocked": true,
"name": "..."
}
]
}
}
Fetch a paginated list of ideas with optional filtering
| Name | Type | Description |
|---|---|---|
| after Optional | String | Cursor for pagination, marks where to start fetching from |
| first Optional | Int | Maximum number of items to return |
| input Required | IdeasInput! | Filtering criteria for the ideas list |
{
"data": {
"ideas": {
"edges": [
{
"cursor": "...",
"node": {}
}
],
"pageInfo": {
"endCursor": "...",
"hasNextPage": true,
"hasPreviousPage": true,
"startCursor": "..."
}
}
}
}
Create a new idea with the given content and metadata
| Name | Type | Description |
|---|---|---|
| input Required | CreateIdeaInput! | Input to create an idea |
{
"data": {
"createIdea": {}
}
}
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.
| Name | Type | Description |
|---|---|---|
| input Required | ConfigurationInput! | Input for the configuration query. |
{
"data": {
"configuration": {
"channels": [
{
"authorizationStatus": [
{}
],
"channelId": "...",
"channelType": "account",
"content": [
{}
]
}
],
"services": [
{
"channelType": "account",
"content": [
{}
],
"engagement": [
{}
],
"service": "bluesky"
}
]
}
}
}
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.
| Name | Type | Description |
|---|---|---|
| input Required | ContentItemInput! | Input for fetching a single content item. |
{
"data": {
"contentItem": {
"id": "...",
"accountId": "...",
"allowedActions": [
"deleteContentItem"
],
"author": {
"id": "...",
"avatar": "...",
"email": "...",
"isDeleted": true
}
}
}
}
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.
| Name | Type | Description |
|---|---|---|
| after Optional | String | The cursor after which to return results. Cursors are opaque: treat them as a black box and reset to null when the input changes, since a cursor from a different result set produces undefined behavior. |
| first Optional | Int | The number of content items to return, up to 100. |
| input Required | ContentItemsInput! | Input for listing content items. |
{
"data": {
"contentItems": {
"edges": [
{
"cursor": "...",
"node": {}
}
],
"pageInfo": {
"endCursor": "...",
"hasNextPage": true,
"hasPreviousPage": true,
"startCursor": "..."
},
"totalCount": 0
}
}
}
Returns the snippets of an organization, sorted by name. Uses
standard cursor pagination: pass the previous page's pageInfo.endCursor
as after to fetch the next page. Requesting more than 100 snippets
in a single page is rejected. A cursor whose snippet was deleted
reports a BAD_USER_INPUT error. Fetch again from the first page.
| Name | Type | Description |
|---|---|---|
| after Optional | String | The cursor after which to return results. Cursors are opaque: treat them as a black box. |
| first Optional | Int | The number of snippets to return, from 1 to 100. Defaults to 10. |
| input Required | SnippetsInput! | The query input. |
{
"data": {
"snippets": {
"edges": [
{
"cursor": "...",
"node": {}
}
],
"pageInfo": {
"endCursor": "...",
"hasNextPage": true,
"hasPreviousPage": true,
"startCursor": "..."
}
}
}
}
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.
| Name | Type | Description |
|---|---|---|
| input Required | CreateContentItemInput! | Input for createContentItem. |
{
"data": {
"createContentItem": {}
}
}
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.
| Name | Type | Description |
|---|---|---|
| input Required | CreateContentItemDraftInput! | Input for createContentItemDraft. |
{
"data": {
"createContentItemDraft": {}
}
}
Creates a snippet in an organization.
| Name | Type | Description |
|---|---|---|
| input Required | CreateSnippetInput! | Input for createSnippet. |
{
"data": {
"createSnippet": {}
}
}
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.
| Name | Type | Description |
|---|---|---|
| input Required | DeleteContentItemInput! | Input for deleteContentItem. |
{
"data": {
"deleteContentItem": {}
}
}
Deletes a snippet.
| Name | Type | Description |
|---|---|---|
| input Required | DeleteSnippetInput! | Input for deleteSnippet. |
{
"data": {
"deleteSnippet": {}
}
}
Indicates exactly one field must be supplied and this field must not be null.
Locations: INPUT_OBJECT