Loyverse Items API

Product catalog items, variants, SKUs, and pricing.

OpenAPI Specification

loyverse-items-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Loyverse Categories Items API
  description: REST API for the Loyverse point of sale (POS) platform. Loyverse is a free POS for small retail stores, cafes, bars, and restaurants; this API exposes the same data as the POS and Back Office - items and variants, categories, receipts (sales), customers and loyalty, inventory levels, stores, employees, payment types, taxes, discounts, modifiers, suppliers, POS devices, and shifts. All endpoints are HTTPS REST with cursor-based pagination. Authenticate with a personal access token (Bearer) generated in the Back Office, or with the OAuth 2.0 authorization-code flow for third-party apps acting on behalf of other merchants. This document is derived from the public Loyverse API reference and grounds real endpoints; request and response schemas are summarized and should be verified against the live reference during reconciliation.
  version: '1.0'
  contact:
    name: Loyverse Developers
    url: https://developer.loyverse.com/docs/
  x-logo:
    url: https://loyverse.com
servers:
- url: https://api.loyverse.com/v1.0
  description: Loyverse API
security:
- bearerAuth: []
- oauth2:
  - ITEMS_READ
  - RECEIPTS_READ
  - CUSTOMERS_READ
  - INVENTORY_READ
  - STORES_READ
tags:
- name: Items
  description: Product catalog items, variants, SKUs, and pricing.
paths:
  /items:
    get:
      operationId: listItems
      tags:
      - Items
      summary: List items
      description: Returns a cursor-paginated list of catalog items and their variants.
      parameters:
      - $ref: '#/components/parameters/Cursor'
      - $ref: '#/components/parameters/Limit'
      - name: store_id
        in: query
        schema:
          type: string
        description: Filter items available in a given store.
      responses:
        '200':
          description: A page of items.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ItemsPage'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createOrUpdateItem
      tags:
      - Items
      summary: Create or update an item
      description: Creates a new item or updates an existing one when an id is supplied.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Item'
      responses:
        '200':
          description: The created or updated item.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Item'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /items/{item_id}:
    parameters:
    - $ref: '#/components/parameters/ItemId'
    get:
      operationId: getItem
      tags:
      - Items
      summary: Get an item
      responses:
        '200':
          description: The item.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Item'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteItem
      tags:
      - Items
      summary: Delete an item
      responses:
        '200':
          description: Deletion result.
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  schemas:
    Cursorable:
      type: object
      properties:
        cursor:
          type: string
          nullable: true
          description: Cursor to pass to fetch the next page, or null on the last page.
    Variant:
      type: object
      properties:
        variant_id:
          type: string
        item_id:
          type: string
        sku:
          type: string
        option1_value:
          type: string
          nullable: true
        default_price:
          type: number
          nullable: true
        cost:
          type: number
          nullable: true
        barcode:
          type: string
          nullable: true
        stores:
          type: array
          items:
            type: object
            properties:
              store_id:
                type: string
              price:
                type: number
                nullable: true
              available_for_sale:
                type: boolean
    ItemsPage:
      allOf:
      - $ref: '#/components/schemas/Cursorable'
      - type: object
        properties:
          items:
            type: array
            items:
              $ref: '#/components/schemas/Item'
    Item:
      type: object
      properties:
        id:
          type: string
        handle:
          type: string
        item_name:
          type: string
        category_id:
          type: string
          nullable: true
        track_stock:
          type: boolean
        sold_by_weight:
          type: boolean
        is_composite:
          type: boolean
        primary_supplier_id:
          type: string
          nullable: true
        tax_ids:
          type: array
          items:
            type: string
        modifier_ids:
          type: array
          items:
            type: string
        variants:
          type: array
          items:
            $ref: '#/components/schemas/Variant'
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        deleted_at:
          type: string
          format: date-time
          nullable: true
  responses:
    NotFound:
      description: The requested resource was not found.
    Unauthorized:
      description: Missing or invalid access token.
  parameters:
    Cursor:
      name: cursor
      in: query
      required: false
      schema:
        type: string
      description: Opaque cursor for the next page of results.
    Limit:
      name: limit
      in: query
      required: false
      schema:
        type: integer
        default: 50
        maximum: 250
      description: Maximum number of records to return per page.
    ItemId:
      name: item_id
      in: path
      required: true
      schema:
        type: string
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: Personal access token generated in the Loyverse Back Office (Access Tokens).
    oauth2:
      type: oauth2
      flows:
        authorizationCode:
          authorizationUrl: https://api.loyverse.com/oauth/authorize
          tokenUrl: https://api.loyverse.com/oauth/token
          scopes:
            ITEMS_READ: Read items and catalog objects.
            ITEMS_WRITE: Create and update items and catalog objects.
            RECEIPTS_READ: Read receipts.
            RECEIPTS_WRITE: Create receipts.
            CUSTOMERS_READ: Read customers and loyalty data.
            CUSTOMERS_WRITE: Create and update customers.
            INVENTORY_READ: Read inventory levels.
            INVENTORY_WRITE: Update inventory levels.
            EMPLOYEES_READ: Read employees.
            PAYMENT_TYPES_READ: Read payment types.
            STORES_READ: Read stores.
            MERCHANT_READ: Read merchant and store information.