Blotato

Updated 5 min read
View as Markdown
On this page

Tip: Watch the Blotato launch film on opvs.ai/skills/blotato or view the embedded video player.

Current package: @opvs-ai/blotato v2.1.1 (beta, public, 5 methods) · Upstream: https://backend.blotato.com · Auth: blotato-api-key header (resolved per brand via Settings → Integrations, provider blotato, or BLOTATO_API_KEY).

@opvs-ai/blotato replaces @opvs-ai/vibe-publish (2.1.0+) with a unified social publishing skill across ten platforms: twitter, instagram, linkedin, facebook, tiktok, pinterest, threads, bluesky, youtube, and slack. It adds three read-only lookup and verification methods (listSubaccounts, listPinterestBoards, getPostStatus), optional platform filtering on listAccounts, and full platform target declarations on createPost.

Methods

listAccounts({ platform? })

GET /v2/users/me/accounts

List all connected social media accounts for the authenticated Blotato user. Filter by platform when you already know the target network (twitter, instagram, linkedin, facebook, tiktok, pinterest, threads, bluesky, youtube, slack).

Parameters

Parameter

Type

Required

Description

platform

string

No

Filter connected accounts by platform name.

Example

opvs -w opvs tools call @opvs-ai/blotato listAccounts \
  --input '{"platform":"linkedin"}'

Response

{
  "items": [
    {
      "id": "acc_12345",
      "platform": "linkedin",
      "fullname": "OPVS AI"
    }
  ]
}

Errors

Error

Trigger

Resolution

401 Unauthorized

Missing or invalid blotato-api-key in brand integrations

Save a valid Blotato API key in Settings → Integrations (provider blotato).

400 Bad Request

Unsupported platform string passed

Use one of the 10 supported platform identifiers (twitter, instagram, linkedin, facebook, tiktok, pinterest, threads, bluesky, youtube, slack).

200 [] (empty list)

No social accounts connected in Blotato for that platform

Connect the social account inside the Blotato dashboard before calling createPost.


listSubaccounts({ accountId })

GET /v2/users/me/accounts/{accountId}/subaccounts

List the Facebook Pages, LinkedIn company Pages, YouTube playlists, and Slack channels connected under an account. Pass the returned item id as target.pageId (Facebook, LinkedIn Page), target.playlistIds entry (YouTube), or target.channelId (Slack). Omitting pageId on LinkedIn posts to the personal profile.

Parameters

Parameter

Type

Required

Description

accountId

string

Yes

Account ID returned by listAccounts.

Example

opvs -w opvs tools call @opvs-ai/blotato listSubaccounts \
  --input '{"accountId":"acc_12345"}'

Response

{
  "items": [
    {
      "id": "page_98765",
      "name": "OPVS Company Page"
    }
  ]
}

Errors

Error

Trigger

Resolution

401 Unauthorized

Missing or invalid blotato-api-key

Verify the Blotato key in Settings → Integrations.

404 Not Found

accountId does not exist on this Blotato account

Re-run listAccounts and pass a valid id.

200 [] (empty list)

No Pages, playlists, or channels connected under the account

Connect the Page or channel inside Blotato; empty is not proof that none exist.


listPinterestBoards({ accountId })

GET /v2/social/pinterest/boards

List the boards owned by a connected Pinterest account. Pass the returned id as target.boardId when creating a pin with createPost.

Parameters

Parameter

Type

Required

Description

accountId

string

Yes

Pinterest account ID returned by listAccounts.

Example

opvs -w opvs tools call @opvs-ai/blotato listPinterestBoards \
  --input '{"accountId":"acc_pin_01"}'

Response

{
  "items": [
    {
      "id": "board_4567",
      "name": "Product Launches"
    }
  ]
}

Errors

Error

Trigger

Resolution

401 Unauthorized

Missing or invalid blotato-api-key

Verify the Blotato key in Settings → Integrations.

400 Bad Request

accountId is not a Pinterest account

Call listAccounts with platform: "pinterest" and pass that id.


createPost({ post, scheduledTime?, useNextFreeSlot? })

POST /v2/posts

Create and optionally schedule a social media post. post.content is an object (text, mediaUrls, platform, and optional additionalPosts for threads on twitter, bluesky, and threads). post.target is a per-platform object (targetType plus platform-specific fields such as pageId, boardId, channelId, mediaType, title, privacyStatus, trial: { graduationStrategy }, TikTok disclosure flags, and YouTube isMadeForKids / containsSyntheticMedia).

Parameters

Parameter

Type

Required

Description

post

object

Yes

{ accountId, content: { text, mediaUrls[], platform, additionalPosts? }, target: { targetType, ... } }.

scheduledTime

string

No

ISO 8601 timestamp for scheduled publishing (e.g. 2026-11-15T14:00:00Z).

useNextFreeSlot

boolean

No

Schedule into the account's next open Blotato queue slot.

Example

opvs -w opvs tools call @opvs-ai/blotato createPost \
  --input '{
    "post": {
      "accountId": "acc_12345",
      "content": {
        "text": "Give your agent the publishing job.",
        "mediaUrls": [],
        "platform": "linkedin"
      },
      "target": {
        "targetType": "linkedin",
        "pageId": "page_98765"
      }
    },
    "scheduledTime": "2026-11-15T14:00:00Z"
  }'

Response

{
  "postSubmissionId": "sub_abc123"
}

Errors

Error

Trigger

Resolution

400 Bad Request

Missing required target fields (e.g. YouTube title + privacyStatus, Pinterest boardId, Facebook pageId)

Include all required platform fields in post.target or look up IDs via listSubaccounts / listPinterestBoards.

400 Bad Request

Invalid scheduledTime format or past timestamp

Pass a future ISO 8601 timestamp in scheduledTime or use useNextFreeSlot: true.

401 Unauthorized

Missing or invalid blotato-api-key

Verify the Blotato key in Settings → Integrations.


getPostStatus({ postSubmissionId })

GET /v2/posts/{postSubmissionId}

Read the outcome of a createPost submission: in-progress, scheduled (with scheduledTime), published (with publicUrl when supplied), or failed (with errorMessage). Always pass the postSubmissionId returned by createPost, never a published post ID. Note that in-progress is also returned for an unknown ID; poll at intervals of at least 10 seconds with a retry limit.

Parameters

Parameter

Type

Required

Description

postSubmissionId

string

Yes

The postSubmissionId returned by createPost.

Example

opvs -w opvs tools call @opvs-ai/blotato getPostStatus \
  --input '{"postSubmissionId":"sub_abc123"}'

Response

{
  "postSubmissionId": "sub_abc123",
  "status": "published",
  "publicUrl": "https://www.linkedin.com/feed/update/urn:li:share:12345"
}

Errors

Error

Trigger

Resolution

401 Unauthorized

Missing or invalid blotato-api-key

Verify the Blotato key in Settings → Integrations.

404 Not Found

Submission record expired or invalid endpoint path

Confirm postSubmissionId came directly from createPost.

status: "failed"

Upstream platform rejected the post (returned in errorMessage)

Fix the missing field, media format, or account permission reported in errorMessage and resubmit with createPost.

Did this answer your question?