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

# Submit a clip

> Submits one of your posts to a campaign. For an Instagram account, send `media_id` from `GET /accounts/{account_id}/media`. For an X account, send `post_url`. The campaign must accept the platform of the account (see `platforms` on the campaign), or the request returns 422. The campaign runs the same checks as in the ClipStake app. A clip starts as `pending`.



## OpenAPI

````yaml /creator-api/openapi.json post /clips
openapi: 3.1.0
info:
  title: Clipstake Creator API
  description: >-
    Submit your Instagram and X posts as clips to the campaigns that ClipStake
    opened to your account, and follow your clips.
  version: 0.1.0
servers:
  - url: https://app.clipstake.com/api/v1/creator
security: []
paths:
  /clips:
    post:
      tags:
        - Clips
      summary: Submit a clip
      description: >-
        Submits one of your posts to a campaign. For an Instagram account, send
        `media_id` from `GET /accounts/{account_id}/media`. For an X account,
        send `post_url`. The campaign must accept the platform of the account
        (see `platforms` on the campaign), or the request returns 422. The
        campaign runs the same checks as in the ClipStake app. A clip starts as
        `pending`.
      operationId: clips-create
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                campaign_id:
                  type: string
                  description: >-
                    Campaign ID. Format: cmp_ followed by 32 lowercase
                    hexadecimal characters.
                  example: cmp_8a1d4e2f6b7c4d9e8f0a1b2c3d4e5f60
                account_id:
                  type: string
                  description: >-
                    Account ID. Format: acct_ followed by 32 lowercase
                    hexadecimal characters.
                  example: acct_1c2d3e4f5a6b4c7d8e9f0a1b2c3d4e5f
                media_id:
                  type: string
                  minLength: 1
                  maxLength: 64
                  description: >-
                    For an Instagram account: the `media_id` of the post, from
                    `GET /accounts/{account_id}/media`. Leave it out for an X
                    account.
                  example: '17912345678901234'
                post_url:
                  type: string
                  maxLength: 512
                  format: uri
                  description: >-
                    For an X account: the link to the post, like
                    https://x.com/you/status/123. Leave it out for an Instagram
                    account.
                  example: https://x.com/northwind/status/1845123456789012345
              required:
                - campaign_id
                - account_id
            examples:
              instagram:
                summary: Instagram account
                value:
                  campaign_id: cmp_8a1d4e2f6b7c4d9e8f0a1b2c3d4e5f60
                  account_id: acct_1c2d3e4f5a6b4c7d8e9f0a1b2c3d4e5f
                  media_id: '17912345678901234'
              x:
                summary: X account
                value:
                  campaign_id: cmp_8a1d4e2f6b7c4d9e8f0a1b2c3d4e5f60
                  account_id: acct_7e8f9a0b1c2d4e3f8a9b0c1d2e3f4a5b
                  post_url: https://x.com/northwind/status/1845123456789012345
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                    pattern: ^clip_[0-9a-f]{32}$
                    description: Clip ID.
                    example: clip_5b6c7d8e9f0a4b1c8d2e3f4a5b6c7d8e
                  campaign_id:
                    type: string
                    pattern: ^cmp_[0-9a-f]{32}$
                    description: Campaign ID.
                    example: cmp_8a1d4e2f6b7c4d9e8f0a1b2c3d4e5f60
                  account_id:
                    anyOf:
                      - type: string
                        pattern: ^acct_[0-9a-f]{32}$
                        description: Account ID.
                        example: acct_1c2d3e4f5a6b4c7d8e9f0a1b2c3d4e5f
                      - type: 'null'
                    description: >-
                      The account that posted the clip. Null for an old clip
                      with no linked account.
                    example: acct_1c2d3e4f5a6b4c7d8e9f0a1b2c3d4e5f
                  platform:
                    type: string
                    description: >-
                      The platform: `instagram` or `x`. More values can be
                      added. Accept values that you do not know.
                    example: instagram
                  status:
                    type: string
                    enum:
                      - pending
                      - approved
                      - rejected
                      - not_qualified
                      - paid
                      - initial_account_verification
                      - disconnected
                    description: >-
                      `pending`: the clip waits for review. `approved`: the clip
                      earns from its views. `paid`: a payout was released for
                      the clip, and it can still earn. `rejected`: the clip does
                      not earn; see `review_note`. `not_qualified`: the clip
                      does not meet the campaign rules.
                      `initial_account_verification`: your account must be
                      checked before review. `disconnected`: you removed the
                      account that posted the clip, so it stopped earning.
                    example: pending
                  review_note:
                    description: >-
                      Why the clip was rejected, or other notes from the review.
                      Null when there are none.
                    example: null
                    type:
                      - string
                      - 'null'
                  views:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                    description: Views on the clip at the last reading.
                    example: 48200
                  likes:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                    description: Likes on the clip at the last reading.
                    example: 2600
                  comments:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                    description: Comments on the clip at the last reading.
                    example: 140
                  shares:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                    description: Shares of the clip at the last reading.
                    example: 95
                  posted_at:
                    anyOf:
                      - type: string
                        format: date-time
                        pattern: >-
                          ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
                      - type: 'null'
                    description: When you published the post. Null if it is not known.
                    example: '2026-09-18T17:05:00.000Z'
                  created_at:
                    type: string
                    format: date-time
                    pattern: >-
                      ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
                    description: When you submitted the clip.
                    example: '2026-09-18T17:20:00.000Z'
                  post_url:
                    type: string
                    description: The public link to the post.
                    example: https://www.instagram.com/reel/C9xYz12AbCd/
                  thumbnail_url:
                    description: >-
                      A preview image of the clip. Null if there is none. The
                      link can expire.
                    example: https://cdn.clipstake.example/thumbnails/C9xYz12AbCd.jpg
                    type:
                      - string
                      - 'null'
                  paid_cents:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                    description: >-
                      The amount paid to you for this clip so far, in cents,
                      after the platform fee. 0 when nothing was paid yet.
                    example: 0
                required:
                  - id
                  - campaign_id
                  - account_id
                  - platform
                  - status
                  - review_note
                  - views
                  - likes
                  - comments
                  - shares
                  - posted_at
                  - created_at
                  - post_url
                  - thumbnail_url
                  - paid_cents
                additionalProperties: false
                description: A clip that you submitted.
              example:
                id: clip_5b6c7d8e9f0a4b1c8d2e3f4a5b6c7d8e
                campaign_id: cmp_8a1d4e2f6b7c4d9e8f0a1b2c3d4e5f60
                account_id: acct_1c2d3e4f5a6b4c7d8e9f0a1b2c3d4e5f
                platform: instagram
                status: pending
                review_note: null
                views: 1200
                likes: 85
                comments: 4
                shares: 2
                posted_at: '2026-09-18T17:05:00.000Z'
                created_at: '2026-09-18T17:20:00.000Z'
                post_url: https://www.instagram.com/reel/C9xYz12AbCd/
                thumbnail_url: https://cdn.clipstake.example/thumbnails/C9xYz12AbCd.jpg
                paid_cents: 0
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error.BAD_REQUEST'
              example:
                error:
                  code: invalid_request
                  message: >-
                    An Instagram account takes `media_id`, not `post_url`. List
                    its posts with `GET /accounts/{account_id}/media`.
                  request_id: 6f1c2a9e-4b7d-4c1a-9e2f-3a8b5c7d9e10
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error.UNAUTHORIZED'
              example:
                error:
                  code: unauthorized
                  message: >-
                    Provide a valid API key as `Authorization: Bearer
                    cc_live_...`.
                  request_id: 0b7e4d2c-9a1f-4e3b-8c6d-5f2a1b9c7e34
        '404':
          description: Not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error.NOT_FOUND'
              example:
                error:
                  code: not_found
                  message: No such campaign.
                  request_id: 3c9a8b7d-2e1f-4a6b-9c8d-7e6f5a4b3c21
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error.CONFLICT'
              example:
                error:
                  code: conflict
                  message: >-
                    This post is already a clip. Each post can be submitted
                    once.
                  request_id: 7a6b5c4d-3e2f-4a1b-8c9d-0e1f2a3b4c5d
        '422':
          description: Unprocessable content
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error.UNPROCESSABLE_CONTENT'
              example:
                error:
                  code: submission_refused
                  message: >-
                    This is an invite-only campaign. Accept your invite before
                    submitting.
                  request_id: 2d3e4f5a-6b7c-4d8e-9f0a-1b2c3d4e5f6a
        '429':
          description: Too many requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error.TOO_MANY_REQUESTS'
              example:
                error:
                  code: rate_limited
                  message: >-
                    This Instagram account is near its rate limit. Try again
                    after the time in `Retry-After`.
                  request_id: 8d2e1f3a-6b5c-4d7e-9f8a-1b2c3d4e5f67
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error.INTERNAL_SERVER_ERROR'
              example:
                error:
                  code: internal_error
                  message: An unexpected error occurred.
                  request_id: 5a4b3c2d-1e0f-4a9b-8c7d-6e5f4a3b2c19
        '503':
          description: Service unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error.SERVICE_UNAVAILABLE'
              example:
                error:
                  code: unavailable
                  message: >-
                    ClipStake is undergoing scheduled maintenance. Try again
                    shortly.
                  request_id: 9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b
      security:
        - Authorization: []
