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

# Get catalog

> Store branding and products in one response — preferred for home pages.



## OpenAPI

````yaml openapi.json GET /v1/catalog
openapi: 3.0.3
info:
  title: Quickshops Headless API
  version: 1.0.0
  description: >
    Headless commerce API for Quickshops custom storefronts and @quickshops/sdk.


    ## Versioning


    All routes are prefixed with `/v1`. The current version is also sent as
    `X-API-Version: v1`. Breaking changes ship under `/v2`. `v1` remains
    available during a deprecation window.


    ## Deprecation


    Deprecated operations are marked `deprecated: true`. When a version or
    operation is scheduled for removal, responses include RFC 8594 `Deprecation`
    and `Sunset` headers at least 90 days before removal.


    ## Errors


    4xx and 5xx bodies are JSON `{ "error": string, "code": string }`. `code` is
    machine-readable; `error` is human-readable.


    ## Rate limits


    Authenticated routes are limited per API key. Responses include IETF
    `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset`, and combined
    `RateLimit` headers. HTTP 429 also includes `Retry-After`.


    Per-minute limits: global 120; product reads 240; cart writes 60; checkout
    30; billing portal 30.
  contact:
    name: Quickshops
    email: valtteri@quickshops.app
    url: https://quickshops.app/developers
servers:
  - url: https://api.quickshops.app
    description: Production. Paths include the /v1 prefix.
security:
  - BearerAuth: []
