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

# Get a file upload

> Where an upload stands: pending (with `uploaded` telling whether the file arrived), completed (with the input), failed or expired. Never returns an upload URL (refresh_input_upload_url does).



## OpenAPI

````yaml /openapi.json get /inputs/uploads/{id}
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:
  /inputs/uploads/{id}:
    get:
      tags:
        - Inputs
      summary: Get a file upload
      description: >-
        Where an upload stands: pending (with `uploaded` telling whether the
        file arrived), completed (with the input), failed or expired. Never
        returns an upload URL (refresh_input_upload_url does).
      operationId: get_input_upload
      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: path
          name: id
          schema:
            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 id of the idea, input, post or agent run.
          required: true
          description: The id of the idea, input, post or agent run.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InputUpload'
        '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'
        '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:
    InputUpload:
      type: object
      properties:
        object:
          type: string
          const: input_upload
        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)$
        workspace_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)$
          description: Pass it on later calls if you work in several workspaces.
        status:
          type: string
          enum:
            - pending
            - completing
            - completed
            - failed
            - expired
        media_type:
          type: string
          enum:
            - video
            - audio
            - pdf
            - image
        size_bytes:
          type: number
        expires_at:
          type: string
          description: Complete the upload before this time.
        uploaded:
          description: 'While pending: whether the file has arrived (then call complete).'
          type:
            - boolean
            - 'null'
        upload:
          $ref: '#/components/schemas/InputUploadTarget'
        input:
          anyOf:
            - type: object
              properties:
                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)$
                media_type:
                  type: string
                status:
                  type: string
                  description: >-
                    Audio and video keep processing for minutes after complete:
                    follow it with get_input.
                app_url:
                  type: string
              required:
                - id
                - media_type
                - status
                - app_url
              additionalProperties: false
            - type: 'null'
        error:
          anyOf:
            - type: object
              properties:
                code:
                  type: string
                message:
                  type: string
              required:
                - code
                - message
              additionalProperties: false
            - type: 'null'
      required:
        - object
        - id
        - workspace_id
        - status
        - media_type
        - size_bytes
        - expires_at
        - uploaded
        - upload
        - input
        - error
      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
    InputUploadTarget:
      anyOf:
        - type: object
          properties:
            url:
              type: string
              description: >-
                PUT the file here: the whole file in one request, with exactly
                these headers and a Content-Length, and no Authorization header.
                Any 2xx answer means it arrived.
            method:
              type: string
              const: PUT
            headers:
              type: object
              propertyNames:
                type: string
              additionalProperties:
                type: string
            expires_at:
              type: string
          required:
            - url
            - method
            - headers
            - expires_at
          additionalProperties: false
        - type: 'null'
  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.