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

# Exclude a post from earnings

> Exclude a post in a canvas program from creator earnings. This is permanent. The exclusion covers the post's whole video, including its cross-posts on other platforms (same `crossPostGroupId`). The video stops counting in pay and analytics, its pending pay is removed, and it is not tracked again. Afterwards the posts are no longer returned by `/posts`.

With a `message`, the creator is told that the video will not be paid, and why. Without one, the creator is not told.

The request is refused with `409` and a `code` when real pay already reached the creator or a paid ad uses the video. `paid: false` in `/posts` does not guarantee that the exclusion is allowed.

With `?dryRun=true`, the request runs the same checks and changes nothing. It answers `200` with `{ id, excluded: false, dryRun: true, canExclude, blockedBy, crossPostIds, pendingCentsToRemove }`. A refusal is `canExclude: false` with its code in `blockedBy`.



## OpenAPI

````yaml /api-reference/openapi.json post /posts/{id}/exclude
openapi: 3.0.4
info:
  title: Launchpoint Public API
  version: 1.0.0
  description: >-
    **Private preview.** The Launchpoint Public API is in private preview and
    available only to trusted partners we work with directly. Access is not
    self-serve. Email hi@launchpointhq.com to ask about access.


    REST API for Launchpoint brands and agencies. Use an API key in the
    `x-api-key` header to authenticate.


    ## Requirements

    - Public API access must be enabled for the company. During private preview,
    access is limited to trusted partners.

    - Create and manage API keys in Dashboard → Settings → Developer.


    ## Creator privacy

    - Responses never include creator email addresses. Creator phone numbers are
    null when no number is stored or the workspace does not have access to
    creator contact details.


    ## Rate limits

    - Default: **100 requests per minute** per API key.

    - Approved partner accounts: **400 requests per minute**.

    - Every response includes `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and
    `X-RateLimit-Reset`. Requests over the limit return `429`.


    ## Errors

    - Errors use `{ "error": "<message>" }` with the matching HTTP status. Some
    endpoints also include a `code`.


    ## Timestamps

    - Timestamps are Unix timestamps in milliseconds unless a field says
    otherwise.


    ## Pagination

    - Most list endpoints accept `page` and `limit` and return `{ data, page,
    total }`. Some also return `totalPages`.

    - `scope=company` is the default. A parent agency key can pass
    `scope=agency` on supported routes to include its own data and linked
    brands.
servers:
  - url: https://dashboard.launchpointhq.com/api/v1
    description: Live API server
security:
  - apiKeyAuth: []
tags:
  - name: Deals
    description: Public creator opportunities across Launchpoint
  - name: Programs
    description: Programs and campaign management
  - name: Posts
    description: Posts and social content
  - name: Analytics
    description: KPIs and performance metrics
  - name: Payouts
    description: Payouts, balances, and pending creator funds
  - name: Contracts
    description: Contracts and creator agreements
  - name: Creators
    description: Creator profiles and metrics
  - name: Applications
    description: Creator applications to Canvas programs
  - name: Messages
    description: Read and send creator messages
  - name: Onboarding
    description: 'Creator onboarding: status, messages, and proof review'
  - name: Media review
    description: >-
      Review the media creators send before they post: queue, status, approve,
      and reject
paths:
  /posts/{id}/exclude:
    post:
      tags:
        - Posts
      summary: Exclude a post from earnings
      description: >-
        Exclude a post in a canvas program from creator earnings. This is
        permanent. The exclusion covers the post's whole video, including its
        cross-posts on other platforms (same `crossPostGroupId`). The video
        stops counting in pay and analytics, its pending pay is removed, and it
        is not tracked again. Afterwards the posts are no longer returned by
        `/posts`.


        With a `message`, the creator is told that the video will not be paid,
        and why. Without one, the creator is not told.


        The request is refused with `409` and a `code` when real pay already
        reached the creator or a paid ad uses the video. `paid: false` in
        `/posts` does not guarantee that the exclusion is allowed.


        With `?dryRun=true`, the request runs the same checks and changes
        nothing. It answers `200` with `{ id, excluded: false, dryRun: true,
        canExclude, blockedBy, crossPostIds, pendingCentsToRemove }`. A refusal
        is `canExclude: false` with its code in `blockedBy`.
      parameters:
        - $ref: '#/components/parameters/ScopeParam'
        - in: path
          name: id
          required: true
          schema:
            type: string
            format: uuid
          description: ID of the post
        - in: query
          name: dryRun
          schema:
            type: boolean
            default: false
          description: >-
            With `true`, run every check and roll back. Nothing is excluded,
            recorded, or sent.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                message:
                  type: string
                  minLength: 1
                  maxLength: 1000
                  description: Optional. Shown to the creator.
                reason:
                  type: string
                  minLength: 1
                  maxLength: 1000
                  deprecated: true
                  description: Earlier name for `message`. Send one of the two, not both.
      responses:
        '200':
          description: Post excluded, or the dry-run result
          content:
            application/json:
              schema:
                oneOf:
                  - type: object
                    required:
                      - id
                      - excluded
                      - creatorNotified
                    properties:
                      id:
                        type: string
                        format: uuid
                      excluded:
                        type: boolean
                        enum:
                          - true
                      creatorNotified:
                        type: boolean
                        description: True when a reason was sent to the creator
                  - type: object
                    title: Dry run
                    required:
                      - id
                      - excluded
                      - dryRun
                      - canExclude
                    properties:
                      id:
                        type: string
                        format: uuid
                      excluded:
                        type: boolean
                        enum:
                          - false
                      dryRun:
                        type: boolean
                        enum:
                          - true
                      canExclude:
                        type: boolean
                      blockedBy:
                        type: string
                        nullable: true
                        description: >-
                          The refusal code, for example `already_paid`,
                          `payout_processing`, or `has_paid_ads`
                      crossPostIds:
                        type: array
                        items:
                          type: string
                          format: uuid
                        description: Every post the exclusion would remove
                      pendingCentsToRemove:
                        type: integer
        '400':
          description: >-
            Invalid post id or message, both `message` and `reason` sent, or the
            post is not in a canvas program
        '403':
          description: The program is read-only for this API key
        '404':
          description: Post not found or already excluded
        '409':
          description: >-
            Refused to protect money already paid. `code` is one of
            `already_paid`, `payout_processing`, `paid_off_platform`,
            `has_paid_ads`, `has_platform_fee`, `manual_payout_in_progress`,
            `removal_in_progress`.
components:
  parameters:
    ScopeParam:
      in: query
      name: scope
      required: false
      schema:
        type: string
        enum:
          - company
          - agency
        default: company
      description: >-
        Choose the data scope. `company` (default) limits results to the API key
        company's data. `agency` includes the parent agency and its linked
        brands. `scope=agency` requires a parent agency key; other keys receive
        `403`.
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: API key created in Dashboard → Settings → Developer

````

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