> ## Documentation Index
> Fetch the complete documentation index at: https://docs.marketordie.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Create or schedule a post

> Publishes (or schedules) a post to one or more channels. Returns one post object per channel. Omit `scheduled_for` to publish as soon as possible.



## OpenAPI

````yaml /openapi.json post /posts
openapi: 3.1.0
info:
  title: Market or Die API
  version: 1.0.0
  description: >-
    Compose, schedule, and ship posts to every connected channel —
    programmatically.
servers:
  - url: https://api.marketordie.io/v1
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Account
    description: Who the API key acts as.
  - name: Channels
    description: Connected accounts you can post to.
  - name: Media
    description: Upload images to attach to posts.
  - name: Posts
    description: Create, schedule, list, and delete posts.
  - name: Leaderboard
    description: Team standings by points.
paths:
  /posts:
    post:
      tags:
        - Posts
      summary: Create or schedule a post
      description: >-
        Publishes (or schedules) a post to one or more channels. Returns one
        post object per channel. Omit `scheduled_for` to publish as soon as
        possible.
      operationId: createPost
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreatePostRequest'
            examples:
              single:
                summary: One post, two channels, now
                value:
                  channels:
                    - conn_abc
                    - conn_def
                  text: We just shipped our public API.
                  points: 20
              scheduledThread:
                summary: A scheduled thread
                value:
                  channels:
                    - conn_abc
                  thread:
                    - 'Why we built an API:'
                    - So your team can ship from anywhere.
                  scheduled_for: '2026-07-01T10:00:00Z'
              draft:
                summary: Save as a draft
                value:
                  channels:
                    - conn_abc
                  text: Half-baked idea to finish later.
                  draft: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Post'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  schemas:
    CreatePostRequest:
      type: object
      required:
        - channels
      properties:
        channels:
          type: array
          minItems: 1
          items:
            type: string
          description: Connection ids from GET /channels.
        text:
          type: string
          description: Single-post text. Use this or `thread`.
        thread:
          type: array
          items:
            type: string
          description: Multi-part thread (X). Other platforms join the parts.
        media:
          type: array
          items:
            type: string
          description: Up to 4 image ids from POST /media. Attached to the first post.
        scheduled_for:
          type: string
          format: date-time
          description: ISO 8601. Omit to publish as soon as possible.
        points:
          type: integer
          default: 20
          description: Points to claim for this post (admin-reviewed).
        draft:
          type: boolean
          default: false
          description: >-
            Save as a draft instead of publishing/scheduling. When true,
            `scheduled_for` is ignored and nothing is queued.
    Post:
      type: object
      properties:
        id:
          type: string
        status:
          type: string
          enum:
            - draft
            - scheduled
            - publishing
            - published
            - failed
            - canceled
        channel:
          type: string
          nullable: true
          description: Platform slug.
        posts:
          type: array
          description: Ordered thread parts.
          items:
            type: object
            properties:
              text:
                type: string
        scheduled_for:
          type: string
          format: date-time
          nullable: true
        published_urls:
          type: array
          items:
            type: string
        error:
          type: string
          nullable: true
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
            message:
              type: string
  responses:
    BadRequest:
      description: Invalid request.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: invalid_request
              message: Provide `text` or a non-empty `thread`.
    Unauthorized:
      description: Missing or invalid API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: unauthorized
              message: Invalid or revoked API key.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Your API key as a bearer token: `Authorization: Bearer mod_live_…`. (You
        can also send it as `x-api-key`.)

````