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

# Read a native Google Demand Gen reach forecast

> Read-only ReachPlan request for the selected, verified Google Ads account. Google must permit ReachPlan access and return a compatible Demand Gen planning product and a valid historical conversion-rate suggestion. Expected customerId must match the current connection; a same-currency account rebind returns 409. Only customer-history conversion-rate suggestions are used and the actual rate/model is returned. Exact contiguous demographic ranges are supported when listed by the product metadata; saved audience constraints and disjoint or partial unknown-age ranges return unavailable. The forecast models all languages even if the proposed campaign targets selected languages; requested language IDs and this limitation are returned in scope. A dated request covers its inclusive dates; an open-ended daily-budget request uses an explicit 28-day planning window. Reach and impressions are provider estimates at the returned forecast spend, not guarantees or an exact configured-campaign forecast. Reach and impressions use native on-target fields only; missing on-target fields remain null with no fallback to totals. Google may privacy-round low reach to zero. Unknown metrics are null, distinct from Google's returned zero. No campaign mutation or spend.



## OpenAPI

````yaml /openapi/oauth.yaml post /ads/google/forecast
openapi: 3.1.0
info:
  title: SideShift OAuth API
  version: 1.0.0
  description: >
    The SideShift OAuth API is a scoped, OAuth 2.1 + OIDC-style authenticated

    integration surface (served at `/api/oauth/v1`) that lets external apps and

    AI agents operate a SideShift company on a user's behalf — reading and

    managing campaigns, contracts, creators, applications, posts, payouts,

    invoices, messages, and company settings — under explicit, per-scope

    consent. Every request has one effective tenant (company) and the exact

    scopes the user granted. OAuth consent can select multiple companies; pass

    `X-Act-As-Company` to select one explicitly connected account per request.

    Requests without the header use the default company. An

    agency parent's scoped Platform API key or human OAuth grant can explicitly

    delegate direct sub-account access and use `X-Act-As-Company` to select one

    child per request. Credentials are capped by their saved scopes and current

    authorizing person permissions, including the target child's live access.
    The same capabilities are also

    exposed through a remote MCP server at `POST /api/mcp` for AI agents that

    speak the Model Context Protocol.


    ### Authentication


    For your own company, create a scoped Platform API key in Settings and send

    it as `x-api-key`. For user-authorized integrations, use OAuth:


    1. **Register a client** with Dynamic Client Registration to obtain a
       `client_id` (and, for confidential clients, a secret).
    2. **Request authorization** via the authorization-code grant with PKCE
       (`S256`). The user is shown a consent screen and picks the company
       (tenant) and scopes to grant.
    3. **Exchange the code** at the token endpoint for a short-lived bearer
       access token (and a refresh token).
    4. **Refresh** with the refresh-token grant; refresh tokens rotate on every
       use.

    Company machine clients using `client_credentials` require dashboard

    authorization; public registration and human consent do not authorize that

    grant. New machine clients also follow their creator's live permissions.


    See the **OAuth Registration**, **OAuth Authorization**, **OAuth Token**,

    and **OAuth Discovery** sections for the endpoint details. The protocol

    follows RFC 6749, 7009, 7591, 7592, 7636, 8414, 9068, and 9728.


    ### MCP server


    SideShift also exposes a remote Model Context Protocol (MCP) server at

    `POST /api/mcp`, using the Streamable-HTTP transport. It fronts the **same**

    OAuth-scoped capabilities as the REST resources, so an AI agent can operate

    a SideShift company through MCP tools instead of raw HTTP calls.


    **Connecting a client.** Point any MCP client at

    `https://app.sideshift.app/api/mcp`. It authenticates with the **same**

    OAuth 2.1 flow described above — register a client, run authorization-code +

    PKCE, and obtain a bearer access token; there is no MCP-specific auth

    scheme. Tokens minted for MCP are multi-audience, so a single token works

    for both `/api/oauth/v1` and `/api/mcp`. If a request arrives unauthorized,

    the server replies `401` with a `WWW-Authenticate` challenge that points at

    the RFC 9728 protected-resource metadata, letting compliant clients

    auto-discover the authorization server.


    **What you get.** Every capability scope maps to tools, and the tool set

    mirrors the REST surface plus a `whoami` tool. Read scopes expose read-only

    tools; write and sensitive tools carry a confirmation guardrail in their

    description. Sensitive tools — those that move money or trigger outbound

    side-effects — are rejected for sandbox/test grants and can be globally

    disabled with the `MCP_SAFE_MODE` server flag. The claim-link capability is

    available as the `create_quickpay_claim_link` tool.


    ### Conventions


    - **Pagination** — list endpoints return `{ data, nextCursor, hasMore }`.
      Pass the opaque `cursor` from `nextCursor` to fetch the next page, plus an
      optional `limit` (default 25, max 100).
    - **Errors** — every error response uses the envelope
      `{ error: { code, message, requestId } }`. Include `requestId` when
      contacting support.
    - **Idempotency** — an `Idempotency-Key` header is honored on every POST,
      PATCH, and PUT, and is **required** on money-moving writes so a retried
      request never double-charges.
    - **Rate limiting** — every response carries `X-RateLimit-*` headers, and a
      `WWW-Authenticate` header accompanies 401 and 403 responses.

    ### Sandbox & sensitive operations


    Test/sandbox grants can exercise reads and safe writes, but requests that

    move money or trigger outbound side-effects (payouts, sending invoices or

    messages, external re-scrapes) are rejected. Money-moving endpoints and

    campaign analytics-history validation/import requests require an

    `Idempotency-Key`.
  contact:
    name: SideShift API
    url: https://app.sideshift.app
