> ## 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.

# Read a product page

> Reads a product page of your store as the Print.App client sees it when it loads: each option control with a selector that finds it and its choices, the Print Options fields with their roles and choices, the store's product id and the designs it opens. Only pages of your own store (its address, Shopify shop or Print.App key) are read. Controls a theme builds in JavaScript after loading are not seen.



## OpenAPI

````yaml openapi.json GET /v2/product-page
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: Shareable editor links that open a design or project at create.print.app.
  - 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: 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.
paths:
  /v2/product-page:
    get:
      tags:
        - Connectors
      summary: Read a product page
      description: >-
        Reads a product page of your store as the Print.App client sees it when
        it loads: each option control with a selector that finds it and its
        choices, the Print Options fields with their roles and choices, the
        store's product id and the designs it opens. Only pages of your own
        store (its address, Shopify shop or Print.App key) are read. Controls a
        theme builds in JavaScript after loading are not seen.
      operationId: inspectProductPage
      parameters:
        - required: true
          name: url
          in: query
          schema:
            type: string
            format: uri
          description: A product page of your store.
      responses:
        '200':
          description: OK.
          headers:
            x-request-id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductPage'
        '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=
        '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:
  headers:
    RequestId:
      description: Identifies the request. Quote it when contacting support.
      schema:
        type: string
  schemas:
    ProductPage:
      title: ProductPage
      description: >-
        What a store's product page offers a connector: its option controls, its
        Print Options fields, and whether Print.App runs on it.
      type: object
      required:
        - object
        - url
        - title
        - platform
        - productId
        - passwordProtected
        - printApp
        - designIds
        - controls
        - printOptions
        - notes
      properties:
        object:
          type: string
          const: product_page
        url:
          type: string
          description: The page read, after redirects.
        title:
          type:
            - string
            - 'null'
        platform:
          type:
            - string
            - 'null'
          description: >-
            shopify, woocommerce, prestashop, opencart, shopware or odoo, when
            recognised.
        productId:
          type:
            - string
            - 'null'
          description: >-
            The product's id in the store, as `GET /v2/products/{productId}`
            takes it.
        passwordProtected:
          type: boolean
          description: The store answered with its password page.
        printApp:
          type: boolean
          description: The Print.App client loads on the page.
        designIds:
          type: array
          items:
            type: string
          description: The designs the product (and its variants) opens.
        controls:
          type: array
          items:
            type: object
            required:
              - kind
              - name
              - label
              - selector
              - matches
              - inProductForm
              - sends
              - choices
            properties:
              kind:
                type: string
                enum:
                  - select
                  - radio
                  - fieldset
                  - checkbox
                  - text
                  - number
                  - textarea
                  - element
              name:
                type:
                  - string
                  - 'null'
                description: Its form name.
              label:
                type:
                  - string
                  - 'null'
                description: Its label on the page.
              selector:
                type: string
                description: The selector to give as `source.selector`.
              matches:
                type: integer
                description: >-
                  How many elements the selector finds as the page loads. The
                  client uses the first; 0 for radio choices means none is
                  selected by default.
              inProductForm:
                type: boolean
                description: It is part of the add-to-cart form.
              sends:
                type: string
                description: >-
                  What the client sends for it: `value and text`, `value`, or
                  `its text`.
              value:
                type:
                  - string
                  - 'null'
                description: Its value as the page loads (inputs).
              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.
              notes:
                type: array
                items:
                  type: string
                description: What could stop a connector working with it.
          description: The page's option controls, add-to-cart form first.
        printOptions:
          type: object
          required:
            - found
            - fields
            - error
          properties:
            found:
              type: boolean
            fields:
              type: array
              items:
                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.
            error:
              type:
                - string
                - 'null'
        notes:
          type: array
          items:
            type: string
    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).
  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.