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

# Validate Bulk Upload

> Dry-run a CSV upload before placing any orders

Dry-run a CSV upload: every row is validated and the estimated spend is
calculated, but **no orders are placed**. Use this to show a confirmation
preview before calling [Create Bulk Upload](/docs/v2/api-reference/orders/create-bulk-upload).

## Request

Send the parsed CSV as JSON:

* **filename** *(optional)* — Original uploaded filename, for display.
* **rows** — Array of objects, one per CSV row, mapping column header to cell value.

```json theme={null}
{
  "filename": "may-orders.csv",
  "rows": [
    {
      "product_url": "https://www.amazon.com/dp/B08N5WRWNW",
      "quantity": "2",
      "name": "Jane Doe",
      "address1": "123 Main St",
      "city": "Portland",
      "state": "OR",
      "zip": "97201",
      "max_price": "4999",
      "internal_ref": "PO-1042"
    }
  ]
}
```

Columns that don't map to a known order field are echoed back as
`passthrough` data on each row and included in the results CSV.

## Response

The summary tells you whether the batch is safe to place:

* **total\_rows** / **valid\_rows** / **invalid\_rows** — Row counts.
* **estimated\_total\_cents** — Estimated spend across all valid rows.
* **wallet\_balance\_cents** — Your current wallet balance.
* **sufficient\_funds** — Whether your balance covers the estimate.
* **rows** — Per-row validation results, each with `ok` and any `errors`.

<Tip>
  Surface `rows[].errors` to the user so they can fix the CSV and re-validate.
  Only call [Create Bulk Upload](/docs/v2/api-reference/orders/create-bulk-upload)
  once `invalid_rows` is `0` and `sufficient_funds` is `true`.
</Tip>


## OpenAPI

````yaml versions/latest.json POST /orders/bulk/validate
openapi: 3.1.0
info:
  title: Zinc
  summary: >-
    Zinc lets you search, buy, and return items from top online retailers with a
    single API.
  description: >-
    Search, buy, and return items from top online retailers with a single API.
    Supports AI agent ordering via MPP (HTTP 402) — no account required.
    Supported retailers include 1-800-Flowers, Ace Hardware, Amazon, Amazon DE,
    Best Buy, Lowe's, Partstown, Pokémon Center, Target, The Home Depot,
    Walmart, Wayfair, and 2 more. Ships to the US and 1 other country (DE).
  version: '2026-07-10'
  x-logo:
    url: https://mintlify.s3.us-west-1.amazonaws.com/zinc/logo/light.png
  contact:
    name: Zinc API Support
    email: support@zinc.com
    url: https://zinc.com/docs
  x-guidance: >-
    Zinc lets AI agents buy products from online retailers via a single API. Use
    POST /agent/orders to place an order — no Zinc account needed, payment is
    handled via MPP (HTTP 402 flow). Provide a product URL from a supported
    retailer, a shipping address, and max_price in cents. The API charges
    max_price + $1 API fee upfront and refunds the difference on completion. To
    find products first, the /agent/* data endpoints (search, products/search,
    products/offers, products/details) are MPP-paid at $0.01 per call;
    /agent/search returns orderable URLs to feed straight into /agent/orders.
    GET /retailers lists supported retailers for free (no payment or account).
    Authenticated equivalents (orders, products, managed-accounts) require a
    Bearer token (API key prefixed zn_). Docs: https://zinc.com/docs Supported
    retailers include 1-800-Flowers, Ace Hardware, Amazon, Amazon DE, Best Buy,
    Lowe's, Partstown, Pokémon Center, Target, The Home Depot, Walmart, Wayfair,
    and 2 more, shipping to the US and 1 other country (DE).
  x-supported-retailers:
    - 1-800-Flowers
    - Ace Hardware
    - Amazon
    - Amazon DE
    - Best Buy
    - Lowe's
    - Partstown
    - Pokémon Center
    - Target
    - The Home Depot
    - Walmart
    - Wayfair
    - Zinc
    - eBay
  x-supported-countries:
    - US
    - DE
servers:
  - url: https://api.zinc.com
    description: Production
security:
  - BearerAuth: []
paths:
  /orders/bulk/validate:
    post:
      tags:
        - orders
      summary: Validate Bulk Upload
      description: |-
        Dry-run a CSV upload: validate every row and report estimated spend.

        No orders are placed. Use this to show the confirmation preview before
        calling POST /orders/bulk.
      operationId: validate_bulk_upload_orders_bulk_validate_post
      parameters:
        - name: authorization
          in: header
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Authorization
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkUploadRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkValidateResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
components:
  schemas:
    BulkUploadRequest:
      properties:
        filename:
          anyOf:
            - type: string
            - type: 'null'
          title: Filename
          description: Original uploaded filename, for display.
        rows:
          items:
            additionalProperties: true
            type: object
          type: array
          title: Rows
          description: Parsed CSV rows, each a mapping of column header to cell value.
      type: object
      title: BulkUploadRequest
      description: Raw CSV rows (header -> cell) posted from the dashboard.
    BulkValidateResponse:
      properties:
        filename:
          anyOf:
            - type: string
            - type: 'null'
          title: Filename
        total_rows:
          type: integer
          title: Total Rows
        valid_rows:
          type: integer
          title: Valid Rows
        invalid_rows:
          type: integer
          title: Invalid Rows
        estimated_total_cents:
          type: integer
          title: Estimated Total Cents
        wallet_balance_cents:
          type: integer
          title: Wallet Balance Cents
        sufficient_funds:
          type: boolean
          title: Sufficient Funds
        rows:
          items:
            $ref: '#/components/schemas/BulkRowValidation'
          type: array
          title: Rows
      type: object
      required:
        - total_rows
        - valid_rows
        - invalid_rows
        - estimated_total_cents
        - wallet_balance_cents
        - sufficient_funds
      title: BulkValidateResponse
      description: Dry-run summary returned before any orders are placed.
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    BulkRowValidation:
      properties:
        index:
          type: integer
          title: Index
          description: Zero-based row index in the uploaded file.
        ok:
          type: boolean
          title: Ok
        errors:
          items:
            type: string
          type: array
          title: Errors
        product_urls:
          items:
            type: string
          type: array
          title: Product Urls
        quantities:
          items:
            type: integer
          type: array
          title: Quantities
        recipient:
          anyOf:
            - type: string
            - type: 'null'
          title: Recipient
        destination:
          anyOf:
            - type: string
            - type: 'null'
          title: Destination
        max_price:
          anyOf:
            - type: integer
            - type: 'null'
          title: Max Price
        retailer_credentials_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Retailer Credentials Id
        passthrough:
          additionalProperties: true
          type: object
          title: Passthrough
      type: object
      required:
        - index
        - ok
      title: BulkRowValidation
      description: Per-row result of a dry-run validation.
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    BearerAuth:
      type: apiKey
      in: header
      name: Authorization
      description: Zinc API key (Bearer zn_...)

````