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

# Create a draft post

> A text draft (LinkedIn text in `content`, other platforms in `platform_variations`). It stays a draft until it is proposed and accepted.



## OpenAPI

````yaml /openapi.json post /posts
openapi: 3.1.0
info:
  title: CaptureFlow API
  version: 1.0.0
  description: >-
    Read and create content in CaptureFlow. Scheduling and posting always go
    through an approval the user accepts in CaptureFlow: the API never publishes
    on its own (POST /posts/{id}/proposals, then the user accepts at
    `approval_url`).


    Authenticate with an API key from Settings > API & MCP (`Authorization:
    Bearer cf_live_...`), or as an app the user connected through OAuth 2.1
    (`Authorization: Bearer cfo_at_...`; PKCE, discovery at
    `/.well-known/oauth-protected-resource`). Both act for their user; pass
    `workspace_id` when the user belongs to several workspaces. `as_user` works
    with API keys only.


    The same operations are tools of the MCP server at
    https://mcp.captureflow.ai/mcp (read-only:
    https://mcp.captureflow.ai/mcp/readonly).


    Errors: https://docs.captureflow.ai/api/errors
servers:
  - url: https://api.captureflow.ai/v1
security:
  - apiKey: []
  - oauth2: []
tags:
  - name: Account
    description: Who the key or app acts for, and the workspaces it can use.
  - name: Ideas
    description: 'Content ideas: the topics posts are written about.'
  - name: Inputs
    description: Source material (text, links, files) that posts are made from.
  - name: Posts
    description: >-
      Draft posts, platform checks and proposals the user accepts in
      CaptureFlow.
  - name: Social accounts
    description: The social accounts connected in the workspace.
  - name: Strategy
    description: The workspace content strategy.
  - name: Content agent
    description: >-
      Runs of the content agent that writes drafts from an idea, an input or
      text.
  - name: Meta
    description: Service status.
paths:
  /posts:
    post:
      tags:
        - Posts
      summary: Create a draft post
      description: >-
        A text draft (LinkedIn text in `content`, other platforms in
        `platform_variations`). It stays a draft until it is proposed and
        accepted.
      operationId: create_post_draft
      parameters:
        - in: query
          name: workspace_id
          schema:
            description: >-
              The workspace to act in. Optional when the key has a default or a
              lock, or you belong to one workspace.
            type: string
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: >-
            The workspace to act in. Optional when the key has a default or a
            lock, or you belong to one workspace.
        - in: query
          name: as_user
          schema:
            description: >-
              API keys of owners and admins only (not OAuth apps): act as this
              member of the workspace (like View As). Every use is audited.
            type: string
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          description: >-
            API keys of owners and admins only (not OAuth apps): act as this
            member of the workspace (like View As). Every use is audited.
        - in: header
          name: Idempotency-Key
          schema:
            description: >-
              Any unique string (e.g. a UUID). A retry with the same key and
              request returns the first answer (`Idempotent-Replayed: true`, ids
              only) instead of doing it twice. Kept 24 hours.
            type: string
            maxLength: 255
          description: >-
            Any unique string (e.g. a UUID). A retry with the same key and
            request returns the first answer (`Idempotent-Replayed: true`, ids
            only) instead of doing it twice. Kept 24 hours.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                content:
                  type: string
                  minLength: 1
                  maxLength: 3000
                title:
                  type: string
                  maxLength: 200
                first_comment:
                  type: string
                  maxLength: 1250
                platform_variations:
                  type: object
                  propertyNames:
                    type: string
                  additionalProperties: {}
                  description: >-
                    Other platforms' texts by platform id, e.g. `{ "instagram":
                    { "text": "...", "hashtags": ["a"], "format": "feed" },
                    "twitter": { "thread": ["...", "..."] } }`. On an update,
                    `null` removes a platform.
              required:
                - content
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DraftPost'
        '400':
          description: >-
            Invalid request (`validation_failed`, `workspace_required`,
            `credentials_in_url`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: >-
            Missing, invalid, revoked or expired key or access token
            (`unauthorized`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '402':
          description: >-
            This workspace needs a paid plan or a trial (`plan_required`, with
            `details.upgrade_url`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: >-
            Not allowed (`insufficient_scope`, `api_disabled`,
            `workspace_locked`, `as_user_forbidden`, `viewer_read_only`,
            `managed_member_restricted`, `platform_not_enabled`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not found, or not yours (`not_found`, `workspace_not_found`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: >-
            Conflict (`post_not_editable`, `post_has_variant`,
            `post_not_proposable`, `not_proposed`, `idempotency_conflict`,
            `idempotency_in_progress`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '413':
          description: Request body over 100 KB (`body_too_large`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: >-
            The content can't be used as it is (`url_unreadable`,
            `preflight_failed` with `details.issues`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '423':
          description: >-
            The account or workspace is scheduled for deletion
            (`deletion_pending`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited (`rate_limited`); see `Retry-After`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Our fault (`internal_error`); quote the `request_id`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: >-
            The API is not available (`api_unavailable`), or changes are paused
            (`writes_unavailable`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    DraftPost:
      type: object
      properties:
        object:
          type: string
          const: post
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        status:
          type: string
        title:
          type:
            - string
            - 'null'
        content_type:
          type:
            - string
            - 'null'
        app_url:
          type: string
      required:
        - object
        - id
        - status
        - title
        - content_type
        - app_url
      additionalProperties: false
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            type:
              type: string
              description: The kind of error, e.g. `permission_error`.
            code:
              type: string
              description: Stable code to branch on, e.g. `insufficient_scope`.
            message:
              type: string
              description: For people; may change.
            param:
              type: string
            details:
              type: object
              propertyNames:
                type: string
              additionalProperties: {}
            doc_url:
              type: string
            request_id:
              type: string
              description: Quote it when contacting support.
          required:
            - type
            - code
            - message
            - doc_url
            - request_id
          additionalProperties: false
      required:
        - error
      additionalProperties: false
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      bearerFormat: cf_live_...
      description: An API key from Settings > API & MCP.
    oauth2:
      type: oauth2
      description: >-
        An app the user connected (OAuth 2.1, PKCE S256, client ID metadata
        documents or dynamic registration). Access tokens look like
        `cfo_at_...`.
      flows:
        authorizationCode:
          authorizationUrl: https://app.captureflow.ai/oauth/authorize
          tokenUrl: https://app.captureflow.ai/api/oauth/token
          refreshUrl: https://app.captureflow.ai/api/oauth/token
          scopes:
            ideas:read: Read content ideas.
            ideas:write: Create content ideas.
            inputs:read: Read inputs (text, links, uploads) and their processing state.
            inputs:write: 'Create inputs: text, links and file uploads.'
            posts:read: Read posts and check them against platform rules.
            posts:write: Create and edit draft posts.
            posts:schedule: >-
              Propose posts for scheduling or posting; the user accepts each
              proposal in CaptureFlow.
            strategy:read: Read the content strategy.
            brand:read: 'Reserved: no endpoints yet.'
            knowledge:read: 'Reserved: no endpoints yet.'
            accounts:read: Read connected social accounts.
            analytics:read: 'Reserved: no endpoints yet.'
            agent:run: Start the content agent and read its runs.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.