Skip to main content

API Guide: Purchase Orders (Create, Update and Receive)

Create, update and receive purchase orders with the Logiwa IO Open API: endpoints, required fields, the rules each call applies, error messages and the PO status change webhook.

Overview

The Logiwa IO Open API lets your own systems create, update and receive purchase orders (POs) without the web screens. This guide lists the PO endpoints, the fields a PO needs, the rules each call applies and the errors it returns, so your integration can send clean data and handle failures.

When to use it

  • You are building an integration that sends POs to Logiwa IO.

  • You receive POs from another system, such as a dock or scanning app.

  • An API call returned an error and you need to know why.

Prerequisites

  • An Open API token for your Logiwa IO account.

  • The client, warehouse, vendor, PO type and products the PO uses already exist in Logiwa IO.


Endpoints

Endpoint

What it does

Notes

POST /v3.1/PurchaseOrder/create

Creates a PO

Returns 201 with the PO identifier

PUT /v3.1/PurchaseOrder/update

Updates a PO

The line list you send replaces the PO’s lines

POST /v3.1/PurchaseOrder/receive

Receives a quantity of one SKU on a PO

One SKU per call

GET /v3.1/PurchaseOrder/detail/{identifier}

GET /v3.1/PurchaseOrder/detail/code/{code}/warehouse/{warehouseIdentifier}/client/{clientIdentifier}

Reads one PO by identifier or by code

—

GET /v3.1/PurchaseOrder/list/i/{index}/s/{size}

Lists POs, page by page

—

GET /v3.1/PurchaseOrder/list/vendor/i/{index}/s/{size}

Lists vendors

Filters: ClientIdentifier, Identifier, DisplayName

POST /v3.1/PurchaseOrder/document

Attaches a document to a PO

—

GET /v3.2/Report/PurchaseOrderReceivingHistory/i/{index}/s/{size}

The PO Receiving Report

Filters: Code, Sku, ClientIdentifier, ReceiptDate, WarehouseIdentifier

/v3.1/DataSetup/purchaseordertype/create, /list, /update

Creates, lists and updates PO types

—


Create a PO

Send the PO header and its lines in one call. A PO needs these fields:

Field

What it’s for

Example

code

The PO number

PO-1001

clientIdentifier, warehouseIdentifier

The client and warehouse the PO belongs to

—

vendor

The vendor’s name

Global Supply

purchaseOrderTypeName

The PO type, which decides the receiving rules

Purchase Order

purchaseOrderDate

The PO date. Without it the call fails with “PurchaseOrderDate must be date format”

2026-11-13T00:00:00Z

purchaseOrderLineList

The lines: sku, packType and packQuantity on each. Without a pack type the call fails with “This line pack type not exists”

SKU-100, Unit, 5


Create and update rules

Rule

What happens

Example

Unknown SKU

400 “This product is not found: '{SKU}'”

This product is not found: 'INVALID-SKU-123'

Identical lines

Lines with the same SKU, pack type, lot, expiry date and production date become one line with the quantities added up. A different price doesn’t keep them apart

Two lines of SKU-100 (2 and 3, different prices) become one line of 5

Lot, expiry or production date on a product that doesn’t track it

400 with an error code that names the SKU

Logiwa.Wms.Error.Product.ExpiryDateTrackingIsNotEnabled (SKU-100)

Date before 1 January 1970

400

Logiwa.Wms.Error.PurchaseOrder.DateMustBeLaterMinDate (12/31/1969 00:00:00)

PO without lines

400 unless the PO type has Allow Create Without Product on. With it, the PO is created with no lines. A line with an unknown SKU is still refused

Logiwa.Wms.Error.PurchaseOrder.IsAllowEmptyPurchaseOrderDisabled

Kit-to-Order product on a line

400. Kit-to-Order products can’t be added to POs

Logiwa.Wms.Error.PurchaseOrder.KitToOrderProductsCannotBeAdded

Update with a line list

The lines you send replace the PO’s lines. Send every line you want to keep

A PO with one line of 5 is updated with one line of 4. The PO now has one line of 4

Size

Up to 2,000 lines per PO

—


Receive a PO

Each receive call receives a quantity of one SKU into a location (warehouseLocationCode) and, optionally, into an LP (license plate). The first successful receipt moves the PO to Started.

LP rules

Situation

Result

Message

licensePlateNumber doesn’t exist and createLPIsNotExists is false

400

“This LP does not exist”

licensePlateIdentifier doesn’t exist

400

“This LP does not exist”

New licensePlateNumber, createLPIsNotExists is true, no LP type sent

400

“LP {number} Creation failed. Valid LP Type required”

licencePlateType (LP type code) doesn’t exist

400

“License plate type cannot be found”

An existing LP number sent with a different LP type

400

“License Plate Type Mismatch: The provided LP Number … does not match the existing …”

parentLicensePlateIdentifier doesn’t exist

400

“Entered parent LP does not exist.”

New licensePlateNumber, createLPIsNotExists is true, and a valid LP type (licensePlateTypeIdentifier or licencePlateType)

200. The LP is created and the items are received into it

—

💡 The LP type code isn’t case-sensitive: selp1 finds the LP type SeLP1. Note the spelling of the field: licencePlateType.

⚠️ When a receive call fails, nothing is received.

Receiving verification

If the client’s Receiving Verification is set to Prevent, a receive call for a product without the required dimensions, weight or volume returns 400. See Handling Missing Physical Attributes During Receiving.


Status change webhook

The wms/purchaseorder/statuschange webhook is sent when a PO changes status. All its dates, such as PurchaseOrderCreatedDateTime and ActualReceivingDate, are in UTC with three digits of milliseconds, for example 2026-03-25T10:24:08.123Z. Empty dates are sent as null.


Common questions

I sent two lines for the same SKU, but the PO has one line. Why? Identical lines are merged. To keep them apart, they must differ in pack type, lot, expiry date or production date.

My update removed lines from the PO. Why? The update replaces the PO’s lines with the list you send. Send every line you want to keep.

My receive call returns “This LP does not exist”. What should I do? Send an existing LP, or set createLPIsNotExists to true and send an LP type so that the LP is created.

Did this answer your question?