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

# Create products export

> Use this endpoint to kick off a background product export job. Use this when the synchronous list endpoints would require many paginated requests, or when you'd rather fire-and-forget the export and poll for completion later.

###### Required fields:
- `catalog` - product catalog to export from. One of `marketplace`, `swag`, `giftCards`, or `donations`.
- `format` - output file format. Currently `ndjson` only.

###### Optional filters:
- `search` - free-text search filter.
- `brandName` - filter by brand name.
- `brandId` - array of brand IDs.
- `tagId` - array of tag IDs.
- `productIds` - array of specific product IDs to export (max 100).
- `price.gte` / `price.lte` - inclusive price range (flat body fields; see note below).
- `locations` - ISO 3166-1 alpha-2 country codes for price localisation (default `["US"]`).

###### Optional response shaping:
- `include` - related entities to include. One or more of `brand`, `tags`.
- `fields` - computed / expanded fields. One or more of `priceRange`, `variantsCount`, `total`.

###### Optional headers:
- `Snappy-Account-Id` - optional account scoping.
- `Snappy-Company-Id` - optional company scoping.

###### Behavior notes:
- Returns **200 OK** immediately with an `exportId`. The job runs in the background.
- Poll `GET /v3/products/exports/{exportId}` until the job reaches a terminal state (`completed` or `failed`). On completion, the status response includes a `downloadUrls` map of signed URLs (keyed by file identifier or location code).
- The export record expires **48 hours** after creation. Download the file(s) before that - expired records cannot be re-issued; you'll need to create a new export job.
- Body-level price filters use **flat** `price.gte` / `price.lte` fields rather than the nested `filter[price][gte]` / `filter[price][lte]` form used in query strings on V3 list endpoints. Same semantics, different ergonomic surface.

#### Permissions
- Requires: `products:read`



## OpenAPI

````yaml post /v3/products/exports
openapi: 3.0.3
info:
  title: Snappy Public API v3
  version: 3.0.0
  contact:
    name: Snappy Support
    email: info@snappy.com
  description: >-
    Welcome to the Snappy API reference documentation!

    You can use this API to integrate with Snappy and spread smiles to your
    employees/clients/customers and much more.

    So let's get started!
servers:
  - url: https://api.snappy.com/public-api
    description: Base API URL
  - url: https://mtls-api.snappy.com/public-api
    description: >-
      ## mTLS URL

      You can also use mTLS to enhance your API security. To get your specific
      certificates please contact our support.

      Once you configure the certificated correctly, you need to also update
      endpoints to use the following secure api base URL:
security: []
tags:
  - name: Products
    description: >-
      Use these endpoints to retrieve products and tags for building catalog and
      browse experiences in your UI.
  - name: Collections
    description: >-
      Use these endpoints to retrieve products within curated collections for
      marketplace and browse experiences.
  - name: Variants
    description: >-
      Use these endpoints to retrieve variants, variant pricing, and country
      availability for orderable product SKUs.
  - name: Billing Methods
    description: >-
      A **Billing Method** is the funding source attached to an **Account** -
      for example, a Purchase Order (PO), Invoice, Prepay deposit, or Credit
      Card. Use these endpoints to retrieve billing method details such as
      remaining balance, status, and expiration.
  - name: Accounts
    description: >-
      An **Account** is a sub-entity within a **Company**, used to organize
      campaigns and gift sends. Use these endpoints to list, retrieve, and
      create accounts.
  - name: API Keys
    description: >-
      Use these endpoints to manage API keys for programmatic access. Key
      management requires company owner privileges.
  - name: Orders
    description: >-
      Use these endpoints to place, retrieve, cancel, and validate orders and
      shipping addresses.
paths:
  /v3/products/exports:
    post:
      tags:
        - Export
      summary: Create products export
      description: >-
        Use this endpoint to kick off a background product export job. Use this
        when the synchronous list endpoints would require many paginated
        requests, or when you'd rather fire-and-forget the export and poll for
        completion later.


        ###### Required fields:

        - `catalog` - product catalog to export from. One of `marketplace`,
        `swag`, `giftCards`, or `donations`.

        - `format` - output file format. Currently `ndjson` only.


        ###### Optional filters:

        - `search` - free-text search filter.

        - `brandName` - filter by brand name.

        - `brandId` - array of brand IDs.

        - `tagId` - array of tag IDs.

        - `productIds` - array of specific product IDs to export (max 100).

        - `price.gte` / `price.lte` - inclusive price range (flat body fields;
        see note below).

        - `locations` - ISO 3166-1 alpha-2 country codes for price localisation
        (default `["US"]`).


        ###### Optional response shaping:

        - `include` - related entities to include. One or more of `brand`,
        `tags`.

        - `fields` - computed / expanded fields. One or more of `priceRange`,
        `variantsCount`, `total`.


        ###### Optional headers:

        - `Snappy-Account-Id` - optional account scoping.

        - `Snappy-Company-Id` - optional company scoping.


        ###### Behavior notes:

        - Returns **200 OK** immediately with an `exportId`. The job runs in the
        background.

        - Poll `GET /v3/products/exports/{exportId}` until the job reaches a
        terminal state (`completed` or `failed`). On completion, the status
        response includes a `downloadUrls` map of signed URLs (keyed by file
        identifier or location code).

        - The export record expires **48 hours** after creation. Download the
        file(s) before that - expired records cannot be re-issued; you'll need
        to create a new export job.

        - Body-level price filters use **flat** `price.gte` / `price.lte` fields
        rather than the nested `filter[price][gte]` / `filter[price][lte]` form
        used in query strings on V3 list endpoints. Same semantics, different
        ergonomic surface.


        #### Permissions

        - Requires: `products:read`
      operationId: postProductsExportAsyncV3
      parameters:
        - schema:
            type: string
            description: Optional account identifier for swag validation/filtering.
            example: acc123456
          required: false
          description: Optional account identifier for swag validation/filtering.
          name: snappy-account-id
          in: header
        - schema:
            type: string
            description: Optional company identifier for swag validation/filtering.
            example: cmp123456
          required: false
          description: Optional company identifier for swag validation/filtering.
          name: snappy-company-id
          in: header
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostProductsExportAsyncV3Body'
      responses:
        '200':
          description: >-
            Export job accepted (**200 OK**). Poll the returned `exportId` via
            `GET /v3/products/exports/{exportId}`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostProductsExportAsyncV3Response'
        '400':
          description: Bad Request - Invalid or missing body fields.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseV3'
              example:
                message: Request validation failed.
                errorCode: 400_PBLC_001
        '401':
          description: Unauthorized.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseV3'
        '403':
          description: Forbidden.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseV3'
        '404':
          description: Not Found - Referenced resource does not exist.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseV3'
      security:
        - ApiKeyAuthentication: []
