Lightspeed Commerce Fulfillments API

Fulfillment operations

Business capability
Distributed Order Fulfilment Management BC-2330.30

Operations 6

GET /fulfillments Get Fulfillments Summary #
POST /fulfillments/fulfill Fulfill a Sale #
POST /fulfillments/{fulfillment_id}/fulfill Fulfill line items within a sale #
GET /fulfillments/{fulfillment_id}/history Get Fulfillment History #
POST /fulfillments/{fulfillment_id}/pack Partial Pack line items within a sale #
POST /fulfillments/{fulfillment_id}/pick Partial Pick line items within a sale #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/lightspeed-fulfillments-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

lightspeed-fulfillments-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  contact:
    email: x-series.api@lightspeedhq.com
    name: Lightspeed Developer Relations
    url: https://developers.retail.lightspeed.app
  description: Lightspeed Retail (X-Series) API.
  license:
    name: Apache 2.0
    url: http://www.apache.org/licenses/LICENSE-2.0.html
  termsOfService: https://developers.lightspeedhq.com/terms
  title: 2026-07 Fulfillments API
  version: 2026-07
servers:
- url: https://{domain_prefix}.retail.lightspeed.app/api/2026-07
  variables:
    domain_prefix:
      default: example
      description: Domain prefix of the store to be operated on
security:
- bearerAuth: []
tags:
- description: Fulfillment operations
  name: Fulfillments
paths:
  /fulfillments:
    get:
      description: Retrieves a paginated list of fulfillment summary items with optional filtering
      operationId: getFulfillmentSummary
      parameters:
      - description: Filter by outlet IDs (can be specified multiple times)
        example:
        - e058ea02-c565-405f-be27-cefaeeca1f92
        - aea44f85-b729-448b-bcd4-bd2b8757396f
        explode: true
        in: query
        name: outlet_id
        schema:
          items:
            type: string
          type: array
      - description: Filter by sale IDs (can be specified multiple times)
        example:
        - 81b37e5f-aa50-4fe3-95d3-a3cec73a7e2c
        - 81d2fc44-e4d4-4180-8f1e-b36de2acf438
        explode: true
        in: query
        name: sale_id
        schema:
          items:
            type: string
          type: array
      - description: Filter by fulfillment types (can be specified multiple times)
        example:
        - PICKUP
        - DISPATCH
        explode: true
        in: query
        name: fulfillment_type
        schema:
          items:
            enum:
            - PICKUP
            - DISPATCH
            - SERVICE
            type: string
          type: array
      - description: Filter by fulfillment states (can be specified multiple times)
        example:
        - OPEN
        - STARTED
        explode: true
        in: query
        name: fulfillment_state
        schema:
          items:
            enum:
            - OPEN
            - STARTED
            - PICKED
            - PACKED
            - FULFILLED
            type: string
          type: array
      - description: Page number for pagination (1-based)
        example: 1
        in: query
        name: page_number
        schema:
          default: 1
          minimum: 1
          type: integer
      - description: Number of items per page
        example: 20
        in: query
        name: page_size
        schema:
          default: 10
          maximum: 100
          minimum: 1
          type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FulfillmentSummaryResponse'
          description: Successful response with fulfillment summary data
        '400':
          description: Bad request
        '401':
          description: Unauthorized
        '403':
          description: Forbidden
      security:
      - bearerAuth: []
      summary: Get Fulfillments Summary
      tags:
      - Fulfillments
  /fulfillments/fulfill:
    post:
      description: 'Completes all fulfillments for a given sale. This is an idempotent action.


        🔒 Requires: `sales:write` scope'
      operationId: postFulfillSale
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FulfillSaleRequest'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FulfillSaleResponse'
          description: Sale fulfilled successfully.
        '400':
          description: Bad Request - The request body is malformed.
        '401':
          description: Unauthorized - Authentication information is missing or invalid.
        '404':
          description: Not Found
        '409':
          description: Conflict
      security:
      - bearerAuth: []
      summary: Fulfill a Sale
      tags:
      - Fulfillments
  /fulfillments/{fulfillment_id}/fulfill:
    post:
      description: 'Fulfills line items for a given sale. This is an idempotent action.


        Each line item may optionally include a `source_breakdown`, which specifies how a fulfillment quantity should be sourced.

        When provided, all three fields are required and must sum to the parent quantity.


        🔒 Requires: `sales:write` scope'
      operationId: postFulfillLineItems
      parameters:
      - description: The unique identifier of the fulfillment
        in: path
        name: fulfillment_id
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FulfillLineItemsRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FulfillLineItemsResponse'
          description: Sale line item fulfilled successfully.
        '400':
          description: Bad Request
        '401':
          description: Unauthorized
        '404':
          description: Not Found
        '409':
          description: Conflict
      security:
      - bearerAuth: []
      summary: Fulfill line items within a sale
      tags:
      - Fulfillments
  /fulfillments/{fulfillment_id}/history:
    get:
      description: 'Retrieves the history ledger for a single fulfillment, showing all state-change events

        (e.g. created, picked, packed, fulfilled, voided, returned) for each line item.


        Results are ordered oldest-first and support cursor-based pagination.

        When no more pages exist, the `next_cursor` field will be empty.


        🔒 Requires: `fulfillments:read` scope'
      operationId: getFulfillmentHistory
      parameters:
      - description: The unique identifier of the fulfillment
        in: path
        name: fulfillment_id
        required: true
        schema:
          type: string
      - description: Maximum number of history entries to return per page. When omitted or set to 0, all entries are returned.
        example: 100
        in: query
        name: limit
        schema:
          maximum: 1000
          minimum: 0
          type: integer
      - description: Opaque pagination cursor returned from a previous request. Pass this value to retrieve the next page of results.
        in: query
        name: cursor
        schema:
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FulfillmentHistoryResponse'
          description: Successful response with fulfillment history entries
        '400':
          description: Bad Request — invalid cursor or limit parameter
        '401':
          description: Unauthorized
        '403':
          description: Forbidden
        '404':
          description: Not Found — fulfillment does not exist or feature is not enabled
      summary: Get Fulfillment History
      tags:
      - Fulfillments
  /fulfillments/{fulfillment_id}/pack:
    post:
      description: 'Sets pack quantity for line items for a given sale. This is an idempotent action.


        Each line item may optionally include a `source_breakdown`, which specifies how a packing quantity should be sourced.

        When provided, both fields are required and must sum to the parent quantity.

        Source breakdown is not allowed when the quantity is negative (unpacking).


        🔒 Requires: `sales:write` scope'
      operationId: postPackLineItems
      parameters:
      - description: The unique identifier of the fulfillment
        in: path
        name: fulfillment_id
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PackLineItemsRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PackLineItemsResponse'
          description: Sale line item packed successfully.
        '400':
          description: Bad Request
        '401':
          description: Unauthorized
        '404':
          description: Not Found
        '409':
          description: Conflict
      security:
      - bearerAuth: []
      summary: Partial Pack line items within a sale
      tags:
      - Fulfillments
  /fulfillments/{fulfillment_id}/pick:
    post:
      description: 'Sets pick quantity for line items for a given sale. This is an idempotent action.


        🔒 Requires: `sales:write` scope'
      operationId: postPickLineItems
      parameters:
      - description: The unique identifier of the fulfillment
        in: path
        name: fulfillment_id
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PickLineItemsRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PickLineItemsResponse'
          description: Sale line item picked successfully.
        '400':
          description: Bad Request
        '401':
          description: Unauthorized
        '404':
          description: Not Found
        '409':
          description: Conflict
      security:
      - bearerAuth: []
      summary: Partial Pick line items within a sale
      tags:
      - Fulfillments