components:
  schemas:
    error.BAD_REQUEST:
      type: object
      title: Bad request error (400)
      description: The error envelope every failed request returns.
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - invalid_request
              description: A stable, machine-readable error code.
            message:
              type: string
              description: What went wrong, in words a person can act on.
            request_id:
              type: string
              description: The id of this request. Quote it when you contact support.
          required:
            - code
            - message
            - request_id
          additionalProperties: false
      required:
        - error
      additionalProperties: false
    error.UNAUTHORIZED:
      type: object
      title: Unauthorized error (401)
      description: The error envelope every failed request returns.
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - unauthorized
              description: A stable, machine-readable error code.
            message:
              type: string
              description: What went wrong, in words a person can act on.
            request_id:
              type: string
              description: The id of this request. Quote it when you contact support.
          required:
            - code
            - message
            - request_id
          additionalProperties: false
      required:
        - error
      additionalProperties: false
    error.NOT_FOUND:
      type: object
      title: Not found error (404)
      description: The error envelope every failed request returns.
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - not_found
              description: A stable, machine-readable error code.
            message:
              type: string
              description: What went wrong, in words a person can act on.
            request_id:
              type: string
              description: The id of this request. Quote it when you contact support.
          required:
            - code
            - message
            - request_id
          additionalProperties: false
      required:
        - error
      additionalProperties: false
    error.CONFLICT:
      type: object
      title: Conflict error (409)
      description: The error envelope every failed request returns.
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - conflict
              description: A stable, machine-readable error code.
            message:
              type: string
              description: What went wrong, in words a person can act on.
            request_id:
              type: string
              description: The id of this request. Quote it when you contact support.
          required:
            - code
            - message
            - request_id
          additionalProperties: false
      required:
        - error
      additionalProperties: false
    error.UNPROCESSABLE_CONTENT:
      type: object
      title: Unprocessable content error (422)
      description: The error envelope every failed request returns.
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - submission_refused
              description: A stable, machine-readable error code.
            message:
              type: string
              description: What went wrong, in words a person can act on.
            request_id:
              type: string
              description: The id of this request. Quote it when you contact support.
          required:
            - code
            - message
            - request_id
          additionalProperties: false
      required:
        - error
      additionalProperties: false
    error.TOO_MANY_REQUESTS:
      type: object
      title: Too many requests error (429)
      description: The error envelope every failed request returns.
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - rate_limited
              description: A stable, machine-readable error code.
            message:
              type: string
              description: What went wrong, in words a person can act on.
            request_id:
              type: string
              description: The id of this request. Quote it when you contact support.
          required:
            - code
            - message
            - request_id
          additionalProperties: false
      required:
        - error
      additionalProperties: false
    error.INTERNAL_SERVER_ERROR:
      type: object
      title: Internal server error error (500)
      description: The error envelope every failed request returns.
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - internal_error
              description: A stable, machine-readable error code.
            message:
              type: string
              description: What went wrong, in words a person can act on.
            request_id:
              type: string
              description: The id of this request. Quote it when you contact support.
          required:
            - code
            - message
            - request_id
          additionalProperties: false
      required:
        - error
      additionalProperties: false
    error.SERVICE_UNAVAILABLE:
      type: object
      title: Service unavailable error (503)
      description: The error envelope every failed request returns.
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - unavailable
              description: A stable, machine-readable error code.
            message:
              type: string
              description: What went wrong, in words a person can act on.
            request_id:
              type: string
              description: The id of this request. Quote it when you contact support.
          required:
            - code
            - message
            - request_id
          additionalProperties: false
      required:
        - error
      additionalProperties: false
  securitySchemes:
    Authorization:
      type: http
      scheme: bearer

````

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