Epos Now Products API

Create, read, update, and delete the product catalog that drives the till - products, prices, barcodes, and their category assignments. Paginated listing at 200 records per page. Core to any point of sale, catalog sync, or retail integration.

OpenAPI Specification

epos-now-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: EposNow HQ REST API
  description: >-
    The EposNow HQ REST API lets developers programmatically interact with the
    cloud-based aspects of the Epos Now point of sale (POS) platform for retail
    and hospitality - products, categories, transactions (sales), customers,
    stock, tax rates, and devices. This document models the documented V2 API
    surface (base https://api.eposnowhq.com/api/V2). Epos Now recommends the
    newer V4 / "Global" API (https://api.eposnowhq.com/api/v4) for new
    integrations, which reorganizes the same domains; V4 per-resource paths are
    not fully enumerated here. All requests use HTTP Basic authentication with a
    per-device access token (Base64 of "API Key:API Secret") issued from the
    Back Office. List endpoints are paginated at up to 200 records per page via
    the page query parameter.
  version: 'V2'
  contact:
    name: Epos Now Developers
    url: https://developer.eposnowhq.com/
servers:
  - url: https://api.eposnowhq.com/api/V2
    description: EposNow HQ REST API (V2)
security:
  - basicAuth: []
tags:
  - name: Products
    description: The product catalog sold at the point of sale.
  - name: Categories
    description: Categories that group products for the till and reporting.
  - name: Transactions
    description: Sales records (orders) captured at the point of sale.
  - name: Customers
    description: Customer records for loyalty, accounts, and CRM.
  - name: Stock
    description: Product stock levels and stock control.
  - name: Devices
    description: Registered tills and API devices on the account.
paths:
  /Product:
    get:
      operationId: listProducts
      tags:
        - Products
      summary: List products
      description: Returns a paginated list of products, up to 200 per page.
      parameters:
        - $ref: '#/components/parameters/Page'
      responses:
        '200':
          description: A paginated list of products.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Product'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createProduct
      tags:
        - Products
      summary: Create a product
      description: Creates a new product in the catalog.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Product'
      responses:
        '200':
          description: The created product.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Product'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /Product/{Id}:
    parameters:
      - $ref: '#/components/parameters/Id'
    get:
      operationId: getProduct
      tags:
        - Products
      summary: Get a product
      description: Returns a single product by its ID.
      responses:
        '200':
          description: The requested product.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Product'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: updateProduct
      tags:
        - Products
      summary: Update a product
      description: Updates an existing product.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Product'
      responses:
        '200':
          description: The updated product.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Product'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteProduct
      tags:
        - Products
      summary: Delete a product
      description: Deletes a product from the catalog.
      responses:
        '200':
          description: Deletion confirmation.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /Category:
    get:
      operationId: listCategories
      tags:
        - Categories
      summary: List categories
      description: Returns a paginated list of categories, up to 200 per page.
      parameters:
        - $ref: '#/components/parameters/Page'
      responses:
        '200':
          description: A paginated list of categories.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Category'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createCategory
      tags:
        - Categories
      summary: Create a category
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Category'
      responses:
        '200':
          description: The created category.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Category'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /Category/{Id}:
    parameters:
      - $ref: '#/components/parameters/Id'
    get:
      operationId: getCategory
      tags:
        - Categories
      summary: Get a category
      responses:
        '200':
          description: The requested category.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Category'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: updateCategory
      tags:
        - Categories
      summary: Update a category
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Category'
      responses:
        '200':
          description: The updated category.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Category'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteCategory
      tags:
        - Categories
      summary: Delete a category
      responses:
        '200':
          description: Deletion confirmation.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /Transaction:
    get:
      operationId: listTransactions
      tags:
        - Transactions
      summary: List transactions
      description: >-
        Returns a paginated list of transactions (sales records), up to 200 per
        page.
      parameters:
        - $ref: '#/components/parameters/Page'
      responses:
        '200':
          description: A paginated list of transactions.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Transaction'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createTransaction
      tags:
        - Transactions
      summary: Create a transaction
      description: Creates a new transaction (sale) with its line items and tenders.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Transaction'
      responses:
        '200':
          description: The created transaction.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Transaction'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /Transaction/{Id}:
    parameters:
      - $ref: '#/components/parameters/Id'
    get:
      operationId: getTransaction
      tags:
        - Transactions
      summary: Get a transaction
      responses:
        '200':
          description: The requested transaction.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Transaction'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: updateTransaction
      tags:
        - Transactions
      summary: Update a transaction
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Transaction'
      responses:
        '200':
          description: The updated transaction.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Transaction'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteTransaction
      tags:
        - Transactions
      summary: Delete a transaction
      responses:
        '200':
          description: Deletion confirmation.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /Customer:
    get:
      operationId: listCustomers
      tags:
        - Customers
      summary: List customers
      description: Returns a paginated list of customers, up to 200 per page.
      parameters:
        - $ref: '#/components/parameters/Page'
      responses:
        '200':
          description: A paginated list of customers.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Customer'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createCustomer
      tags:
        - Customers
      summary: Create a customer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Customer'
      responses:
        '200':
          description: The created customer.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Customer'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /Customer/{Id}:
    parameters:
      - $ref: '#/components/parameters/Id'
    get:
      operationId: getCustomer
      tags:
        - Customers
      summary: Get a customer
      responses:
        '200':
          description: The requested customer.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Customer'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: updateCustomer
      tags:
        - Customers
      summary: Update a customer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Customer'
      responses:
        '200':
          description: The updated customer.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Customer'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteCustomer
      tags:
        - Customers
      summary: Delete a customer
      responses:
        '200':
          description: Deletion confirmation.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /ProductStock:
    get:
      operationId: listProductStock
      tags:
        - Stock
      summary: List product stock levels
      description: >-
        Returns a paginated list of product stock levels, up to 200 per page.
        Used to read on-hand inventory per product.
      parameters:
        - $ref: '#/components/parameters/Page'
      responses:
        '200':
          description: A paginated list of product stock levels.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ProductStock'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /StockTransfer:
    get:
      operationId: listStockTransfers
      tags:
        - Stock
      summary: List stock transfers
      description: >-
        Returns a paginated list of stock transfers between locations, up to 200
        per page.
      parameters:
        - $ref: '#/components/parameters/Page'
      responses:
        '200':
          description: A paginated list of stock transfers.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
  /TaxRate:
    get:
      operationId: listTaxRates
      tags:
        - Products
      summary: List tax rates
      description: Returns a paginated list of tax rates, up to 200 per page.
      parameters:
        - $ref: '#/components/parameters/Page'
      responses:
        '200':
          description: A paginated list of tax rates.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
  /Device:
    get:
      operationId: listDevices
      tags:
        - Devices
      summary: List devices
      description: >-
        Returns a paginated list of the tills and API devices registered on the
        account, up to 200 per page.
      parameters:
        - $ref: '#/components/parameters/Page'
      responses:
        '200':
          description: A paginated list of devices.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Device'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /Device/{Id}:
    parameters:
      - $ref: '#/components/parameters/Id'
    get:
      operationId: getDevice
      tags:
        - Devices
      summary: Get a device
      responses:
        '200':
          description: The requested device.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Device'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  securitySchemes:
    basicAuth:
      type: http
      scheme: basic
      description: >-
        HTTP Basic authentication. The access token is the Base64 encoding of
        "API Key:API Secret" (the API Key, a colon, then the API Secret, with no
        spaces), sent as "Authorization: Basic {token}". Credentials are issued
        per API Device registered under Web Integrations in the Epos Now Back
        Office.
  parameters:
    Id:
      name: Id
      in: path
      required: true
      description: The unique identifier of the resource.
      schema:
        type: integer
    Page:
      name: page
      in: query
      required: false
      description: The page number of results to return (up to 200 records per page).
      schema:
        type: integer
        default: 1
  responses:
    Unauthorized:
      description: Missing or invalid Basic authentication credentials.
    NotFound:
      description: The requested resource was not found.
  schemas:
    Product:
      type: object
      properties:
        Id:
          type: integer
        Name:
          type: string
        Description:
          type: string
        CategoryId:
          type: integer
        SalePrice:
          type: number
        CostPrice:
          type: number
        Barcode:
          type: string
        TaxRateId:
          type: integer
      additionalProperties: true
    Category:
      type: object
      properties:
        Id:
          type: integer
        Name:
          type: string
        ParentId:
          type: integer
      additionalProperties: true
    Transaction:
      type: object
      description: A sales record (order) captured at the point of sale.
      properties:
        Id:
          type: integer
        DeviceId:
          type: integer
        CustomerId:
          type: integer
        DateTime:
          type: string
          format: date-time
        Amount:
          type: number
        TransactionItems:
          type: array
          items:
            type: object
            additionalProperties: true
      additionalProperties: true
    Customer:
      type: object
      properties:
        Id:
          type: integer
        Title:
          type: string
        Forename:
          type: string
        Surname:
          type: string
        EmailAddress:
          type: string
        PhoneNumber:
          type: string
        CustomerTypeId:
          type: integer
      additionalProperties: true
    ProductStock:
      type: object
      properties:
        ProductId:
          type: integer
        LocationId:
          type: integer
        CurrentStock:
          type: number
      additionalProperties: true
    Device:
      type: object
      properties:
        Id:
          type: integer
        Name:
          type: string
        LocationId:
          type: integer
      additionalProperties: true