components:
  schemas:
    PickLineItemsRequest:
      properties:
        line_items:
          description: The line items to be picked
          items:
            $ref: '#/components/schemas/PickLineItemRequest'
          type: array
        version:
          description: The current version number of the fulfillment.
          example: 5
          format: int32
          type: integer
      required:
      - version
      - line_items
      type: object
    FulfillLineItemsRequest:
      properties:
        line_items:
          description: The line items to be fulfilled
          items:
            $ref: '#/components/schemas/FulfillmentLineItemRequest'
          type: array
        version:
          description: The current version number of the fulfillment.
          example: 5
          format: int32
          type: integer
      required:
      - version
      - line_items
      type: object
    PackLineItemsResponse:
      properties:
        data:
          properties:
            id:
              description: The unique identifier of the fulfillment.
              example: '7428951063847291856'
              type: string
            version:
              description: The new version number of the fulfillment after the update.
              example: 3
              format: int32
              type: integer
          type: object
      type: object
    FulfillmentResponse:
      properties:
        id:
          description: The unique identifier of the fulfillment.
          example: '1950523126384443392'
          type: string
        version:
          description: The new version number of the fulfillment after the update.
          example: 2
          format: int32
          type: integer
      type: object
    FulfillmentHistoryResponse:
      description: Paginated response containing fulfillment history entries
      properties:
        data:
          description: List of history entries ordered oldest-first
          items:
            $ref: '#/components/schemas/FulfillmentHistoryEntry'
          type: array
        next_cursor:
          description: Opaque cursor for fetching the next page. Empty when no more pages exist.
          type: string
      required:
      - data
      type: object
    FulfillmentHistoryEntry:
      description: A single state-change event in the fulfillment history ledger
      properties:
        created_at:
          description: Timestamp when the event was recorded
          example: '2025-01-15T10:30:00Z'
          format: date-time
          type: string
        event_type:
          description: The type of state-change event
          enum:
          - CREATED
          - QUANTITY_UPDATED
          - REMOVED
          - PICKED
          - PACKED
          - FULFILLED
          - VOIDED
          - UNVOIDED
          - RETURNED
          - RETURN_VOIDED
          - SPLIT
          type: string
        fulfilled_delta:
          description: Change in fulfilled quantity for this line item
          example: '0'
          type: string
        packed_quantity_delta:
          description: Change in packed quantity for this line item
          example: '0'
          type: string
        picked_quantity_delta:
          description: Change in picked quantity for this line item
          example: '0'
          type: string
        product_id:
          description: The ID of the product associated with the line item
          example: e058ea02-c565-405f-be27-cefaeeca1f92
          format: uuid
          type: string
        quantity_delta:
          description: Change in total quantity for this line item
          example: '5'
          type: string
        sale_line_item_id:
          description: The ID of the sale line item this event relates to
          example: 81b37e5f-aa50-4fe3-95d3-a3cec73a7e2c
          format: uuid
          type: string
        source_sale_id:
          description: The ID of the source sale (present for RETURNED and SPLIT events)
          example: 81d2fc44-e4d4-4180-8f1e-b36de2acf438
          format: uuid
          type: string
      required:
      - sale_line_item_id
      - product_id
      - event_type
      - quantity_delta
      - picked_quantity_delta
      - packed_quantity_delta
      - fulfilled_delta
      - created_at
      type: object
    FulfillmentLineItemRequest:
      properties:
        quantity:
          description: The quantity to be fulfilled
          example: 1
          format: double
          type: number
        sale_line_item_id:
          description: The unique identifier of the sale line item to be fulfilled.
          example: f3a8d2c1-9b7e-4f56-8a12-3e4d5c6b7a89
          format: uuid
          type: string
        source_breakdown:
          $ref: '#/components/schemas/FulfillLineItemSourceBreakdown'
      required:
      - sale_line_item_id
      - quantity
      type: object
    FulfillSaleResponse:
      properties:
        data:
          description: A list of the updated fulfillments.
          items:
            $ref: '#/components/schemas/FulfillmentResponse'
          type: array
      type: object
    FulfillLineItemsResponse:
      properties:
        data:
          properties:
            id:
              description: The unique identifier of the fulfillment.
              example: '7428951063847291856'
              type: string
            version:
              description: The new version number of the fulfillment after the update.
              example: 3
              format: int32
              type: integer
          type: object
      type: object
    FulfillSaleRequest:
      properties:
        sale_id:
          description: The unique identifier of the sale to be fulfilled.
          example: 075bbd4b-302a-a27c-11f0-6d3a98056287
          format: uuid
          type: string
      required:
      - sale_id
      type: object
    PackLineItemRequest:
      properties:
        quantity:
          description: The quantity to be packed
          example: 1
          format: double
          type: number
        sale_line_item_id:
          description: The unique identifier of the sale line item to be packed.
          example: f3a8d2c1-9b7e-4f56-8a12-3e4d5c6b7a89
          format: uuid
          type: string
        source_breakdown:
          $ref: '#/components/schemas/PackLineItemSourceBreakdown'
      required:
      - sale_line_item_id
      - quantity
      type: object
    PackLineItemsRequest:
      properties:
        line_items:
          description: The line items to be packed
          items:
            $ref: '#/components/schemas/PackLineItemRequest'
          type: array
        version:
          description: The current version number of the fulfillment.
          example: 5
          format: int32
          type: integer
      required:
      - version
      - line_items
      type: object
    FulfillmentSummaryItem:
      properties:
        created_at:
          description: Timestamp when the item was created
          example: '2024-01-15T10:30:00Z'
          format: date-time
          type: string
        id:
          description: Unique identifier for the fulfillment summary item
          example: '1947700198720344064'
          type: string
        line_items:
          items:
            $ref: '#/components/schemas/FulfillmentSummaryLineItem'
          type: array
        note:
          description: Combined notes with newline separators
          example: 'Customer requested specific pickup time

            Handle with care'
          type: string
        outlet_id:
          description: Identifier of the outlet
          example: e058ea02-c565-405f-be27-cefaeeca1f92
          type: string
        sale_id:
          description: Identifier of the sale
          example: 81b37e5f-aa50-4fe3-95d3-a3cec73a7e2c
          type: string
        shipping_address_id:
          description: ID of the shipping address associated with this fulfillment. Only present for DISPATCH type fulfillments.
          example: '12345678901234567'
          type:
          - string
          - 'null'
        state:
          description: Current state of the fulfillment
          enum:
          - OPEN
          - STARTED
          - PICKED
          - PACKED
          - FULFILLED
          example: OPEN
          type: string
        type:
          description: Type of fulfillment
          enum:
          - PICKUP
          - DISPATCH
          - SERVICE
          example: PICKUP
          type: string
        updated_at:
          description: Timestamp when the item was last updated
          example: '2024-01-15T14:20:00Z'
          format: date-time
          type: string
        user_ids:
          description: List of user IDs associated with this fulfillment
          example:
          - cca2eff2-9d4a-403b-a045-af953b6572b0
          items:
            type: string
          type: array
        version:
          description: Version number for optimistic locking
          example: 1
          format: int32
          type: integer
      required:
      - id
      - outlet_id
      - sale_id
      - type
      - state
      - user_ids
      - note
      - created_at
      - updated_at
      - version
      - line_items
      type: object
    PickLineItemsResponse:
      properties:
        data:
          properties:
            id:
              description: The unique identifier of the fulfillment.
              example: '7428951063847291856'
              type: string
            version:
              description: The new version number of the fulfillment after the update.
              example: 3
              format: int32
              type: integer
          type: object
      type: object
    FulfillmentSummaryResponse:
      properties:
        data:
          items:
            $ref: '#/components/schemas/FulfillmentSummaryItem'
          type: array
      required:
      - data
      type: object
    FulfillmentSummaryLineItem:
      properties:
        fulfilled_quantity:
          description: Quantity that has been fulfilled (decimal as string)
          example: '0.00'
          pattern: ^-?\d+(\.\d+)?$
          type: string
        packed_quantity:
          description: Quantity that has been packed (decimal as string)
          example: '0.00'
          pattern: ^-?\d+(\.\d+)?$
          type: string
        picked_quantity:
          description: Quantity that has been picked (decimal as string)
          example: '0.00'
          pattern: ^-?\d+(\.\d+)?$
          type: string
        product_id:
          description: Identifier of the product
          example: e9d7d1b3-0561-45f5-9e40-c7bfa81db394
          type: string
        quantity:
          description: Total quantity (decimal as string)
          example: '5.00'
          pattern: ^-?\d+(\.\d+)?$
          type: string
        sale_line_item_id:
          description: Identifier of the sale line item
          example: 460e1119-2f41-42a3-bd61-3f9639e2e265
          type: string
      required:
      - sale_line_item_id
      - product_id
      - quantity
      - picked_quantity
      - packed_quantity
      - fulfilled_quantity
      type: object
    FulfillLineItemSourceBreakdown:
      description: Specifies how a fulfillment quantity should be sourced. When provided, all three fields are required and must sum to the parent quantity.
      properties:
        quantity_from_not_started:
          description: Quantity to source from the not-started state.
          format: double
          type: number
        quantity_from_packed:
          description: Quantity to source from the packed state.
          format: double
          type: number
        quantity_from_picked:
          description: Quantity to source from the picked state.
          format: double
          type: number
      required:
      - quantity_from_picked
      - quantity_from_packed
      - quantity_from_not_started
      type: object
    PickLineItemRequest:
      properties:
        quantity:
          description: The quantity to be picked
          example: 1
          format: double
          type: number
        sale_line_item_id:
          description: The unique identifier of the sale line item to be picked.
          example: f3a8d2c1-9b7e-4f56-8a12-3e4d5c6b7a89
          format: uuid
          type: string
      required:
      - sale_line_item_id
      - quantity
      type: object
    PackLineItemSourceBreakdown:
      description: Specifies how a packing quantity should be sourced. When provided, both fields are required and must sum to the parent quantity. Source breakdown is not allowed when the parent quantity is negative (unpacking).
      properties:
        quantity_from_not_started:
          description: Quantity to source from the not-started state.
          format: double
          type: number
        quantity_from_picked:
          description: Quantity to source from the picked state.
          format: double
          type: number
      required:
      - quantity_from_picked
      - quantity_from_not_started
      type: object
  securitySchemes:
    bearerAuth:
      description: Bearer Token for API authentication.
      scheme: bearer
      type: http
externalDocs:
  description: List of tz database time zones
  url: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones