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

# Validate a non-authorizing prepared-media print order

> Accepts exactly one JSON object up to 2 MiB and rejects unknown fields. environment is used only for structural preflight and cannot quote, create, pay for, upload media for, or submit an order. Authenticated quote and submission routes derive their fulfillment lane from the API credential. Clients must fetch the catalog and use the selected product revision's asset requirements, text requirements, and options.



## OpenAPI

````yaml https://api.batchrelay.com/openapi.json post /v1/print-orders/validate
openapi: 3.1.0
info:
  description: >-
    Provider-neutral print catalog and prepared-media validation. This document
    covers only routes owned by the Go service; it deliberately excludes
    migration-proxied order lifecycle routes and all provider payloads.
  license:
    name: Proprietary
    url: https://github.com/SENTINELITE/Batch-Relay-Go/blob/main/README.md
  title: Batch Relay API
  version: 1.0.1
servers:
  - url: https://api.batchrelay.com
security: []
tags:
  - description: Service health and the public API description.
    name: System
  - description: Test Mode session creation and API credential entry points.
    name: Authentication
  - description: >-
      Provider-neutral canonical catalog resources and platform-owned semantic
      definitions.
    name: Catalog
  - description: Studio-scoped guest checkout-link management.
    name: Checkout links
  - description: >-
      One-way operational event messages. Alert emails contain no message body
      and recipients read messages after Batch Relay authentication.
    name: Studio messages
  - description: >-
      Explicit, reviewable sandbox-to-Live promotion plans for forms, catalog,
      and storefront configuration.
    name: Sandbox promotions
  - description: Provider-neutral validation, quoting, and order lifecycle operations.
    name: Print orders
  - description: Managed fulfillment asset ingestion and metadata.
    name: Managed assets
  - description: Studio-scoped original asset upload sessions and objects.
    name: Studio assets
  - description: Prepared and confirmed event roster team changes.
    name: Event team changes
  - description: Authenticated studio, event, and form-management operations.
    name: Studio management
  - description: >-
      Authenticated studio retail catalog management. Draft and publication
      lifecycles are explicit per product or package.
    name: Studio catalog
  - description: >-
      Authenticated singular storefront assortment management. PATCH atomically
      publishes a new immutable assortment revision; no storefront draft
      lifecycle exists yet.
    name: Storefront
  - description: Managed media used by the studio retail catalog.
    name: Studio catalog assets
  - description: Template rendering job creation and retrieval.
    name: Template renders
  - description: >-
      Published browser-side template packages and short-lived server proof
      renders. Preview artifacts are never fulfillment artwork.
    name: Browser previews
  - description: API account and credential administration.
    name: API accounts
paths:
  /v1/print-orders/validate:
    parameters:
      - $ref: '#/components/parameters/ClientSurface'
      - $ref: '#/components/parameters/ClientVersion'
      - $ref: '#/components/parameters/InvocationMode'
    post:
      tags:
        - Print orders
      summary: Validate a non-authorizing prepared-media print order
      description: >-
        Accepts exactly one JSON object up to 2 MiB and rejects unknown fields.
        environment is used only for structural preflight and cannot quote,
        create, pay for, upload media for, or submit an order. Authenticated
        quote and submission routes derive their fulfillment lane from the API
        credential. Clients must fetch the catalog and use the selected product
        revision's asset requirements, text requirements, and options.
      operationId: validatePrintOrder
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OrderValidationRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationResponse'
          description: Validated, immutable fulfillment plan
        '400':
          $ref: '#/components/responses/InvalidRequestJSON'
        '413':
          $ref: '#/components/responses/RequestTooLarge'
        '422':
          $ref: '#/components/responses/OrderValidationFailed'
      security: []
components:
  parameters:
    ClientSurface:
      description: >-
        Untrusted optional analytics hint naming the calling client surface. It
        never affects authorization, routing, pricing, or behavior.
      in: header
      name: X-BatchRelay-Client-Surface
      required: false
      schema:
        maxLength: 100
        minLength: 1
        type: string
    ClientVersion:
      description: >-
        Untrusted optional analytics hint naming the calling client version. It
        never affects authorization, routing, pricing, or behavior.
      in: header
      name: X-BatchRelay-Client-Version
      required: false
      schema:
        maxLength: 100
        minLength: 1
        type: string
    InvocationMode:
      description: >-
        Untrusted optional analytics hint naming the invocation mode. It never
        affects authorization, routing, pricing, or behavior.
      in: header
      name: X-BatchRelay-Invocation-Mode
      required: false
      schema:
        maxLength: 100
        minLength: 1
        type: string
  schemas:
    OrderValidationRequest:
      additionalProperties: false
      properties:
        customer:
          $ref: '#/components/schemas/CustomerContact'
        environment:
          description: Used only for this non-authorizing structural validation request.
          enum:
            - sandbox
            - production
          type: string
        external_order_id:
          minLength: 1
          type: string
        items:
          items:
            $ref: '#/components/schemas/OrderLine'
          minItems: 1
          type: array
        schema_version:
          const: 1
          type: integer
        ship_from:
          $ref: '#/components/schemas/Address'
        ship_to:
          $ref: '#/components/schemas/Address'
        shipping_service:
          $ref: '#/components/schemas/ShippingService'
      required:
        - schema_version
        - environment
        - external_order_id
        - ship_to
        - ship_from
        - shipping_service
        - items
      type: object
    ValidationResponse:
      additionalProperties: false
      properties:
        plan:
          $ref: '#/components/schemas/FulfillmentPlan'
      required:
        - plan
      type: object
    CustomerContact:
      additionalProperties: false
      description: For quote and submit API routes, at least email or phone is required.
      properties:
        email:
          format: email
          type: string
        external_id:
          type: string
        name:
          type: string
        phone:
          pattern: ^\+[1-9][0-9]{1,14}$
          type: string
      type: object
    OrderLine:
      additionalProperties: false
      properties:
        assets:
          items:
            $ref: '#/components/schemas/OrderAssetSource'
          type: array
        options:
          items:
            $ref: '#/components/schemas/OptionSelection'
          type: array
        product:
          $ref: '#/components/schemas/ProductReference'
        quantity:
          minimum: 1
          type: integer
        texts:
          description: >-
            Text values keyed by the selected product's published semantic
            slots. Each slot may occur at most once; preserve intentional
            whitespace exactly.
          items:
            $ref: '#/components/schemas/TextValue'
          type: array
      required:
        - product
        - quantity
        - assets
      type: object
    Address:
      additionalProperties: false
      properties:
        address_1:
          minLength: 1
          type: string
        address_2:
          type: string
        city:
          minLength: 1
          type: string
        country:
          minLength: 1
          type: string
        name:
          minLength: 1
          type: string
        phone:
          description: E.164 phone number, for example +16516468263
          pattern: ^\+[1-9][0-9]{1,14}$
          type: string
        postal_code:
          minLength: 1
          type: string
        state:
          minLength: 1
          type: string
      required:
        - name
        - address_1
        - city
        - state
        - postal_code
        - country
        - phone
      type: object
    ShippingService:
      description: >-
        Required domestic US delivery service. The server freezes the exact
        deterministic provider shipping quote before payment; a service can be
        unavailable when provider eligibility, a one-day zone result, or
        required provider cost evidence is unavailable.
      enum:
        - economy_untracked
        - economy
        - expedited
        - standard_one_day
        - priority_one_day
      type: string
    FulfillmentPlan:
      additionalProperties: false
      properties:
        environment:
          enum:
            - sandbox
            - production
          type: string
        external_order_id:
          type: string
        lines:
          items:
            $ref: '#/components/schemas/PlannedLine'
          type: array
        schema_version:
          const: 1
          type: integer
        ship_from:
          $ref: '#/components/schemas/Address'
        ship_to:
          $ref: '#/components/schemas/Address'
        shipping_service:
          $ref: '#/components/schemas/ShippingService'
      required:
        - schema_version
        - environment
        - external_order_id
        - ship_to
        - ship_from
        - shipping_service
        - lines
      type: object
    Error:
      additionalProperties: false
      properties:
        code:
          description: Stable machine-readable error code.
          type: string
        docs_url:
          format: uri
          type: string
        error:
          description: Backward-compatible human-readable error.
          type: string
        message:
          type: string
        request_id:
          type: string
      required:
        - error
        - code
        - message
        - docs_url
        - request_id
      type: object
    OrderAssetSource:
      additionalProperties: false
      description: >-
        Public asset source. Supply role plus exactly one of url or asset_id.
        Batch Relay resolves and freezes immutable metadata during quote;
        optional metadata is a non-authoritative preflight hint. Products with
        template_requirement=required accept only the asset_id from a succeeded
        Batch Relay template render plus template_render_id. Public submission
        never passes a source URL to a provider.
      oneOf:
        - required:
            - url
        - required:
            - asset_id
      properties:
        asset_id:
          description: >-
            Existing authorized bra_ managed asset or same-studio image asset;
            reused in place.
          type: string
        file_size_bytes:
          description: Optional non-authoritative preflight hint.
          minimum: 1
          type: integer
        format:
          description: Optional non-authoritative preflight hint.
          enum:
            - jpeg
            - png
            - tiff
          type: string
        hash:
          type: string
        origin:
          $ref: '#/components/schemas/AssetOrigin'
          description: >-
            Ignored for template provenance; the server derives it from
            template_render_id.
        pixel_height:
          description: Optional non-authoritative preflight hint.
          minimum: 1
          type: integer
        pixel_width:
          description: Optional non-authoritative preflight hint.
          minimum: 1
          type: integer
        printed_file_name:
          type: string
        role:
          $ref: '#/components/schemas/AssetRole'
        template_render_id:
          description: >-
            Required with asset_id for a template-required product. Batch Relay
            verifies the succeeded render owns the selected artifact.
          type: string
        url:
          description: HTTPS source copied into managed fulfillment storage during quote.
          format: uri
          pattern: ^https://
          type: string
      required:
        - role
      type: object
    OptionSelection:
      additionalProperties: false
      properties:
        option_id:
          minLength: 1
          type: string
        value:
          minLength: 1
          type: string
      required:
        - option_id
        - value
      type: object
    ProductReference:
      additionalProperties: false
      properties:
        id:
          minLength: 1
          type: string
        revision:
          minimum: 1
          type: integer
      required:
        - id
        - revision
      type: object
    TextValue:
      additionalProperties: false
      properties:
        slot:
          $ref: '#/components/schemas/TextSlotID'
        value:
          type: string
      required:
        - slot
        - value
      type: object
    PlannedLine:
      additionalProperties: false
      properties:
        product:
          $ref: '#/components/schemas/Product'
        request:
          $ref: '#/components/schemas/OrderLine'
      required:
        - request
        - product
      type: object
    AssetOrigin:
      additionalProperties: false
      properties:
        design_id:
          type: string
        design_version:
          minimum: 1
          type: integer
        kind:
          $ref: '#/components/schemas/AssetOriginKind'
        template_render_id:
          readOnly: true
          type: string
        template_revision_id:
          readOnly: true
          type: string
      type: object
    AssetRole:
      enum:
        - artwork
        - background
        - individual
        - team
        - logo
        - front
        - back
      type: string
    TextSlotID:
      enum:
        - text-1
        - text-2
        - text-3
        - text-4
        - text-5
        - text-6
      type: string
    Product:
      additionalProperties: false
      allOf:
        - oneOf:
            - properties:
                fulfillment_type:
                  const: print
                tax_category:
                  const: physical_print
              required:
                - physical_output
            - not:
                properties:
                  physical_output: {}
                required:
                  - physical_output
              properties:
                category:
                  const: digital-downloads
                fulfillment_type:
                  const: digital
                tax_category:
                  const: digital_download
      properties:
        asset_requirements:
          items:
            $ref: '#/components/schemas/AssetRequirement'
          type: array
        category:
          enum:
            - prints
            - keepsakes
            - trader-products
            - composites
            - digital-downloads
          type: string
        consumer_quantity:
          $ref: '#/components/schemas/ConsumerQuantity'
        description:
          type: string
        family:
          $ref: '#/components/schemas/ProductFamilyReference'
        fulfillment_target:
          $ref: '#/components/schemas/ProductReference'
          description: >-
            The standard physical product used for provider-neutral routing
            after a composed product has flattened to finished artwork.
        fulfillment_type:
          enum:
            - print
            - digital
          type: string
        id:
          description: Stable canonical product identifier.
          type: string
        lifecycle:
          $ref: '#/components/schemas/ProductLifecycle'
        name:
          type: string
        options:
          items:
            $ref: '#/components/schemas/ProductOption'
          type: array
        physical_output:
          $ref: '#/components/schemas/PhysicalOutput'
          description: >-
            Required for physical print products and omitted for digital
            products.
        prepared_artwork:
          $ref: '#/components/schemas/PreparedArtworkGeometry'
        print_safety_profile:
          $ref: '#/components/schemas/PrintSafetyProfile'
        revision:
          description: Immutable fulfillment-contract revision.
          minimum: 1
          type: integer
        tax_category:
          enum:
            - physical_print
            - digital_download
          type: string
        template_requirement:
          description: >-
            Product-specific template policy. required accepts only artwork from
            a succeeded Batch Relay template render; optional accepts either a
            compatible rendered output or direct prepared artwork; unsupported
            has no template workflow.
          enum:
            - required
            - optional
            - unsupported
          type: string
        text_requirements:
          description: >-
            Provider-neutral ordered text slots supported by this product. The
            current catalog publishes six generic Memory Mate slots while final
            visual/provider field labels are under verification; clients must
            use the returned slot IDs rather than infer provider node IDs.
          items:
            $ref: '#/components/schemas/TextRequirement'
          type: array
        unit_costs:
          items:
            $ref: '#/components/schemas/UnitCost'
          type: array
        units_per_quantity:
          description: Units produced or delivered by one line quantity.
          minimum: 1
          type: integer
        variant_attributes:
          $ref: '#/components/schemas/ProductVariantAttributes'
      required:
        - id
        - revision
        - name
        - description
        - family
        - variant_attributes
        - category
        - fulfillment_type
        - tax_category
        - units_per_quantity
        - options
        - unit_costs
        - asset_requirements
        - template_requirement
        - lifecycle
      type: object
    AssetOriginKind:
      enum:
        - whcc-preset
        - batch-relay-design
        - studio-design
        - community-design
        - custom-upload
      type: string
    AssetRequirement:
      additionalProperties: false
      properties:
        aspect_ratio:
          $ref: '#/components/schemas/AspectRatio'
        required:
          type: boolean
        role:
          $ref: '#/components/schemas/AssetRole'
        rotation_policy:
          description: >-
            Whether the prepared asset may use the transposed aspect
            orientation. Fixed is the default for templates and multi-asset
            layouts.
          enum:
            - fixed
            - allowed
          type: string
      required:
        - role
        - aspect_ratio
        - required
        - rotation_policy
      type: object
    ConsumerQuantity:
      additionalProperties: false
      properties:
        container_plural:
          minLength: 1
          type: string
        container_singular:
          minLength: 1
          type: string
        unit_plural:
          minLength: 1
          type: string
        unit_singular:
          minLength: 1
          type: string
      required:
        - unit_singular
        - unit_plural
      type: object
    ProductFamilyReference:
      additionalProperties: false
      description: >-
        Discovery grouping shared by related immutable products. Do not use a
        family ID in an order.
      properties:
        id:
          minLength: 1
          type: string
        name:
          minLength: 1
          type: string
      required:
        - id
        - name
      type: object
    ProductLifecycle:
      additionalProperties: false
      properties:
        replacement_product_id:
          description: >-
            A recommended canonical replacement. Deprecated products remain
            decodable for historical records but cannot be planned for new
            fulfillment.
          type: string
        status:
          enum:
            - active
            - deprecated
          type: string
      required:
        - status
      type: object
    ProductOption:
      additionalProperties: false
      properties:
        affects_price:
          description: Whether a selected value can change the provider unit cost.
          type: boolean
        default_value:
          type: string
        id:
          type: string
        name:
          type: string
        values:
          items:
            type: string
          type: array
      required:
        - id
        - name
        - values
        - default_value
        - affects_price
      type: object
    PhysicalOutput:
      additionalProperties: false
      properties:
        height:
          exclusiveMinimum: 0
          type: number
        unit:
          const: inches
          type: string
        width:
          exclusiveMinimum: 0
          type: number
      required:
        - width
        - height
        - unit
      type: object
    PreparedArtworkGeometry:
      additionalProperties: false
      properties:
        finished_area:
          $ref: '#/components/schemas/ArtworkArea'
        important_content_area:
          $ref: '#/components/schemas/ArtworkArea'
        output_bounds_in:
          $ref: '#/components/schemas/ArtworkSize'
        output_dpi:
          maximum: 1200
          minimum: 72
          type: integer
      required:
        - output_bounds_in
        - output_dpi
        - finished_area
        - important_content_area
      type: object
    PrintSafetyProfile:
      additionalProperties: false
      properties:
        expected_trim_fraction_per_edge:
          minimum: 0
          type: number
        id:
          minLength: 1
          type: string
        important_content_inset_in:
          minimum: 0
          type: number
        minimum_border_inset_in:
          minimum: 0
          type: number
        mounted:
          type: boolean
        trim_bottom_in:
          minimum: 0
          type: number
        trim_left_in:
          minimum: 0
          type: number
        trim_right_in:
          minimum: 0
          type: number
        trim_top_in:
          minimum: 0
          type: number
        version:
          minimum: 1
          type: integer
      required:
        - id
        - version
        - expected_trim_fraction_per_edge
        - trim_left_in
        - trim_top_in
        - trim_right_in
        - trim_bottom_in
        - important_content_inset_in
        - minimum_border_inset_in
      type: object
    TextRequirement:
      additionalProperties: false
      properties:
        allow_blank:
          type: boolean
        name:
          description: >-
            Current public label. Memory Mate labels are intentionally generic
            while final visual/provider-field mapping is under verification.
          type: string
        slot:
          $ref: '#/components/schemas/TextSlotID'
      required:
        - slot
        - name
        - allow_blank
      type: object
    UnitCost:
      additionalProperties: false
      properties:
        option_values:
          items:
            $ref: '#/components/schemas/OptionSelection'
          type: array
        pricing_status:
          description: Confidence state for this exact option combination.
          enum:
            - unverified
            - sandbox_quote
            - production_verified
          type: string
        unit_cost_cents:
          description: >-
            Provider PPU in cents. Null means the price is not yet established;
            zero is a real zero price.
          minimum: 0
          type:
            - integer
            - 'null'
      required:
        - option_values
        - unit_cost_cents
        - pricing_status
      type: object
    ProductVariantAttributes:
      additionalProperties:
        type: string
      description: >-
        Display and filtering attributes for one immutable variant. These values
        do not replace the product ID and revision in an order.
      type: object
    AspectRatio:
      additionalProperties: false
      properties:
        height:
          minimum: 1
          type: integer
        width:
          minimum: 1
          type: integer
      required:
        - width
        - height
      type: object
    ArtworkArea:
      additionalProperties: false
      properties:
        center_in:
          $ref: '#/components/schemas/ArtworkPoint'
        diameter_in:
          exclusiveMinimum: 0
          type: number
        inset_in:
          $ref: '#/components/schemas/ArtworkInsets'
        kind:
          enum:
            - rectangle
            - circle
          type: string
      required:
        - kind
      type: object
    ArtworkSize:
      additionalProperties: false
      properties:
        height:
          exclusiveMinimum: 0
          type: number
        width:
          exclusiveMinimum: 0
          type: number
      required:
        - width
        - height
      type: object
    ArtworkPoint:
      additionalProperties: false
      properties:
        x:
          minimum: 0
          type: number
        'y':
          minimum: 0
          type: number
      required:
        - x
        - 'y'
      type: object
    ArtworkInsets:
      additionalProperties: false
      properties:
        bottom:
          minimum: 0
          type: number
        left:
          minimum: 0
          type: number
        right:
          minimum: 0
          type: number
        top:
          minimum: 0
          type: number
      required:
        - left
        - top
        - right
        - bottom
      type: object
  responses:
    InvalidRequestJSON:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: >-
        The body was malformed, contained unknown fields, or was not exactly one
        JSON object.
    RequestTooLarge:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: The body exceeded 2 MiB.
    OrderValidationFailed:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: >-
        The order did not satisfy the catalog, option, quantity, address, or
        prepared-media requirements.

````