---
title: "Put a post in Hive’s queue for a future time, with every composer option. Your AI asks you before this runs; with Hive approvals on, Hive asks again inside Hive, because it will be published publicly. Hive checks every target network before it writes anything, so a post a network would reject is refused here instead of failing later."
method: POST
path: "/api/v1/tools/schedule_post"
---

# Put a post in Hive’s queue for a future time, with every composer option. Your AI asks you before this runs; with Hive approvals on, Hive asks again inside Hive, because it will be published publicly. Hive checks every target network before it writes anything, so a post a network would reject is refused here instead of failing later.

`POST /api/v1/tools/schedule_post`

## Request

- Base URL: `https://hivepublish.com`
- URL: `https://hivepublish.com/api/v1/tools/schedule_post`
- Auth: HTTP bearer

This reaches real people, so the person is asked before it runs. Their own AI client asks them. When the connection was made with Hive approvals switched on, the first call returns a single-use Hive approval link instead of acting, and the exact request is repeated with approvalToken and an Idempotency-Key once they approve it inside Hive.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `title` string: Shared title. Mainly YouTube.
  - `privacy` 'public' | 'private' | 'unlisted': Shared privacy, overridden by per-network options when supplied.
  - `caption` string: Shared caption.
  - `hashtags` string[]: Hashtags appended per network rules.
  - `hashtagGroupId` string: A saved hashtag group. Its hashtags are merged with any you pass.
  - `channelIds` string[]: The connected Hive accounts this post goes to.
  - `media` object[]: The photos and videos on the post, in order.
    - `assetId` string: An Asset Library id from read_media_library.
    - `url` string: A Hive-hosted media URL, such as the one upload_media_from_url returns. Links on other hosts are refused: import them with upload_media_from_url first.
    - `altText` string: Accessibility text. Saved onto the Asset Library item when assetId is given. Instagram post alt text is perPlatform.instagram.igAltText.
    - `order` number: Where this item sits in the post, lowest first.
  - `cover` object, nullable: The composer cover plan. Omit to keep the existing cover; null removes it.
  - `perPlatform` object: Per-network options keyed by network (instagram, facebook, tiktok, youtube, linkedin, x, threads, pinterest, snapchat, bluesky, mastodon, whatsapp, telegram). Each value takes what Hive's composer takes, for example postType (post, reel, story), caption, title, privacy, firstComment, igLocationId, igAltText, igCollaborators, coverUrl, threadsReplyControl, youtubeFormat, tiktokPrivacyLevel. Anything omitted falls back to the shared values.
  - `firstComment` string: A first comment posted under the post where the network supports it.
  - `campaignIds` string[]: Campaign ids.
  - `campaignNames` string[]: Campaign names. Unknown names are refused with the list of campaigns that exist.
  - `tagIds` string[]: Internal tag ids.
  - `tagNames` string[]: Internal tag names. Unknown names are refused with the list of tags that exist.
  - `linkTracking` 'inherit' | 'on' | 'off': Whether Hive rewrites links for click tracking. Defaults to the workspace setting.
  - `assigneeId` string: The teammate asked to approve this post.
  - `approvalWorkflowId` string: The approval workflow to run instead of the workspace default.
  - `postId` string: An existing Hive draft to schedule. Leave it out to create and schedule in one step.
  - `expectedVersion` string: Required with postId: the exact version returned by read_post for the content being approved. Changed content requires a fresh review.
  - `runAt` string, required: When to publish, as an ISO date in the future.
  - `recurrence` object: A repeat pattern. Supplying it creates a repeating series whose first post is the next occurrence.
  - `approvalToken` string: Single-use token returned by Hive after the owner approves this exact action.

## Response `200`

Tool result or approval challenge

- union
  - ToolResult
    - `data` unknown, required
    - `meta` object, required
      - `tool` string
      - `workspaceId` string, uuid
  - ApprovalChallengeResponse
    - `data` ApprovalChallenge, required
      - `confirmationRequired` unknown, required
      - `challengeId` string, uuid, required
      - `approvalToken` string, required: Secret, single-use token. Retry only after the human approves approvalUrl.
      - `approvalUrl` string, uri, required
      - `expiresAt` string, date-time, required
      - `warning` string
    - `meta` object, required

## Other responses

- `400`: Invalid input
- `401`: Missing or invalid credential
- `403`: Missing workspace scope, role permission, or plan entitlement
- `409`: Idempotency conflict, replay, or request still in progress
- `429`: Rate limit exceeded

---

[API](https://skmtc.dev/hivepublish/apis/hive-developer-api.md) · [All operations](https://skmtc.dev/hivepublish/apis/hive-developer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/hivepublish/apis/hive-developer-api/revisions/b440c763583e?raw)
