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

# Price choices on an option set

> Checks an option set and prices up to 25 sets of choices on it, line by line, with the engine that prices the cart: an option set being built (`config`) or one of the store's (`optionSetId`). Choices left out take the set's defaults. Writes nothing. With `config` it works for any account.



## OpenAPI

````yaml openapi.json POST /v2/print-options/quote
openapi: 3.1.0
info:
  title: Print.App API
  version: 2.1.0
  description: >-
    Server-to-server API for Print.App integrations: designs and their page
    content, folders, files, fonts, palettes, product assignments, projects and
    editor links. Authenticate every request with a secret key: `Authorization:
    Bearer sk_…`. Never call it from a browser.
servers:
  - url: https://api.print.app
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Account
    description: The account a secret key belongs to.
  - name: Designs
    description: >-
      The designs (templates) your customers start from: create them at a size,
      manage their pages, and place text, images and shapes on them.
  - name: Design folders
    description: >-
      Folders that organise your designs. A design can sit in more than one
      folder.
  - name: Files
    description: >-
      Your own images and graphics, used in designs and offered to customers in
      the editor.
  - name: Graphic folders
    description: >-
      Folders of files, shown in the editor under Pictures, Backgrounds,
      Textures or Frames.
  - name: Fonts
    description: >-
      The fonts your designs and customers can use: the built-in set, imported
      Google fonts and fonts you upload.
  - name: Palettes
    description: Colour palettes offered in the editor.
  - name: Products
    description: Which designs open for each product (and variant) in your store.
  - name: Projects
    description: Your customers' saved designs.
  - name: Links
    description: >-
      Project URLs (the dashboard's Create new Project URL): shareable links
      that open a design or project in the editor at create.print.app, to share
      with customers or to test a design.
  - name: Connectors
    description: >-
      Links between the options on a store's product page and the editor: the
      choice a customer makes shows the right pages, opens the right design, or
      sets the size, orientation or colour. Read a product page for what a
      connector can point at, and test one against a design before customers
      meet it.
  - name: Print Options
    description: >-
      Print Options is Print.App's free product options app (options.print.app):
      the sizes, papers, quantities and prices customers choose on a product
      page, priced on our servers when they add to cart. An option set is those
      questions and their prices; Print.App designs fill its artwork step, and
      connectors read its answers. Option sets are managed here for Shopify
      stores with both apps installed; templates and quotes work for any
      account.
  - name: Resource profiles
    description: >-
      Limits on the fonts, colour palettes and graphic folders the editor
      offers, for the designs that use them.
  - name: PDF profiles
    description: >-
      The settings print PDFs are made with: colour conversion, PDF standard,
      cut lines, image resolution, fonts.
  - name: 3D scenes
    description: >-
      The 3D scenes the editor previews designs on: models with print areas,
      folds, flipbooks and sheets, yours and the Print.App library's. A design
      picks one with `sceneId`.
  - name: Library
    description: >-
      The Print.App library, the store catalogue the dashboard's Import Designs
      and Import from Library open: ready-made designs, and themed kits of
      graphics. Find what suits a product, then bring it into your account: a
      design as your own copy, a kit as a folder that follows it, single
      graphics into a folder.
  - name: Settings
    description: >-
      The account's editor and product page settings: how the editor opens and
      behaves, and the selectors Print.App uses on your product pages. Settings
      that run code in your store, send data elsewhere or delete projects are
      kept to the dashboard.
paths:
  /v2/print-options/quote:
    post:
      tags:
        - Print Options
      summary: Price choices on an option set
      description: >-
        Checks an option set and prices up to 25 sets of choices on it, line by
        line, with the engine that prices the cart: an option set being built
        (`config`) or one of the store's (`optionSetId`). Choices left out take
        the set's defaults. Writes nothing. With `config` it works for any
        account.
      operationId: quoteOptionSet
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OptionSetQuoteRequest'
      responses:
        '200':
          description: OK.
          headers:
            x-request-id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OptionSetQuote'
              example:
                object: option_set_quote
                currency: USD
                quotes:
                  - selections:
                      size: a4
                    quantity: 1
                    total: 15
                    unitPrice: 15
                    unavailable: false
                    unavailableReason: null
                    sku: null
                    lines:
                      - label: Base price
                        amount: 10
                        stage: base
                        source: base
                      - label: A4
                        amount: 5
                        stage: additive
                        source: size:a4
                    issues: []
                fields:
                  - id: size
                    label: Size
                    type: select-one
                    role: size
                    source:
                      role: size
                    reference: po:role/size
                    sends: choice id as value, label as text
                    choices:
                      - value: a5
                        label: A5
                        selected: true
                      - value: a4
                        label: A4
                        selected: false
                warnings: []
        '400':
          description: >-
            A parameter or body field is malformed: `param` names it and
            `details` lists every problem found.
          headers:
            x-request-id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: true
                code: invalid_request
                message: width is required.
                param: width
                requestId: FZn-uhymjoEEJow=
        '401':
          description: Missing, unknown, revoked or expired secret key.
          headers:
            x-request-id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: true
                code: unauthorized
                message: >-
                  Missing or invalid secret key. Send it as "Authorization:
                  Bearer sk_…".
                requestId: FZn-uhymjoEEJow=
        '403':
          description: The account is suspended for an unpaid invoice.
          headers:
            x-request-id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: true
                code: account_suspended
                message: >-
                  This account is suspended. Settle the outstanding invoice in
                  the Print.App dashboard.
                requestId: FZn-uhymjoEEJow=
        '404':
          description: >-
            Not found in your account. Another account's resources answer 404
            too.
          headers:
            x-request-id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: true
                code: not_found
                message: Not found.
                requestId: FZn-uhymjoEEJow=
        '409':
          description: >-
            The request conflicts with the current state; `code` says how
            (`folder_not_empty`, `builtin_folder`, `builtin_palette`,
            `editor_not_supported`, `design_changed`, `idempotency_key_reused`,
            `idempotency_in_progress`, `print_options_unavailable`,
            `print_options_not_installed`, `currency_mismatch`).
          headers:
            x-request-id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: true
                code: folder_not_empty
                message: >-
                  The folder still holds designs. Remove them from it (or delete
                  them) first.
                requestId: FZn-uhymjoEEJow=
        '413':
          description: A body or a downloaded file is over its size limit.
          headers:
            x-request-id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: true
                code: payload_too_large
                message: The file at url is larger than 50 MB.
                param: url
                requestId: FZn-uhymjoEEJow=
        '415':
          description: The body is not JSON.
          headers:
            x-request-id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: true
                code: unsupported_media_type
                message: >-
                  Send the request body as JSON, with "Content-Type:
                  application/json".
                requestId: FZn-uhymjoEEJow=
        '429':
          description: >-
            Rate limited by the API gateway. Back off and retry. This response
            comes from the gateway, so its body is `{ "message": "Too Many
            Requests" }`, not the standard error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GatewayError'
              example:
                message: Too Many Requests
        '500':
          description: >-
            Something failed on our side. Retry; quote the requestId to support
            if it persists.
          headers:
            x-request-id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: true
                code: internal_error
                message: >-
                  Something went wrong on our side. Retry the request; if it
                  keeps failing, contact support with the requestId.
                requestId: FZn-uhymjoEEJow=
components:
  schemas:
    OptionSetQuoteRequest:
      title: OptionSetQuoteRequest
      description: An option set, and the choices to price on it.
      type: object
      additionalProperties: false
      properties:
        config:
          type: object
          description: >-
            An option set to check and price (one being built). Or give
            `optionSetId`.
        optionSetId:
          type: string
          minLength: 1
          maxLength: 64
          description: One of the store's option sets.
        quotes:
          type: array
          minItems: 1
          maxItems: 25
          description: 'Each set of choices to price. Default: one quote, of the defaults.'
          items:
            type: object
            additionalProperties: false
            properties:
              selections:
                type: object
                description: >-
                  Field id → answer: a choice id (`"a4"`), a list of choice ids,
                  a number (a quantity), `{ "w": 210, "h": 297, "unit": "mm" }`
                  for dimensions, or `{ "s": 5, "m": 3 }` for a quantity per
                  option.
              file:
                type: object
                additionalProperties: false
                description: >-
                  Facts about an uploaded file, for sets that price by its pages
                  or size.
                properties:
                  pages:
                    type: integer
                    minimum: 0
                  colorPages:
                    type: integer
                    minimum: 0
                  monoPages:
                    type: integer
                    minimum: 0
                  canvas:
                    type: object
                    additionalProperties: false
                    required:
                      - w
                      - h
                    properties:
                      w:
                        type: number
                        minimum: 0
                      h:
                        type: number
                        minimum: 0
                      unit:
                        type: string
                        enum:
                          - mm
                          - cm
                          - in
                          - pt
                          - px
    OptionSetQuote:
      title: OptionSetQuote
      description: Prices for each set of choices, as the cart would charge them.
      type: object
      required:
        - object
        - currency
        - quotes
        - fields
        - warnings
      properties:
        object:
          type: string
          const: option_set_quote
        currency:
          type:
            - string
            - 'null'
        quotes:
          type: array
          items:
            type: object
            required:
              - selections
              - quantity
              - total
              - unitPrice
              - unavailable
              - unavailableReason
              - sku
              - lines
              - issues
            properties:
              selections:
                type: object
                description: >-
                  Every answer priced: the ones sent, and the defaults for the
                  rest.
              quantity:
                type:
                  - number
                  - 'null'
              total:
                type:
                  - number
                  - 'null'
                description: The price for the whole job.
              unitPrice:
                type:
                  - number
                  - 'null'
              unavailable:
                type: boolean
                description: >-
                  This combination cannot be ordered (the price matrix leaves it
                  out, a choice is disabled, or a quantity is out of range).
              unavailableReason:
                type:
                  - string
                  - 'null'
              sku:
                type:
                  - string
                  - 'null'
              lines:
                type: array
                description: Each part of the price.
                items:
                  type: object
                  required:
                    - label
                    - amount
                    - stage
                    - source
                  properties:
                    label:
                      type: string
                    amount:
                      type: number
                    stage:
                      type: string
                    source:
                      type: string
              issues:
                type: array
                items:
                  type: string
                description: >-
                  Answers the set does not have (an unknown field or option),
                  which the price ignores.
        fields:
          type: array
          items:
            $ref: '#/components/schemas/PrintOptionsField'
          description: >-
            Its fields as connectors address them: give a field's `source` as a
            connector's `source`.
        warnings:
          type: array
          description: Things that will not stop it working but may not be meant.
          items:
            type: object
            required:
              - path
              - code
              - message
            properties:
              path:
                type: string
              code:
                type: string
              message:
                type: string
      examples:
        - object: option_set_quote
          currency: USD
          quotes:
            - selections:
                size: a4
              quantity: 1
              total: 15
              unitPrice: 15
              unavailable: false
              unavailableReason: null
              sku: null
              lines:
                - label: Base price
                  amount: 10
                  stage: base
                  source: base
                - label: A4
                  amount: 5
                  stage: additive
                  source: size:a4
              issues: []
          fields:
            - id: size
              label: Size
              type: select-one
              role: size
              source:
                role: size
              reference: po:role/size
              sends: choice id as value, label as text
              choices:
                - value: a5
                  label: A5
                  selected: true
                - value: a4
                  label: A4
                  selected: false
          warnings: []
    Error:
      title: Error
      description: >-
        Every error the API itself returns. Match on `code`; `message` is for
        people and may be reworded.
      type: object
      required:
        - error
        - code
        - message
        - requestId
      properties:
        error:
          type: boolean
          const: true
        code:
          type: string
          enum:
            - unauthorized
            - account_suspended
            - invalid_request
            - not_found
            - route_not_found
            - idempotency_key_reused
            - idempotency_in_progress
            - folder_not_empty
            - builtin_folder
            - builtin_palette
            - editor_not_supported
            - design_changed
            - payload_too_large
            - unsupported_media_type
            - ops_failed
            - internal_error
            - service_unavailable
          description: >-
            `unauthorized` (401): missing, unknown, revoked or expired secret
            key. `account_suspended` (403): the account has an unpaid invoice.
            `invalid_request` (400): a parameter or body field is malformed —
            see `param` and `details`. `not_found` (404): no such resource in
            your account. `route_not_found` (404): no such endpoint.
            `idempotency_key_reused` (409): the Idempotency-Key was used for a
            different request. `idempotency_in_progress` (409): the first
            request with that key is still running. `folder_not_empty` (409):
            the folder still holds designs or folders. `builtin_folder`,
            `builtin_palette` (409): Print.App's own folders and palettes cannot
            be changed. `editor_not_supported` (409): page content can only be
            edited on accounts that use the new editor. `design_changed` (409):
            the design was saved elsewhere while the batch ran; read it again
            and retry. `payload_too_large` (413): a body or file over the limit.
            `unsupported_media_type` (415): send JSON. `ops_failed` (422): an
            operation in the batch failed, nothing was saved — see `details`.
            `internal_error` (500): retry; contact support with the `requestId`
            if it persists. `service_unavailable` (503): retry in a few seconds.
        message:
          type: string
        param:
          type: string
          description: The parameter or body field at fault, as a path (`pages[0].title`).
        details:
          type: array
          description: >-
            Every problem found, when there was more than one
            (`invalid_request`), or each operation's result (`ops_failed`).
          items:
            type: object
        requestId:
          type: string
          description: >-
            Also sent as the `x-request-id` header. Quote it when contacting
            support.
      examples:
        - error: true
          code: invalid_request
          message: limit must be an integer from 1 to 100.
          param: limit
          requestId: FZn-uhymjoEEJow=
    GatewayError:
      type: object
      properties:
        message:
          type: string
      description: Returned by the API gateway itself (429).
    PrintOptionsField:
      title: PrintOptionsField
      description: >-
        A Print Options field, as a connector points at it: by role when it has
        one, else by its id.
      type: object
      required:
        - id
        - label
        - type
        - role
        - source
        - reference
        - sends
        - choices
      properties:
        id:
          type: string
        label:
          type:
            - string
            - 'null'
        type:
          type:
            - string
            - 'null'
          description: select-one, select-many, quantity, dimensions, number, text, file…
        role:
          type:
            - string
            - 'null'
          description: Its role, explicit or from its type (quantity, dimensions, file).
        source:
          type: object
          description: >-
            What to give as `source`: `{ role }` when it has one, else `{ field
            }`.
          properties:
            role:
              type: string
            field:
              type: string
        reference:
          type: string
          description: 'The stored query: `po:role/<role>` or `po:field/<id>`.'
        sends:
          type: string
        choices:
          type: array
          items:
            type: object
            required:
              - value
              - label
              - selected
            properties:
              value:
                type: string
                description: What the page sends for it.
              label:
                type:
                  - string
                  - 'null'
                description: What the customer sees.
              selected:
                type: boolean
                description: Selected when the page loads.
  headers:
    RequestId:
      description: Identifies the request. Quote it when contacting support.
      schema:
        type: string
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        A secret key from Print.App admin → Domains → Secret keys, sent as
        `Authorization: Bearer sk_…`. Server-side only.

````

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