servers:
  - url: https://app.sideshift.app/api/oauth/v1
    description: Production
security:
  - oauth2: []
tags:
  - name: Campaigns
    description: Programs/campaigns and their payment structures.
  - name: Contracts
    description: Creator contracts.
  - name: Creators
    description: Creator roster, collections, and campaign invites.
  - name: Applications
    description: Campaign applications (creator handle requests) and their review.
  - name: Posts
    description: Tracked creator posts, their metrics history, and CSV export.
  - name: Payouts
    description: >-
      Payout history and pending-payout calculations, plus executing contract
      payouts, one-time and custom bonuses, and Quick Pay.
  - name: Invoices
    description: >
      Invoices: list, get, create, send, and void.


      The tenant 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: Messages
    description: >
      Direct-message conversations: list the company's conversations, read a
      conversation's messages, and send a message (as the company). A company on
      SideShift's own messaging is served natively; a company that has not moved
      keeps its connected chat lane. Every message is persisted, and a single
      conversation is bound to the token's company tenant.
  - name: Settings
    description: >
      Company settings and profile. `GET/PATCH /settings` exposes a server-side
      **allowlist** of mutable fields (profile/contact/socials/signing); reads
      and writes never include plan, billing, subscription, permissions,
      credits, or verification fields. `GET /company` returns the read-only
      company profile.
  - name: Invites
    description: >
      Campaign/program invite links — list, create, and revoke shareable invites
      that let creators join a campaign. Team-member invites are managed under
      the Team tag.
  - name: OAuth Registration
    description: >
      Dynamic Client Registration (RFC 7591) and client configuration management
      (RFC 7592). Open registration is per-IP rate-limited; management requires
      the one-time `registration_access_token` returned at registration.
  - name: OAuth Authorization
    description: >
      The authorization endpoint (RFC 6749 §4.1, PKCE S256 required) and the
      in-session consent bridge that records the user's tenant + scope grant and
      mints the authorization code.
  - name: OAuth Token
    description: >
      Token issuance (RFC 6749: authorization_code, refresh_token,
      client_credentials) and revocation (RFC 7009). Form-encoded; responses are
      `no-store`.
  - name: OAuth Discovery
    description: >
      Public discovery documents — authorization-server metadata (RFC 8414),
      protected-resource metadata (RFC 9728), and the signing-key JWKS.
  - name: Agencies
    description: >
      Agency-level management for parent companies and their client subaccounts
      — dashboards, cross-account creator and program rollups, per-client
      billing, and payout cashflow forecasting.
  - name: Applicants
    description: >
      Review and manage the people who apply to a company's jobs: filter and
      list applicants, view counts and top posts, bookmark, update status,
      export to CSV, and open applicant support channels.
  - name: Billing
    description: >
      Subscription and payment-method management — view billing history and
      subscription status, set the default payment method, preview plan changes,
      cancel a subscription, and mint browser billing handoff links.
  - name: Booking
    description: >-
      Booking-calendar configuration for scheduling calls with creators and
      agencies.
  - name: Brand Content Pages
    description: >
      Create, update, and list a company's brand content pages — the public
      pages that present the brand to creators.
  - name: Brand Livestream
    description: Brand live-stream events and their configuration.
  - name: Brand Verification
    description: Check a company's brand-verification status.
  - name: Community Courses
    description: Educational courses published to a brand's creator community.
  - name: Community Offers
    description: Promotional offers and deals published to a brand's creator community.
  - name: Companies
    description: >
      Manage the companies (and agency subaccounts) a user belongs to — create
      and list companies, read and update company and invoicing profiles, and
      propagate name, logo, and niche changes across programs and jobs.
  - name: Conversations
    description: >
      Manage direct-message conversations — create threads, add or remove group
      members, rename, forward messages, and add reactions.
  - name: Creator Collections
    description: Organize creators into named collections and manage their membership.
  - name: Discover
    description: >
      The Discover marketplace surface — publish and manage a company's Discover
      listing, handle qualified lead-form submissions, configure booking hosts,
      and message agencies.
  - name: Disputes
    description: >-
      View and resolve creator-payment disputes, including uploading
      counter-evidence. A creator can file at most one dispute per campaign; any
      prior filing, even a resolved or rejected one, blocks a new dispute. New
      filings also close 30 days after the campaign ends. Existing disputes stay
      viewable and payable after that window closes.
  - name: Integrations
    description: >
      Connect and configure third-party integrations such as Slack — manage
      channels, workflow templates, OAuth connections, and test deliveries.
  - name: Jobs
    description: >-
      Post and manage marketplace job listings — create, update, boost, repost,
      and change job status.
  - name: Performance
    description: >-
      Brand-facing performance observability + creator matching (manually
      provisioned — SideShift must enable the Performance API for the company).
  - name: Quick-Pay
    description: >
      Send fast, wallet-funded payments to creators — claim links, recurring
      schedules, reusable templates, and drafts.
  - name: Recruit
    description: >
      Search for and recruit creators — browse candidate profiles, bookmark
      prospects, and send recruitment invites.
  - name: Team
    description: >
      Manage a company's team — list members and seat usage, invite new members,
      update permissions and roles, and remove members.
  - name: Wallet
    description: >
      View and move funds in a company's wallet — balances, ledger history, and
      transfers between an agency and its subaccounts.
  - name: Video Submissions
    description: >
      Review creator video submissions for a company's campaigns, and remove
      submissions along with the posts they created.
  - name: Analytics
    description: Analytics operations.
  - name: Ads
    description: Ads operations.
  - name: Verifications
    description: Read identity verification status, profile details, and required actions.
  - name: Commerce
    description: >-
      Connected store products, creator samples, attribution, and Shopify Admin
      queries.
