---
title: "Create a logical multi-target post"
method: POST
path: "/api/v1/posts"
tags: ["Posts"]
---

# Create a logical multi-target post

`POST /api/v1/posts`

## Request

- Base URL: `https://blendduck.com`
- URL: `https://blendduck.com/api/v1/posts`
- Auth: HTTP bearer

Create a logical multi-target post.

## Headers

- `X-Request-ID` string
- `Idempotency-Key` string

## Request body

- CreatePostInput
  - `publishAt` string, date-time
  - `content` string
  - `media` object[]
    - `id` string
    - `createdAt` string
    - `url` string, required
    - `type` 'image' | 'video'
    - `name` string
    - `size` integer
    - `width` integer
    - `height` integer
    - `animationFrameCount` integer, nullable
    - `durationSec` number, nullable
    - `frameRate` number, nullable
    - `videoCodec` 'av1' | 'h264' | 'h265' | 'vp8' | 'vp9', nullable
    - `contentType` string
    - `altText` string
    - `thumbnailUrl` string
    - `thumbnailFrameTimeSec` number
    - `peopleTags` object[]
      - `username` string, required
      - `x` number, required
      - `y` number, required
  - `settings` object: Shared provider settings. Prefer target.settings for platform-specific values and validate them against the target provider publishingContract.settingsSchema.
  - `thread` object[]
    - `content` string
    - `media` object[]
      - `id` string
      - `createdAt` string
      - `url` string, required
      - `type` 'image' | 'video'
      - `name` string
      - `size` integer
      - `width` integer
      - `height` integer
      - `animationFrameCount` integer, nullable
      - `durationSec` number, nullable
      - `frameRate` number, nullable
      - `videoCodec` 'av1' | 'h264' | 'h265' | 'vp8' | 'vp9', nullable
      - `contentType` string
      - `altText` string
      - `thumbnailUrl` string
      - `thumbnailFrameTimeSec` number
      - `peopleTags` object[]
        - `username` string, required
        - `x` number, required
        - `y` number, required
  - `tags` object[]
    - `value` string, required
    - `label` string, required
  - `topicId` string, uuid, nullable
  - `deduplication` 'prevent' | 'allow'
  - `targets` object[], required
    - `channelId` string, uuid, required
    - `content` string
    - `publishAt` string, date-time
    - `media` object[]
      - `id` string
      - `createdAt` string
      - `url` string, required
      - `type` 'image' | 'video'
      - `name` string
      - `size` integer
      - `width` integer
      - `height` integer
      - `animationFrameCount` integer, nullable
      - `durationSec` number, nullable
      - `frameRate` number, nullable
      - `videoCodec` 'av1' | 'h264' | 'h265' | 'vp8' | 'vp9', nullable
      - `contentType` string
      - `altText` string
      - `thumbnailUrl` string
      - `thumbnailFrameTimeSec` number
      - `peopleTags` object[]
        - `username` string, required
        - `x` number, required
        - `y` number, required
    - `settings` object: Provider-specific values. Read GET /api/v1/providers/{providerId} and validate against publishingContract.settingsSchema before writing.
    - `thread` object[]
      - `content` string
      - `media` object[]
        - `id` string
        - `createdAt` string
        - `url` string, required
        - `type` 'image' | 'video'
        - `name` string
        - `size` integer
        - `width` integer
        - `height` integer
        - `animationFrameCount` integer, nullable
        - `durationSec` number, nullable
        - `frameRate` number, nullable
        - `videoCodec` 'av1' | 'h264' | 'h265' | 'vp8' | 'vp9', nullable
        - `contentType` string
        - `altText` string
        - `thumbnailUrl` string
        - `thumbnailFrameTimeSec` number
        - `peopleTags` object[]
          - `username` string, required
          - `x` number, required
          - `y` number, required
  - `mode` 'draft' | 'schedule' | 'next_available' | 'prioritize' | 'publish_now'

## Response `201`

Created logical post

