---
title: "Create a repeating Hive post series from a pattern, with every composer option. Each occurrence is queued to publish publicly. Your AI asks before this runs; with Hive approvals on, Hive asks again for the exact series."
method: POST
path: "/api/v1/tools/create_recurring_post"
---

# Create a repeating Hive post series from a pattern, with every composer option. Each occurrence is queued to publish publicly. Your AI asks before this runs; with Hive approvals on, Hive asks again for the exact series.

`POST /api/v1/tools/create_recurring_post`

## Request

- Base URL: `https://hivepublish.com`
- URL: `https://hivepublish.com/api/v1/tools/create_recurring_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.
  - `recurrence` object, required: The repeat pattern: frequency, interval, days, the time of day and the timezone, as Hive’s composer sends it.
  - `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)