paths:
  /ads/google/forecast:
    post:
      tags:
        - Ads
      summary: Read a native Google Demand Gen reach forecast
      description: >-
        Read-only ReachPlan request for the selected, verified Google Ads
        account. Google must permit ReachPlan access and return a compatible
        Demand Gen planning product and a valid historical conversion-rate
        suggestion. Expected customerId must match the current connection; a
        same-currency account rebind returns 409. Only customer-history
        conversion-rate suggestions are used and the actual rate/model is
        returned. Exact contiguous demographic ranges are supported when listed
        by the product metadata; saved audience constraints and disjoint or
        partial unknown-age ranges return unavailable. The forecast models all
        languages even if the proposed campaign targets selected languages;
        requested language IDs and this limitation are returned in scope. A
        dated request covers its inclusive dates; an open-ended daily-budget
        request uses an explicit 28-day planning window. Reach and impressions
        are provider estimates at the returned forecast spend, not guarantees or
        an exact configured-campaign forecast. Reach and impressions use native
        on-target fields only; missing on-target fields remain null with no
        fallback to totals. Google may privacy-round low reach to zero. Unknown
        metrics are null, distinct from Google's returned zero. No campaign
        mutation or spend.
      operationId: postAdsGoogleForecast
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GoogleForecastRequest'
      responses:
        '200':
          description: >-
            data contains status ready or unavailable. Unavailable reason
            distinguishes access_required, no_compatible_product,
            invalid_targeting, conversion_rate_required, currency_mismatch,
            invalid_budget, malformed_response and transient_failure. Ready
            metrics can be null or zero.
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                properties:
                  data:
                    $ref: '#/components/schemas/GoogleForecastResult'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/InsufficientScope'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          description: The selected Google customer changed; refresh before forecasting.
        '429':
          $ref: '#/components/responses/RateLimited'
      security:
        - oauth2:
            - ads:read
        - platformApiKey: []