components:
  schemas:
    PostProductsExportAsyncV3Body:
      type: object
      properties:
        catalog:
          allOf:
            - $ref: '#/components/schemas/ProductCatalogV3'
            - description: >-
                Product catalog to export from (`marketplace` | `swag` |
                `giftCards` | `donations`).
        format:
          type: string
          enum:
            - ndjson
          description: Output file format. Async export is NDJSON-only.
          example: ndjson
        search:
          type: string
          description: Free-text search filter.
        brandName:
          type: string
          description: Filter by brand name.
        brandId:
          type: array
          items:
            type: string
          description: Filter by one or more brand IDs.
        tagId:
          type: array
          items:
            type: string
          description: Filter by one or more tag IDs.
        price:
          type: object
          properties:
            gte:
              type: number
              minimum: 0
              description: Inclusive minimum price filter.
            lte:
              type: number
              minimum: 0
              description: Inclusive maximum price filter.
          description: >-
            Inclusive price range using flat `price.gte` / `price.lte` fields
            (not the nested `filter[price][gte]` / `filter[price][lte]`
            query-string form).
        productIds:
          type: array
          items:
            type: string
          maxItems: 100
          description: Limit export to up to 100 specific product IDs.
        locations:
          type: array
          items:
            type: string
            pattern: ^[A-Z]{2}$
          default:
            - US
          description: >-
            ISO 3166-1 alpha-2 country codes used for price localisation.
            Defaults to `["US"]`.
          example:
            - US
        include:
          type: array
          items:
            $ref: '#/components/schemas/ProductIncludeV3'
          minItems: 1
          description: Related entities to include.
          example:
            - brand
            - tags
        fields:
          type: array
          items:
            $ref: '#/components/schemas/ProductListFieldsV3'
          minItems: 1
          description: Computed or expanded product fields for list responses.
          example:
            - priceRange
            - variantsCount
      required:
        - catalog
        - format
      additionalProperties: false
      description: >-
        Request body for an async export job. Price filters use flat body fields
        rather than query-string `filter[price][...]` syntax.
    PostProductsExportAsyncV3Response:
      type: object
      properties:
        exportId:
          type: string
          description: >-
            Export job identifier. Poll `GET /v3/products/exports/{exportId}`
            until the job reaches a terminal state.
          example: 6650a1b2c3d4e5f6a7b8c9d0
      required:
        - exportId
      description: >-
        Export job accepted. The job runs in the background; poll `GET
        /v3/products/exports/{exportId}` for status.
    ErrorResponseV3:
      type: object
      properties:
        message:
          type: string
          description: Human-readable error message.
          example: Product not found.
        errorCode:
          type: string
          description: Structured error code.
          example: 404_PROD_001
        errors:
          type: array
          items:
            type: object
            properties:
              message:
                type: string
                example: Product with id 'q1w2e3r4t5' was not found
              path:
                type: string
                description: Dot-separated path to the field that caused the error.
                example: pathParameters.productId
              errorCode:
                type: string
                example: 404_PROD_001
            required:
              - message
              - path
          description: Optional field-level error details.
      required:
        - message
        - errorCode
      description: Standard v3 error envelope.
    ProductCatalogV3:
      type: string
      enum:
        - marketplace
        - swag
        - giftCards
        - donations
      default: marketplace
      description: >-
        Which product catalog to search. Required on product list/search
        endpoints. Defaults to marketplace.
      example: marketplace
    ProductIncludeV3:
      type: string
      enum:
        - brand
        - tags
      description: Related entities to include.
      example: brand
    ProductListFieldsV3:
      type: string
      enum:
        - priceRange
        - variantsCount
        - total
      description: Computed or expanded fields for product list responses.
      example: priceRange
  securitySchemes:
    ApiKeyAuthentication:
      type: apiKey
      in: header
      name: X-Api-Key
      description: |-
        ## Company Level Authentication

        Include your API key in the `X-Api-Key` header for every request:
        ```
        X-Api-Key: YOUR_API_KEY
        ```

````