---
title: "Change an existing Hive draft: its words, hashtags, media, accounts, per-network options, campaigns or tags. This never publishes and never messages anyone."
method: POST
path: "/api/v1/tools/update_draft"
---

# Change an existing Hive draft: its words, hashtags, media, accounts, per-network options, campaigns or tags. This never publishes and never messages anyone.

`POST /api/v1/tools/update_draft`

## Request

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

## Headers

- `Idempotency-Key` string, required

## 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, required: The Hive draft to change.

## Response `200`

Tool result

- ToolResult
  - `data` unknown, required
  - `meta` object, required
    - `tool` string
    - `workspaceId` string, uuid

## 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)