paths:
  /v1/catalog:
    get:
      tags:
        - catalog
      summary: Get catalog bootstrap (store + products)
      description: >-
        Returns the store record and published products for the API key in one
        round trip.
      operationId: catalog.get
      responses:
        '200':
          description: Response for status 200
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                properties:
                  data:
                    type: object
                    required:
                      - store
                      - products
                    properties:
                      store:
                        type: object
                        required:
                          - _id
                          - slug
                          - name
                          - isPublished
                          - currency
                          - contactEmail
                          - contactPhone
                          - seoTitle
                          - seoDescription
                          - theme
                          - paymentsConfigured
                        properties:
                          _id:
                            type: string
                          slug:
                            type: string
                          name:
                            type: string
                          description:
                            type: string
                          logoUrl:
                            type: string
                          isPublished:
                            type: boolean
                          currency:
                            type: string
                          contactEmail:
                            nullable: true
                            type: string
                          contactPhone:
                            nullable: true
                            type: string
                          seoTitle:
                            nullable: true
                            type: string
                          seoDescription:
                            nullable: true
                            type: string
                          theme:
                            type: object
                            required:
                              - primary
                              - primaryForeground
                              - background
                              - foreground
                              - muted
                              - border
                              - fontBody
                              - fontHeading
                              - radius
                            properties:
                              primary:
                                nullable: true
                                type: string
                              primaryForeground:
                                nullable: true
                                type: string
                              background:
                                nullable: true
                                type: string
                              foreground:
                                nullable: true
                                type: string
                              muted:
                                nullable: true
                                type: string
                              border:
                                nullable: true
                                type: string
                              fontBody:
                                nullable: true
                                type: string
                              fontHeading:
                                nullable: true
                                type: string
                              radius:
                                nullable: true
                                type: string
                          templateKey:
                            nullable: true
                            type: string
                          templateTexts:
                            type: object
                            additionalProperties:
                              type: object
                              additionalProperties:
                                type: string
                          paymentsConfigured:
                            type: boolean
                      products:
                        type: array
                        items:
                          type: object
                          required:
                            - _id
                            - storeId
                            - name
                            - description
                            - priceInCents
                            - currency
                            - type
                            - billingInterval
                            - imageUrl
                            - isActive
                            - category
                            - details
                          properties:
                            _id:
                              type: string
                            storeId:
                              type: string
                            name:
                              type: string
                            description:
                              nullable: true
                              type: string
                            priceInCents:
                              type: number
                            currency:
                              type: string
                            type:
                              type: string
                              enum:
                                - digital
                                - subscription
                                - physical
                            billingInterval:
                              nullable: true
                              type: string
                              enum:
                                - month
                                - year
                            imageUrl:
                              nullable: true
                              type: string
                            isActive:
                              type: boolean
                            category:
                              nullable: true
                              type: string
                            details:
                              nullable: true
                              type: array
                              items:
                                type: string
          headers:
            RateLimit-Limit:
              schema:
                type: integer
              description: Maximum requests allowed in the current window.
            RateLimit-Remaining:
              schema:
                type: integer
              description: Requests remaining in the current window.
            RateLimit-Reset:
              schema:
                type: integer
              description: Seconds until the current window resets.
            RateLimit:
              schema:
                type: string
              description: >-
                Combined RateLimit header, for example `limit=120,
                remaining=119, reset=60`.
            X-API-Version:
              schema:
                type: string
                enum:
                  - v1
              description: API version that served this response.
        '400':
          description: Invalid request payload or parameters.
          headers:
            RateLimit-Limit:
              schema:
                type: integer
              description: Maximum requests allowed in the current window.
            RateLimit-Remaining:
              schema:
                type: integer
              description: Requests remaining in the current window.
            RateLimit-Reset:
              schema:
                type: integer
              description: Seconds until the current window resets.
            RateLimit:
              schema:
                type: string
              description: >-
                Combined RateLimit header, for example `limit=120,
                remaining=119, reset=60`.
            X-API-Version:
              schema:
                type: string
                enum:
                  - v1
              description: API version that served this response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '401':
          description: Response for status 401
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                  - code
                properties:
                  error:
                    type: string
                    description: Human-readable error message.
                  code:
                    type: string
                    enum:
                      - UNAUTHORIZED
                      - FORBIDDEN
                      - PRO_PLAN_REQUIRED
                      - NOT_FOUND
                      - VALIDATION_ERROR
                      - RATE_LIMITED
                      - CONFLICT
                      - INTERNAL_ERROR
          headers:
            RateLimit-Limit:
              schema:
                type: integer
              description: Maximum requests allowed in the current window.
            RateLimit-Remaining:
              schema:
                type: integer
              description: Requests remaining in the current window.
            RateLimit-Reset:
              schema:
                type: integer
              description: Seconds until the current window resets.
            RateLimit:
              schema:
                type: string
              description: >-
                Combined RateLimit header, for example `limit=120,
                remaining=119, reset=60`.
            X-API-Version:
              schema:
                type: string
                enum:
                  - v1
              description: API version that served this response.
        '403':
          description: Response for status 403
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                  - code
                properties:
                  error:
                    type: string
                    description: Human-readable error message.
                  code:
                    type: string
                    enum:
                      - UNAUTHORIZED
                      - FORBIDDEN
                      - PRO_PLAN_REQUIRED
                      - NOT_FOUND
                      - VALIDATION_ERROR
                      - RATE_LIMITED
                      - CONFLICT
                      - INTERNAL_ERROR
          headers:
            RateLimit-Limit:
              schema:
                type: integer
              description: Maximum requests allowed in the current window.
            RateLimit-Remaining:
              schema:
                type: integer
              description: Requests remaining in the current window.
            RateLimit-Reset:
              schema:
                type: integer
              description: Seconds until the current window resets.
            RateLimit:
              schema:
                type: string
              description: >-
                Combined RateLimit header, for example `limit=120,
                remaining=119, reset=60`.
            X-API-Version:
              schema:
                type: string
                enum:
                  - v1
              description: API version that served this response.
        '404':
          description: Response for status 404
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                  - code
                properties:
                  error:
                    type: string
                    description: Human-readable error message.
                  code:
                    type: string
                    enum:
                      - UNAUTHORIZED
                      - FORBIDDEN
                      - PRO_PLAN_REQUIRED
                      - NOT_FOUND
                      - VALIDATION_ERROR
                      - RATE_LIMITED
                      - CONFLICT
                      - INTERNAL_ERROR
          headers:
            RateLimit-Limit:
              schema:
                type: integer
              description: Maximum requests allowed in the current window.
            RateLimit-Remaining:
              schema:
                type: integer
              description: Requests remaining in the current window.
            RateLimit-Reset:
              schema:
                type: integer
              description: Seconds until the current window resets.
            RateLimit:
              schema:
                type: string
              description: >-
                Combined RateLimit header, for example `limit=120,
                remaining=119, reset=60`.
            X-API-Version:
              schema:
                type: string
                enum:
                  - v1
              description: API version that served this response.
        '409':
          description: Conflict, such as payments not configured.
          headers:
            RateLimit-Limit:
              schema:
                type: integer
              description: Maximum requests allowed in the current window.
            RateLimit-Remaining:
              schema:
                type: integer
              description: Requests remaining in the current window.
            RateLimit-Reset:
              schema:
                type: integer
              description: Seconds until the current window resets.
            RateLimit:
              schema:
                type: string
              description: >-
                Combined RateLimit header, for example `limit=120,
                remaining=119, reset=60`.
            X-API-Version:
              schema:
                type: string
                enum:
                  - v1
              description: API version that served this response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '429':
          description: Response for status 429
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                  - code
                properties:
                  error:
                    type: string
                    description: Human-readable error message.
                  code:
                    type: string
                    enum:
                      - UNAUTHORIZED
                      - FORBIDDEN
                      - PRO_PLAN_REQUIRED
                      - NOT_FOUND
                      - VALIDATION_ERROR
                      - RATE_LIMITED
                      - CONFLICT
                      - INTERNAL_ERROR
          headers:
            RateLimit-Limit:
              schema:
                type: integer
              description: Maximum requests allowed in the current window.
            RateLimit-Remaining:
              schema:
                type: integer
              description: Requests remaining in the current window.
            RateLimit-Reset:
              schema:
                type: integer
              description: Seconds until the current window resets.
            RateLimit:
              schema:
                type: string
              description: >-
                Combined RateLimit header, for example `limit=120,
                remaining=119, reset=60`.
            X-API-Version:
              schema:
                type: string
                enum:
                  - v1
              description: API version that served this response.
            Retry-After:
              schema:
                type: integer
              description: Seconds to wait before retrying.
        '500':
          description: Internal error.
          headers:
            RateLimit-Limit:
              schema:
                type: integer
              description: Maximum requests allowed in the current window.
            RateLimit-Remaining:
              schema:
                type: integer
              description: Requests remaining in the current window.
            RateLimit-Reset:
              schema:
                type: integer
              description: Seconds until the current window resets.
            RateLimit:
              schema:
                type: string
              description: >-
                Combined RateLimit header, for example `limit=120,
                remaining=119, reset=60`.
            X-API-Version:
              schema:
                type: string
                enum:
                  - v1
              description: API version that served this response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
components:
  schemas:
    ApiError:
      type: object
      required:
        - error
        - code
      properties:
        error:
          type: string
          description: Human-readable error message.
        code:
          type: string
          description: Machine-readable error code.
          enum:
            - UNAUTHORIZED
            - FORBIDDEN
            - PRO_PLAN_REQUIRED
            - NOT_FOUND
            - VALIDATION_ERROR
            - RATE_LIMITED
            - CONFLICT
            - INTERNAL_ERROR
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: Headless API key (qk_...). Pro plan required.

````