Morffeus Docs
ENSR morffeus.com

Identifiers & matching

You do not need our ids to send data. Your ERP, warehouse system or till sends the codes, barcodes and references it already has, and we find the matching record. This page says what each call matches on, in which order, and what happens when nothing matches.

The identifiers#

IdentifierWhat it is
idintegerOur id. Every response carries it. You can store it, but you never have to send it to write.
codestringYour code: a product number, an SKU, a warehouse code. Products, variants, warehouses, store locations, catalogs and attribute definitions have one. Reconcile calls a variant code sku; stock rows call a warehouse code warehouse_code.
barcodestringAn EAN or other scannable code. Products, variants and loyalty cards have one.
external_refstringYour system's own id for the record, when it is not the code: the row id in your ERP, for example. Variants, attribute definitions, store locations, customers, cards and orders have one.

Rules that apply everywhere#

What each call matches on#

Call and recordTried in this orderWhen nothing matches
POST /int/products productid, code, external_refThe product is created.
POST /int/products variantcode, barcode, external_refThe variant is created on the product. A variant of another product fails the product.
PUT /int/stocks variantcode, barcode, external_refThe row fails; the other rows are written.
PUT /int/stocks warehousewarehouse_codeThe row fails.
POST /stock/reconcileVariant code as sku; warehouse by warehouse_codeAn unknown SKU fails its entry. An unknown warehouse fails the call with 404.
PUT /int/product_attributes productOne of its variants by code, barcode, external_refThe whole call fails and nothing is written.
PUT /int/product_attributes definitionexternal_ref, together with product_attribute_def_id when you send itThe definition is created.
PUT /warehousecode and id: both must match when you send bothThe warehouse is created.
POST /product/verifyVariant by code or barcode, then productThe row comes back without ids. Nothing is ever written.

Orders, customers, cards, catalogs and store locations match in their own ways; their pages say how: Orders, Customers, Cards, Catalogs, Locations.

Match products by code, not by external_ref. POST /int/products does not store a product's external_ref, so it only finds products that got one elsewhere. Variants store theirs. See Products.

Orders and customers: three-part ids#

Orders, customers and cards are stored in partitions. Each record is named by our id together with two partition numbers, data_part and time_part. They are not dates and they do not change for a record.

In practice#

Last updated 1 October 2026 · API v2 Something wrong on this page?