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

# Create an export

> Queues a CSV of this seller's own records.

Only datasets that can be narrowed to a single seller are offered, so
an export can never contain another seller's rows however it is
filtered. The seller and the store come from the request context
whatever the payload says.

Generation runs in the background: poll `GET /api/v3/seller/exports/{id}`
until `done` is true, then fetch `download_url`.




## OpenAPI

````yaml /api-reference/seller.yaml post /api/v3/seller/exports
openapi: 3.0.3
info:
  title: Seller API
  contact:
    name: Spree Commerce
    url: https://spreecommerce.org
    email: hello@spreecommerce.org
  description: |
    Spree Seller API v3 - the marketplace seller panel, where a seller runs
    their own shop inside someone else's marketplace.

    This is a branch of its own, not a narrowing of the Admin API. Every
    endpoint is scoped server-side to the seller the request acts as, which
    is what makes cross-seller access impossible by construction rather
    than by rule. Sellers never call the Admin API.

    ## Authentication

    Sign in at `POST /api/v3/seller/auth/login` and send the returned JWT as
    `Authorization: Bearer <token>`. The token carries a `seller_api`
    audience — a token minted for the storefront or the back office is not
    accepted here, and vice versa.

    There is deliberately **no secret API key** for this branch: a
    credential that could act as a seller without a seller signing in is
    exactly what the separate audience exists to prevent.

    ### Choosing a seller

    A user may run more than one seller. Login returns the list; send the
    chosen seller's ID in the `X-Spree-Seller-Id` header on every
    authenticated request. The store is derived from the seller — never
    sent — so no header can widen what a seller reaches. A request that
    names no seller the caller belongs to is rejected with `403`.

    ## Response Format

    All responses are JSON. List endpoints return paginated responses with
    `data` and `meta` keys.

    ## Error Handling

    Errors return a consistent format:
    ```json
    {
      "error": {
        "code": "validation_error",
        "message": "Validation failed",
        "details": { "name": ["can't be blank"] }
      }
    }
    ```
  version: v3
servers:
  - url: http://{defaultHost}
    variables:
      defaultHost:
        default: localhost:3000
security: []
tags:
  - name: Authentication
    description: Seller sign-in, token refresh, logout, and invitation acceptance
  - name: Account
    description: The signed-in user, the sellers they may act for, and what they may do
  - name: Countries
    description: Country and state reference data for the panel's address forms
  - name: Delivery Methods
    description: >-
      The seller's own ways to ship, and the marketplace methods shared with
      them
  - name: Delivery Profiles
    description: >-
      The marketplace's delivery vocabulary — what kind of goods a product is,
      which decides how it ships
  - name: Delivery Zones
    description: >-
      The marketplace's destinations, for narrowing where a seller's own method
      ships
  - name: Onboarding
    description: >-
      The marketplace checklist a seller completes before admission, and what
      they submit against it
  - name: Policies
    description: The seller's own legal documents, as the marketplace asks them to publish
  - name: Product Types
    description: The types a seller may list a product against, and what each adds
  - name: Products
    description: The seller's own catalog
  - name: Profile
    description: >-
      The seller's own record — presentation, contact details, addresses, and
      tax registration
  - name: Stock Locations
    description: Where the seller keeps stock, and so where their returns are sent
  - name: Team
    description: Who runs this seller, and the invitations nobody has accepted yet
  - name: Files
    description: Uploading the files a profile, a submission or an import uses
paths:
  /api/v3/seller/exports:
    post:
      tags:
        - Exports
      summary: Create an export
      description: >
        Queues a CSV of this seller's own records.


        Only datasets that can be narrowed to a single seller are offered, so

        an export can never contain another seller's rows however it is

        filtered. The seller and the store come from the request context

        whatever the payload says.


        Generation runs in the background: poll `GET
        /api/v3/seller/exports/{id}`

        until `done` is true, then fetch `download_url`.
      parameters:
        - name: X-Spree-Seller-Id
          in: header
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SellerExportCreateParams'
        required: true
      responses:
        '201':
          description: export queued
          content:
            application/json:
              example:
                id: exp_UkLWZg9DAJ
                number: EF1001
                format: csv
                created_at: '2026-01-15T12:00:00.000Z'
                updated_at: '2026-01-15T12:00:00.000Z'
                type: orders
                user_id: adm_UkLWZg9DAJ
                done: false
                filename: null
                byte_size: null
                download_url: null
              schema:
                $ref: '#/components/schemas/Export'
        '422':
          description: type cannot be scoped to one seller
          content:
            application/json:
              example:
                error:
                  code: validation_error
                  message: 'Unsupported export type. Supported types: orders, products'
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - bearer_auth: []
      x-codeSamples:
        - lang: javascript
          label: Spree Seller SDK
          source: |-
            import { createSellerClient } from '@spree/seller-sdk'

            const client = createSellerClient({
              baseUrl: 'https://your-store.com',
              jwtToken: 'eyJhbGciOi...',
              sellerId: 'sel_UkLWZg9DAJ',
            })

            const exp = await client.exports.create({
              type: 'orders',
              search_params: { completed_at_gt: '2026-01-01' },
            })
components:
  schemas:
    SellerExportCreateParams:
      type: object
      properties:
        type:
          type: string
          enum:
            - orders
            - products
          description: Which dataset to export.
        record_selection:
          type: string
          enum:
            - filtered
            - all
          description: >-
            `filtered` (default) keeps `search_params`; `all` exports everything
            this seller owns.
        search_params:
          type: object
          additionalProperties: true
          description: >-
            Ransack predicates, the same shape the list endpoints take. Ignored
            when `record_selection` is `all`.
        results_url:
          type: string
          description: >-
            Panel URL the export-done email links back to. Honored only when it
            matches one of the store's allowed origins.
      required:
        - type
    Export:
      type: object
      properties:
        id:
          type: string
        number:
          type: string
        format:
          type: string
          nullable: true
        created_at:
          type: string
        updated_at:
          type: string
        type:
          type: string
          nullable: true
        user_id:
          type: string
          nullable: true
        done:
          type: boolean
        filename:
          type: string
          nullable: true
        byte_size:
          type: number
          nullable: true
        download_url:
          type: string
          nullable: true
      required:
        - id
        - number
        - format
        - created_at
        - updated_at
        - type
        - user_id
        - done
        - filename
        - byte_size
        - download_url
      x-typelizer: true
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              example: record_not_found
            message:
              type: string
              example: Record not found
            details:
              type: object
              description: Field-specific validation errors
              nullable: true
              example:
                name:
                  - is too short
                  - is required
                email:
                  - is invalid
          required:
            - code
            - message
      required:
        - error
      example:
        error:
          code: validation_error
          message: Validation failed
          details:
            name:
              - is too short
            email:
              - is invalid
  securitySchemes:
    bearer_auth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: JWT token for an authenticated seller session (`seller_api` audience)

````

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