- PostResponse
  - `data` object, required
    - `id` string, uuid, required
    - `status` 'draft' | 'scheduled' | 'publishing' | 'published' | 'partial' | 'failed' | 'cancelled', required
    - `content` string, required
    - `media` object[], required
      - `id` string
      - `createdAt` string
      - `url` string, required
      - `type` 'image' | 'video', required
      - `name` string
      - `size` integer
      - `width` integer
      - `height` integer
      - `animationFrameCount` integer, nullable
      - `durationSec` number, nullable
      - `frameRate` number, nullable
      - `videoCodec` 'av1' | 'h264' | 'h265' | 'vp8' | 'vp9', nullable
      - `contentType` string
      - `altText` string
      - `thumbnailUrl` string
      - `thumbnailFrameTimeSec` number
      - `peopleTags` object[]
        - `username` unknown, required
        - `x` number, required
        - `y` number, required
    - `settings` object, required
    - `thread` object[], required
      - `content` string, required
      - `media` object[], required
        - `id` string
        - `createdAt` string
        - `url` string, required
        - `type` 'image' | 'video', required
        - `name` string
        - `size` integer
        - `width` integer
        - `height` integer
        - `animationFrameCount` integer, nullable
        - `durationSec` number, nullable
        - `frameRate` number, nullable
        - `videoCodec` 'av1' | 'h264' | 'h265' | 'vp8' | 'vp9', nullable
        - `contentType` string
        - `altText` string
        - `thumbnailUrl` string
        - `thumbnailFrameTimeSec` number
        - `peopleTags` object[]
          - `username` unknown, required
          - `x` number, required
          - `y` number, required
    - `tags` object[], required
      - `value` string, required
      - `label` string, required
    - `topicId` string, uuid, nullable, required
    - `targets` object[], required
      - `id` string, uuid, required
      - `channel` object, required
        - `id` string, uuid, required
        - `provider` string, required
        - `displayName` string, required
      - `status` 'DRAFT' | 'QUEUE' | 'PUBLISHING' | 'PROCESSING' | 'PUBLISHED' | 'ERROR' | 'CANCELLED', required
      - `scheduleMode` 'draft' | 'schedule' | 'next_available' | 'prioritize' | 'publish_now', required
      - `publishAt` string, date-time, required
      - `content` string, required
      - `media` object[], required
        - `id` string
        - `createdAt` string
        - `url` string, required
        - `type` 'image' | 'video', required
        - `name` string
        - `size` integer
        - `width` integer
        - `height` integer
        - `animationFrameCount` integer, nullable
        - `durationSec` number, nullable
        - `frameRate` number, nullable
        - `videoCodec` 'av1' | 'h264' | 'h265' | 'vp8' | 'vp9', nullable
        - `contentType` string
        - `altText` string
        - `thumbnailUrl` string
        - `thumbnailFrameTimeSec` number
        - `peopleTags` object[]
          - `username` unknown, required
          - `x` number, required
          - `y` number, required
      - `settings` object, required
      - `thread` object[], required
        - `content` string, required
        - `media` object[], required
          - `id` string
          - `createdAt` string
          - `url` string, required
          - `type` 'image' | 'video', required
          - `name` string
          - `size` integer
          - `width` integer
          - `height` integer
          - `animationFrameCount` integer, nullable
          - `durationSec` number, nullable
          - `frameRate` number, nullable
          - `videoCodec` 'av1' | 'h264' | 'h265' | 'vp8' | 'vp9', nullable
          - `contentType` string
          - `altText` string
          - `thumbnailUrl` string
          - `thumbnailFrameTimeSec` number
          - `peopleTags` object[]
            - `username` unknown, required
            - `x` number, required
            - `y` number, required
      - `providerPostId` string, nullable, required
      - `publicUrl` string, nullable, required
      - `failure` object, nullable, required
        - `kind` 'permanent' | 'reconnect' | 'transient', required
        - `code` string, required
        - `retryable` boolean, required
        - `message` string, nullable, required
      - `publishing` object, required
        - `attemptCount` integer, required
        - `lastAttemptAt` string, date-time, nullable, required
        - `attempts` object[], required
          - `id` string, required
          - `attemptNumber` integer, required
          - `provider` string, required
          - `phase` 'submit' | 'status', required
          - `outcome` 'running' | 'processing' | 'succeeded' | 'failed', required
          - `latencyMs` integer, nullable, required
          - `providerResponseId` string, nullable, required
          - `publicUrl` string, nullable, required
          - `publicUrlStatus` 'available' | 'pending' | 'unavailable', required
          - `failure` object, nullable, required
            - `kind` 'permanent' | 'reconnect' | 'transient', required
            - `code` string, required
          - `error` string, nullable, required
          - `startedAt` string, required
          - `completedAt` string, nullable, required
      - `createdAt` string, date-time, required
      - `updatedAt` string, date-time, required
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
  - `meta` object, required
    - `requestId` string, required

## Other responses

- `400`: Invalid query, request body, JSON, or request identity.
- `401`: Missing or invalid authentication.
- `403`: Authentication lacks the required role or API-key scope.
- `404`: Resource or tenant path is hidden or absent.
- `409`: Lifecycle, idempotency, or concurrent-state conflict.
- `429`: The API-key operation exhausted its fixed-window quota.
- `500`: Internal or upstream failure.

---

[API](https://skmtc.dev/blendduck/apis/blendduck-public-api.md) · [All operations](https://skmtc.dev/blendduck/apis/blendduck-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/blendduck/apis/blendduck-public-api/revisions/3b49354699da?raw)
