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

# Purchase report

> **Scope:** `read:pulls`, opt-in, granted on request.

Every completed pack purchase in a window, for revenue-share reporting. Purchases with an `amount` of 0 and our own internal accounts are excluded. It returns nothing about what was pulled and nothing about the buyer beyond an opaque id.

The window is capped at 31 days. For a monthly report, pin both `since` and `until` in the past: the `until = now` default moves between page requests.



## OpenAPI

````yaml /partner-api/openapi.yaml get /api/partner/v1/pulls
openapi: 3.1.0
info:
  title: CatchBack Partner API
  version: 1.0.0
  summary: Open packs, trade cards, read card data and ship vaulted cards.
  description: >-
    The Partner API acts on one CatchBack account with its real Wallet Balance.
    Several

    operations here move money or data, so read
    [Idempotency](/partner-api/idempotency) before

    you call them.


    Error bodies are JSON with a human-readable `error` and, where you might
    branch on it, a

    machine-readable `code`. Branch on the status and the `code`, because the
    `error` text can

    change. New fields can be added to any response.
  contact:
    name: CatchBack support
    email: support@catchbackcards.com
servers:
  - url: https://catchbackcards.com
    description: Production. Every call acts on real money and real inventory.
security:
  - bearerAuth: []
tags:
  - name: Gacha
    description: Open packs, see what they can pull, check a pull, and sell cards back.
  - name: Marketplace
    description: Search and buy cards, and manage your own listings.
  - name: Metadata
    description: Look cards up by id or cert, with price history and recent activity.
  - name: Shipping
    description: Estimate, create and track shipments of cards you hold.
  - name: Account
    description: Your key, balance, limits, vault and order history, across every rail.
  - name: Funding
    description: Deposit and withdraw your balance in USDC.
  - name: Testing
    description: Test logins for trying CatchBack without real money.
  - name: Webhooks
    description: Signed POSTs we send to your URL when something happens on your account.
paths:
  /api/partner/v1/pulls:
    get:
      tags:
        - Gacha
      summary: Purchase report
      description: >-
        **Scope:** `read:pulls`, opt-in, granted on request.


        Every completed pack purchase in a window, for revenue-share reporting.
        Purchases with an `amount` of 0 and our own internal accounts are
        excluded. It returns nothing about what was pulled and nothing about the
        buyer beyond an opaque id.


        The window is capped at 31 days. For a monthly report, pin both `since`
        and `until` in the past: the `until = now` default moves between page
        requests.
      operationId: purchaseReport
      parameters:
        - $ref: '#/components/parameters/Since'
        - $ref: '#/components/parameters/Until'
        - $ref: '#/components/parameters/Page'
        - name: per_page
          in: query
          description: 1–1000. A higher value is treated as 1000.
          schema:
            type: integer
            minimum: 1
            maximum: 1000
            default: 500
      responses:
        '200':
          description: The purchases, oldest first.
          content:
            application/json:
              schema:
                type: object
                required:
                  - since
                  - until
                  - page
                  - per_page
                  - total
                  - pulls
                properties:
                  since:
                    type: string
                    format: date-time
                  until:
                    type: string
                    format: date-time
                  page:
                    type: integer
                  per_page:
                    type: integer
                  total:
                    type:
                      - integer
                      - 'null'
                  pulls:
                    type: array
                    items:
                      type: object
                      required:
                        - user_id
                        - created_at
                        - amount
                        - source
                        - pack_type
                      properties:
                        user_id:
                          type: string
                          description: The buyer as an opaque id.
                        created_at:
                          type: string
                        amount:
                          type: number
                          description: USD.
                        source:
                          type: string
                        pack_type:
                          type:
                            - string
                            - 'null'
                          description: >-
                            The pack's display name, for example `Bronze Pack`.
                            It isn't the `pack_type` id that List packs returns.
              example:
                since: '2026-10-01T00:00:00.000Z'
                until: '2026-10-31T00:00:00.000Z'
                page: 1
                per_page: 500
                total: 1
                pulls:
                  - user_id: 6f1c0000-…
                    created_at: '2026-10-20T04:54:57.373+00:00'
                    amount: 25
                    source: pokemon
                    pack_type: Bronze Pack
        '400':
          description: A malformed or inverted window, or a window over 31 days.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: 'Invalid window: since must be before until'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          description: The key lacks `read:pulls`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          $ref: '#/components/responses/ServerError'
      security:
        - bearerAuth:
            - read:pulls
components:
  parameters:
    Since:
      name: since
      in: query
      description: ISO 8601, inclusive. Defaults to `until` minus 7 days.
      schema:
        type: string
        format: date-time
      example: '2026-10-01T00:00:00Z'
    Until:
      name: until
      in: query
      description: ISO 8601, inclusive. Defaults to now. At most 31 days after `since`.
      schema:
        type: string
        format: date-time
      example: '2026-10-31T00:00:00Z'
    Page:
      name: page
      in: query
      description: 1-based. See [Pagination](/partner-api/pagination).
      schema:
        type: integer
        minimum: 1
        default: 1
  schemas:
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          description: >-
            For people. The text can change, so branch on the status and the
            `code`.
        code:
          type: string
          description: Machine-readable, where you might branch on it.
  responses:
    Unauthorized:
      description: A missing, malformed, disabled or unknown API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Missing or malformed API key
    ServerError:
      description: An error on our side. Retry with backoff.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: cb_live_<48 hex>
      description: >-
        Your API key, sent as a bearer token. Keep it on your server. See
        [Authentication](/partner-api/authentication). A request from a location
        we refuse gets a `403` with `Access denied`, whether or not it has a
        valid key: [where you can call
        from](/partner-api/errors-and-limits#where-you-can-call-from).

````

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