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

# Export unique creator handles as CSV

> Generate and download a CSV of unique creator handles from the same
filtered set as `POST /posts/export`. Use this when you need to reach
out to or reconcile the distinct creators behind a filtered posts view,
without the per-post rows.

Handles are deduped by `(platform, handle)`. When the same handle
appears as both a ghost and a resolved creator, the resolved creator
row wins.

**Columns (in order):** `name`, `handle`, `platform`, `url`, `type`.
`type` is `creator` for resolved creators or `ghost` for unresolved
handles.

Accepts the same auth and filter contract as `POST /posts/export`.




## OpenAPI

````yaml /openapi/platform-apikey.yaml post /posts/export-handles
openapi: 3.0.4
info:
  title: SideShift Legacy Platform API (Deprecated)
  version: 1.0.0
  description: >
    > **Deprecated and unmaintained.** This legacy `/api/v1` Platform API is
    retained only

    > for existing integrations while they migrate. It receives no new features
    or maintenance

    > fixes. Do not use it for new integrations; use the OAuth 2.1 Platform API
    at

    > `/api/oauth/v1` instead.


    Authenticate legacy requests using your API key in the `x-api-key` header.


    This document covers the **public, API-key-authenticated** surface. The

    restricted endpoints (Jobs, Applicants, payout execution/Quick Pay) are
    gated

    to an explicit partner allowlist and are documented in the **Full Access**

    spec (`sideshift-api-private.yaml`); a non-allowlisted key calling them

    receives `403`. API-key *management* (creating/rotating keys, digest

    automations) is performed in the dashboard with a Firebase session and is
    not

    part of this API-key contract.


    ## Requirements

    - **Active Subscription Required**: API access requires an active Sideshift
      subscription. Requests from a company without one return
      `402 { "error": "Active subscription required" }`.
    - API key from Settings → Integrations


    ## Rate Limits

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

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

    - Every response carries `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and
      `X-RateLimit-Reset` headers; exceeding the limit returns `429`.

    ## Errors

    - Errors are returned as `{ "error": "<message>" }` with the appropriate
    HTTP
      status (`400` invalid request, `401` invalid/missing key, `402` no active
      subscription, `403` restricted endpoint / cross-company, `404` not found,
      `429` rate limited). Some endpoints add a `code` (e.g. `LEAD_NOT_FOUND`).

    ## Timestamps

    - All timestamps are Unix timestamps in milliseconds

    - Example: `1634567890000`


    ## Pagination

    - Most list endpoints support `page` (default: 1) and `limit` (default: 25,
      max: 100) parameters and return `{ data, page, total }`. Some additionally
      return `limit` and/or `totalPages`.
    - Agency (parent) accounts can pass `scope=agency` on analytics/posts
      endpoints to aggregate across the parent agency and every subaccount.

    ## Base URL

    - Production: `https://app.sideshift.app/api/v1`
servers:
  - url: https://app.sideshift.app/api/v1
    description: Production server
security:
  - apiKeyAuth: []
tags:
  - name: Programs
    description: Campaign and program management
  - name: Posts
    description: Social media posts and content
  - name: Analytics
    description: Performance metrics and KPIs
  - name: Payouts
    description: Payout management including pending payouts and execution
  - name: Contracts
    description: Creator contracts and agreements
  - name: Creators
    description: Creator profiles and statistics
  - name: Invoices
    description: |
      Create, list, and send invoices to customers.

      The API key's company must have invoicing access before these
      endpoints accept writes. Access is granted in one of three ways: the
      account is a brand-verified or Discover agency, SideShift staff enable
      invoicing for the company, or the company reaches the agency
      payout-volume threshold that unlocks invoicing automatically.
  - name: Discover
    description: Read Discover leads (brand inquiries) submitted to your agency
paths:
  /posts/export-handles:
    post:
      tags:
        - Posts
      summary: Export unique creator handles as CSV
      description: |
        Generate and download a CSV of unique creator handles from the same
        filtered set as `POST /posts/export`. Use this when you need to reach
        out to or reconcile the distinct creators behind a filtered posts view,
        without the per-post rows.

        Handles are deduped by `(platform, handle)`. When the same handle
        appears as both a ghost and a resolved creator, the resolved creator
        row wins.

        **Columns (in order):** `name`, `handle`, `platform`, `url`, `type`.
        `type` is `creator` for resolved creators or `ghost` for unresolved
        handles.

        Accepts the same auth and filter contract as `POST /posts/export`.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                filters:
                  type: object
                  description: Same filter options as GET /posts
                selectedIds:
                  type: array
                  items:
                    type: string
                  description: Specific post IDs to draw handles from (overrides filters)
      responses:
        '200':
          description: CSV file stream
          content:
            text/csv:
              schema:
                type: string
                format: binary
                example: >
                  name,handle,platform,url,type

                  "Alex
                  Rivera","alexrivera","tiktok","https://www.tiktok.com/@alexrivera","creator"

                  "ghost-42","ghost-42","instagram","","ghost"
          headers:
            Content-Disposition:
              schema:
                type: string
              description: >-
                attachment; filename="creator-handles-YYYY-MM-DD.csv" (date in
                the company report timezone)
components:
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        API key for authentication. Get yours from Settings → Integrations. A
        key created by a team member acts as that member and follows their
        current team permissions; a request outside those permissions returns
        `403 { "error": "insufficient_scope", "scope": "<required>" }`.

````