components:
  schemas:
    GoogleForecastRequest:
      type: object
      properties:
        connectionId:
          type: string
          minLength: 1
          maxLength: 200
        customerId:
          type: string
          pattern: ^\d+$
        currencyCode:
          type: string
          pattern: ^[A-Z]{3}$
        startDate:
          type: string
        endDate:
          type: string
        budget:
          type: object
          properties:
            mode:
              type: string
              enum:
                - daily
                - total
            amountMicros:
              type: string
              pattern: ^[1-9]\d*$
          required:
            - mode
            - amountMicros
          additionalProperties: false
        bidding:
          anyOf:
            - type: object
              properties:
                strategy:
                  type: string
                  const: maximize_clicks
              required:
                - strategy
              additionalProperties: false
            - type: object
              properties:
                strategy:
                  type: string
                  const: maximize_conversions
              required:
                - strategy
              additionalProperties: false
            - type: object
              properties:
                strategy:
                  type: string
                  const: target_cpa
                targetCpaMicros:
                  type: string
                  pattern: ^[1-9]\d*$
              required:
                - strategy
                - targetCpaMicros
              additionalProperties: false
            - type: object
              properties:
                strategy:
                  type: string
                  const: target_roas
                targetRoas:
                  type: number
                  exclusiveMinimum: 0
              required:
                - strategy
                - targetRoas
              additionalProperties: false
        goals:
          anyOf:
            - type: object
              properties:
                mode:
                  type: string
                  const: account
              required:
                - mode
              additionalProperties: false
            - type: object
              properties:
                mode:
                  type: string
                  const: custom
                resourceName:
                  type: string
                  pattern: ^customers\/\d+\/customConversionGoals\/\d+$
                name:
                  type: string
                  minLength: 1
                  maxLength: 4096
                conversionCustomerId:
                  type: string
                  pattern: ^\d+$
                fingerprint:
                  type: string
                  pattern: ^[a-f0-9]{64}$
                conversionActions:
                  type: array
                  items:
                    type: object
                    properties:
                      resourceName:
                        type: string
                        pattern: ^customers\/\d+\/conversionActions\/\d+$
                      name:
                        type: string
                        minLength: 1
                        maxLength: 4096
                    required:
                      - resourceName
                      - name
                    additionalProperties: false
                  minItems: 1
                  maxItems: 100
                goals:
                  type: array
                  items:
                    type: object
                    properties:
                      category:
                        type: string
                        pattern: ^[A-Z_]+$
                        maxLength: 100
                      origin:
                        type: string
                        pattern: ^[A-Z_]+$
                        maxLength: 100
                    required:
                      - category
                      - origin
                    additionalProperties: false
                  maxItems: 100
                goalUniverse:
                  type: array
                  items:
                    type: object
                    properties:
                      category:
                        type: string
                        pattern: ^[A-Z_]+$
                        maxLength: 100
                      origin:
                        type: string
                        pattern: ^[A-Z_]+$
                        maxLength: 100
                    required:
                      - category
                      - origin
                    additionalProperties: false
                  maxItems: 100
              required:
                - mode
                - resourceName
                - name
                - conversionCustomerId
                - fingerprint
                - conversionActions
                - goals
                - goalUniverse
              additionalProperties: false
            - type: object
              properties:
                mode:
                  type: string
                  const: inherited_custom
                resourceName:
                  type: string
                  pattern: ^customers\/\d+\/customConversionGoals\/\d+$
                name:
                  type: string
                  minLength: 1
                conversionActions:
                  type: array
                  items:
                    type: object
                    properties:
                      resourceName:
                        type: string
                        pattern: ^customers\/\d+\/conversionActions\/\d+$
                      name:
                        type: string
                        minLength: 1
                    required:
                      - resourceName
                      - name
                    additionalProperties: false
                  minItems: 1
                goals:
                  type: array
                  items:
                    type: object
                    properties:
                      category:
                        type: string
                        pattern: ^[A-Z_]+$
                      origin:
                        type: string
                        pattern: ^[A-Z_]+$
                    required:
                      - category
                      - origin
                    additionalProperties: false
              required:
                - mode
                - resourceName
                - name
                - conversionActions
                - goals
              additionalProperties: false
            - type: object
              properties:
                mode:
                  type: string
                  const: campaign
                goals:
                  type: array
                  items:
                    type: object
                    properties:
                      category:
                        type: string
                        pattern: ^[A-Z_]+$
                      origin:
                        type: string
                        pattern: ^[A-Z_]+$
                    required:
                      - category
                      - origin
                    additionalProperties: false
                  minItems: 1
                  maxItems: 100
              required:
                - mode
                - goals
              additionalProperties: false
          description: >-
            Account defaults, standard campaign selection, immutable
            inherited_custom for existing campaigns, or explicit custom for a
            new settings-copy campaign. New custom mode reuses an enabled
            existing shared custom goal and freezes its account, membership,
            fingerprint and complete standard goal universe. It never creates or
            edits the shared goal; later native membership changes affect both
            campaigns and require review before enabling.
        locationIds:
          type: array
          items:
            type: string
            pattern: ^\d+$
          minItems: 1
          maxItems: 25
        languageIds:
          type: array
          items:
            type: string
            pattern: ^\d+$
          minItems: 1
          maxItems: 100
        placements:
          type: array
          items:
            type: string
            enum:
              - shorts
              - in_stream
              - in_feed
              - discover
              - gmail
              - display
              - maps
          minItems: 1
          maxItems: 7
        audience:
          anyOf:
            - type: object
              properties:
                mode:
                  type: string
                  const: all
              required:
                - mode
              additionalProperties: false
            - type: object
              properties:
                mode:
                  type: string
                  const: saved
                resourceName:
                  type: string
                  pattern: ^customers\/\d+\/audiences\/\d+$
                fingerprint:
                  type: string
                  pattern: ^[a-f0-9]{64}$
              required:
                - mode
                - resourceName
                - fingerprint
              additionalProperties: false
            - type: object
              properties:
                mode:
                  type: string
                  const: custom
                baseResourceName:
                  type: string
                  pattern: ^customers\/\d+\/audiences\/\d+$
                baseFingerprint:
                  type: string
                  pattern: ^[a-f0-9]{64}$
                ages:
                  type: array
                  items:
                    type: string
                    enum:
                      - 18_24
                      - 25_34
                      - 35_44
                      - 45_54
                      - 55_64
                      - 65_UP
                      - UNDETERMINED
                  minItems: 1
                  maxItems: 7
                genders:
                  type: array
                  items:
                    type: string
                    enum:
                      - MALE
                      - FEMALE
                      - UNDETERMINED
                  minItems: 1
                  maxItems: 3
              required:
                - mode
                - ages
                - genders
              additionalProperties: false
      required:
        - connectionId
        - customerId
        - currencyCode
        - startDate
        - budget
        - bidding
        - locationIds
        - languageIds
        - placements
      additionalProperties: false
    GoogleForecastResult:
      type: object
      properties:
        provider:
          type: string
          const: google
        source:
          type: string
          const: google_reach_plan
        status:
          type: string
          enum:
            - ready
            - unavailable
        reason:
          type: string
          enum:
            - access_required
            - no_compatible_product
            - invalid_targeting
            - invalid_budget
            - currency_mismatch
            - conversion_rate_required
            - transient_failure
            - malformed_response
        message:
          type: string
        currencyCode:
          type: string
          pattern: ^[A-Z]{3}$
        window:
          type: object
          properties:
            startDate:
              type: string
            endDate:
              type: string
            planningHorizon:
              type: boolean
          required:
            - startDate
            - endDate
            - planningHorizon
          additionalProperties: false
        scope:
          type: object
          properties:
            requestedLanguageIds:
              type: array
              items:
                type: string
            modeledLanguages:
              type: string
              const: all
            metricBasis:
              type: string
              const: on_target
            limitation:
              type: string
              const: >-
                All languages — Google forecasts do not model language
                targeting.
          required:
            - requestedLanguageIds
            - modeledLanguages
            - metricBasis
            - limitation
          additionalProperties: false
        reach:
          anyOf:
            - type: integer
              minimum: 0
              maximum: 9007199254740991
            - type: 'null'
        impressions:
          anyOf:
            - type: integer
              minimum: 0
              maximum: 9007199254740991
            - type: 'null'
        clicks:
          anyOf:
            - type: integer
              minimum: 0
              maximum: 9007199254740991
            - type: 'null'
        forecastSpendMicros:
          anyOf:
            - type: string
              pattern: ^\d+$
            - type: 'null'
        conversionRateSource:
          type: string
          const: google_suggestion
        conversionRate:
          type: number
          exclusiveMinimum: 0
          exclusiveMaximum: 1
        conversionRateModel:
          type: string
          const: CUSTOMER_HISTORY
        productCode:
          type: string
      required:
        - provider
        - source
        - status
        - currencyCode
        - window
        - scope
        - reach
        - impressions
        - clicks
        - forecastSpendMicros
      additionalProperties: false
    ErrorEnvelope:
      type: object
      required:
        - error
      additionalProperties: false
      properties:
        error:
          type: object
          required:
            - code
            - message
            - requestId
          properties:
            code:
              type: string
              enum:
                - invalid_request
                - unauthorized
                - insufficient_scope
                - forbidden
                - subscription_required
                - not_found
                - conflict
                - rate_limited
                - idempotency_conflict
                - oauth_required
                - oauth_needs_reauthentication
                - client_update_required
                - upstream_error
                - internal
            message:
              type: string
            requestId:
              type: string
            meta:
              type: object
              additionalProperties: true
  responses:
    Unauthorized:
      description: Missing, expired, or revoked access token.
      headers:
        WWW-Authenticate:
          description: RFC 6750/9728 challenge.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              code: unauthorized
              message: Missing bearer access token
              requestId: req_...
    InsufficientScope:
      description: The token does not carry the required scope.
      headers:
        WWW-Authenticate:
          description: RFC 6750/9728 challenge with the required scope.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              code: insufficient_scope
              message: Requires scope 'campaigns:write'
              requestId: req_...
    NotFound:
      description: The resource does not exist (or belongs to another tenant).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              code: not_found
              message: Resource not found
              requestId: req_...
    RateLimited:
      description: >-
        Too many requests for this client + company, or a messaging budget is
        spent (60 message sends or 10 conversation creations per minute, per
        credential and company). A budget refusal also carries
        `meta.retryAfterSeconds`.
      headers:
        Retry-After:
          description: Seconds until the window resets.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              code: rate_limited
              message: Rate limit exceeded
              requestId: req_...
  securitySchemes:
    oauth2:
      type: oauth2
      description: >
        OAuth 2.1 authorization code + PKCE (S256). Tokens are tenant-bound
        (`company_id`) and scoped. Discover endpoints via
        `/.well-known/oauth-authorization-server`.
      flows:
        authorizationCode:
          authorizationUrl: https://app.sideshift.app/api/oauth/v1/authorize
          tokenUrl: https://app.sideshift.app/api/oauth/v1/token
          refreshUrl: https://app.sideshift.app/api/oauth/v1/token
          scopes:
            ads:read: Read ad accounts, campaigns, delivery status, and performance data
            ads:write: >-
              Create and manage ad campaigns and connected ad accounts
              (sensitive — this can spend money)
            campaigns:read: Read campaigns and payment structures
            campaigns:write: Create/update/archive campaigns and payment structures
            applications:read: Read campaign applications (handle requests)
            applications:write: Approve/reject campaign applications
            contracts:read: Read contracts
            contracts:write: Create and cancel contracts
            contracts:sign: >-
              Sign contracts as the company and reassign the company signer
              (sensitive)
            wallet:withdraw: Withdraw company wallet funds (sensitive)
            scraper:read: View scraper account settings and usage
            scraper:write: >-
              Run paid scrapes and manage scraper credentials and credits
              (sensitive)
            creators:read: Read creators and collections
            creators:write: Create collections and campaign invites
            posts:read: Read tracked posts, their metrics history, and exports
            payouts:read: Read payout history, pending payouts, and wallet stats
            payouts:write: Execute contract payouts and Quick Pay (sensitive — moves money)
            invoices:read: Read invoices
            invoices:write: Create, send, and void invoices
            messages:read: Read conversations and messages
            messages:write: Send messages and manage conversations (sensitive)
            settings:read: Read company settings and profile
            settings:write: >-
              Update company settings (allowlisted) and create/revoke invites
              (sensitive)
            offline_access: Optional OIDC signal for offline access
            agencies:write: >-
              Update agency program/contract/client notes, program status, and
              client archive status
            agencies:read: >-
              Read agency dashboard, client lists, creator details, and payment
              receipts
            agency-billing:write: >-
              Update agency billing info, enable separate subs, generate tiered
              client checkout links, and assign included clients — this moves
              money.
            agency-billing:read: Read your agency billing configuration.
            applicants:read: >-
              Read access to applicants, including filtered lists, counts, and
              export
            applicants:write: >-
              Write access to update applicant status, bookmarks, and resolve
              support channels
            billing:write: >-
              Manage subscription, payment methods, and bank accounts — this
              changes what you are charged.
            billing:read: >-
              Read subscription status, payment methods, bank-account status,
              and upgrade previews.
            booking:write: >-
              Create and modify bookings, send booking requirements, and other
              write operations
            brand-content-pages:read: >-
              List and view brand content pages (public published pages visible
              to all, drafts visible to writers only)
            brand-content-pages:write: >-
              Create, update, and manage brand content pages (create drafts,
              publish, manage public share tokens)
            brand-livestream:write: >-
              Start/end livestreams, mint viewer tokens, rotate stream keys, and
              manage egress.
            brand-livestream:read: >-
              Read active livestreams, recordings, and settings for brand
              livestreams.
            brand-livestream:settings: Update chat and moderation settings for brand livestreams.
            brand-verification:write: Create brand verification requests and prepare document uploads
            brand-verification:read: Read access to brand verification status and request history
            brand-performance:read: >-
              Read own campaign spend/delivery health and creator-match
              shortlists (manually provisioned — SideShift must enable the
              Performance API)
            agency-performance:read: >-
              Read performance data for permitted, delegated client brands in
              your agency subtree — health, scorecards, creator relationships,
              and a portfolio rollup (agency accounts; manually provisioned)
            community-courses:read: Read-only access to community course content and metadata
            community-courses:write: >-
              Create, update, and delete community courses (educational content
              management)
            community-offers:checkout: >-
              Create checkout sessions for community offer purchases (involves
              payment processing)
            community-offers:write: >-
              Create, update, and delete community offers, promo codes, and
              Discord integration settings
            community-offers:membership: >-
              Link and resolve community offer memberships from purchases
              (involves payment processing)
            community-offers:read: Read community offers, promo codes, and membership data
            discover:read: Read your Discover marketplace offer/listing.
            discover:write: Publish, update, or remove your Discover marketplace offer.
            disputes:write: >-
              Resolve disputes and submit counter-evidence — this can move
              money.
            disputes:read: Read creator-payment disputes and their evidence.
            integrations:read: Read Slack integrations, channels, templates, and configuration
            integrations:write: >-
              Create, update, and delete Slack integrations, channels,
              templates, and workflows
            jobs:write: >-
              Create new jobs and update existing jobs, including changing
              posting status, reposts, and job management. Costs job posting
              credits for new jobs.
            jobs:read: >-
              List and read job data, including duplicate target companies.
              Read-only access to job details.
            quick-pay:write: >-
              Create/update/send Quick-Pay drafts, schedules, templates, and
              approvals — sending moves money to creators.
            quick-pay:read: >-
              Read Quick-Pay drafts, schedules, templates, approvals, pending
              payments, and recent recipients.
            recruit:read: Search recruit students and view bookmarked recruits
            recruit:write: Send recruit invites, manage bookmarks, and mint action tokens
            team:read: >-
              Read access to team members list and company invites. Allows
              viewing member details, permissions, and pending invitations.
            team:write: >-
              Write access to add, remove, and update team members, and
              create/send team invitations.
            wallet:read: Read your company/agency wallet balance, summary, and ledger.
            wallet:write: >-
              Top up (Stripe/bank transfer), reconcile, transfer balance, and
              record ledger entries — this moves money.
            video-submissions:write: >-
              Approve, reject, or request revisions on video submissions, and
              delete submissions.
            video-submissions:read: >-
              Read creator video submissions for your campaigns, including
              review status.
            posts:write: >-
              Set post approval status, mark/clear deletion, and manage
              analytics tags.
            booking:read: Read creator booking settings, booking intents, and service types.
            analytics:read: Read analytics and performance data.
            verification:read: >-
              Read your identity verification status, profile, and required
              actions.
    platformApiKey:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        A scoped `sspk_live_...` or `sspk_test_...` Platform API key for the
        selected company, optionally with explicit direct agency child
        delegation. Effective scopes are capped by the creator's current company
        permissions.

````

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