---
title: "Create an Agency draft with platform settings"
method: POST
path: "/company/post-groups"
tags: ["Company Publishing"]
---

# Create an Agency draft with platform settings

`POST /company/post-groups`

## Request

- Base URL: `https://api.publora.com/api/v1`
- URL: `https://api.publora.com/api/v1/company/post-groups`
- Auth: API key in header `x-publora-key`

Agency/Company path. Discover available formats using Company /platforms. Uses the caller’s current Company Workspace permissions.

## Headers

- `x-publora-client` string
- `X-Publora-Workspace-Id` string, required
- `Idempotency-Key` string, required

## Request body

- CompanyDraftInput
  - `content` string
  - `notes` string
  - `topic` string
  - `platforms` string[]: Exact Company channel keys; [] permits a channel-less draft.
  - `platformContents` object
  - `isPlatformSpecific` boolean: If supplied, sameContent is also required and must have the opposite value.
  - `sameContent` boolean
  - `platformSettings` CompanyPlatformSettings: Agency platform settings; discover the available formats and settings through GET /company/platforms. This complete map replaces saved settings; only selected platforms may carry entries.
    - `threads` object
      - `replyControl` '' | 'everyone' | 'accounts_you_follow' | 'mentioned_only'
    - `tiktok` object: viewerSetting is required to schedule; a draft may omit it. Commercial content requires a disclosure category at scheduling. A true category infers commercialContent when omitted; explicit false plus a true category is invalid. Branded content cannot use SELF_ONLY.
      - `viewerSetting` 'PUBLIC_TO_EVERYONE' | 'MUTUAL_FOLLOW_FRIENDS' | 'FOLLOWER_OF_CREATOR' | 'SELF_ONLY'
      - `allowComments` boolean
      - `allowDuet` boolean
      - `allowStitch` boolean
      - `autoAddMusic` boolean: Optional photo Direct Post setting. True lets TikTok automatically choose music; Publora cannot select or preview a specific track. For photos, false is sent explicitly; omission preserves existing behavior and does not enable music. Reject non-booleans and true on known non-photo media; false disables music and permits switching to video. Videos never send the provider parameter. Incomplete drafts without media are allowed. Changing it invalidates Company client approval.
      - `commercialContent` boolean
      - `brandOrganic` boolean
      - `brandedContent` boolean
      - `aiGenerated` boolean: Self-disclose realistic AI-generated video or images; TikTok shows its AI-generated label (is_aigc). Changing it invalidates Company client approval.
    - `instagram` object: Stories require exactly one image or video; captions are omitted. coverUrl and shareToFeed apply only to Reel videos.
      - `videoType` 'REELS' | 'STORIES'
      - `coverUrl` string: Trimmed public HTTP(S) JPEG URL for a Reel cover; empty string clears it. Extensionless URLs are accepted; known non-JPEG image suffixes are rejected. Instagram fetches it at publish time. Supply your own URL; the Company API has no cover-upload endpoint. Ignored for Stories and feed images.
      - `shareToFeed` boolean: Share a Reel to the feed; false publishes only as a Reel. Ignored for Stories and feed images.
      - `aiGenerated` boolean: Self-disclose realistic AI-generated or AI-altered video, audio or images; Instagram shows its AI info label (is_ai_generated) on the published container, never on carousel children. Instagram cannot change the label after publishing. Changing it invalidates Company client approval.
    - `youtube` object
      - `privacy` 'private' | 'public' | 'unlisted'
      - `title` string
      - `madeForKids` boolean
      - `aiGenerated` boolean: Self-disclose realistic AI-generated or AI-altered video or audio; sent as status.containsSyntheticMedia. Changing it invalidates Company client approval.
      - `tags` string[]: Trimmed tags; combined length including comma separators and quotes around tags containing spaces must not exceed 500 characters.
      - `playlist` object: Use the exact sole selected youtube-<channelId> key in platformId. Both strings empty clear the playlist. Choose a new playlist when switching channels.
        - `id` string, required
        - `platformId` string, required
      - `thumbnail` object: Ready youtube_thumbnail media on this exact Company post and Workspace; an empty mediaId clears it. Set it with PATCH after completing the upload; a create request cannot reference one. External URLs and personal media IDs are refused.
        - `mediaId` string, required
    - `linkedin` object: Canonical share or ugcPost URN; empty commentary allowed and media forbidden. A parent infers repostEnabled; explicit false with a parent, or true without one, is invalid. Pages require PUBLIC visibility.
      - `repostEnabled` boolean
      - `repostParentUrn` string
      - `repostVisibility` '' | 'PUBLIC' | 'CONNECTIONS'
    - `telegram` object
      - `disableNotification` boolean
      - `disableWebPagePreview` boolean
      - `protectContent` boolean
    - `twitter` object: aiGenerated is the only Company X setting; replyTo and quoteTweet remain personal-API only.
      - `aiGenerated` boolean: Self-disclose AI-generated media; X shows its Made with AI label (made_with_ai). Sent only when the post attaches media, on the head tweet of a thread. Changing it invalidates Company client approval.
  - `threadingSettings` object
  - `videoTimestamp` number
  - `firstComment` object, nullable: One first comment under supported own posts. null clears; firstComments arrays and delays remain personal-only.
    - `text` string, required
    - `platforms` string[]

## Response `201`

Successful Company response.

- CompanyCommandResponse
  - `success` true, required
  - `data` object, required: Company command data with accountId/workspaceId and fields appropriate to the command.

## Other responses

- `400`: Invalid Company content input (AGENCY_CORE_CONTENT_INPUT_INVALID).
- `401`: API key authentication failed; existing API authentication error envelope.
- `402`: Company billing access is required (COMPANY_BILLING_REQUIRED).
- `403`: Workspace or role unavailable (AGENCY_CORE_ACCESS_DENIED).
- `404`: Post or media does not exist in the selected Workspace.
- `409`: Content/media state or idempotency conflict; refetch before a changed request.
- `503`: Company service or dependency unavailable.

## Changes

- **2026-11-04** `f93f96e52798`: 4 info
  - added the new optional request property `platformSettings/instagram/aiGenerated`
  - added the new optional request property `platformSettings/tiktok/aiGenerated`
  - added the new optional request property `platformSettings/twitter`
  - added the new optional request property `platformSettings/youtube/aiGenerated`
- **2026-10-27** `9c97fd530784`: 1 info
  - added the new optional request property `platformSettings/tiktok/autoAddMusic`
- **2026-10-22** `83bd5829401f`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/publora/apis/publora-api/changes/company/post-groups/post.md)

---

[API](https://skmtc.dev/publora/apis/publora-api.md) - [All operations](https://skmtc.dev/publora/apis/publora-api/llms.txt) - [OpenAPI document](https://skmtc.dev/publora/apis/publora-api/revisions/f93f96e52798?raw)
