Hoppa till innehållet

Items

Items/products including stock availability, price calculation, units, attributes and assets. Addressed by itemNumber.

15 calls GET POST PATCH PUT Base URL https://api.erp.fluit.cloud/preview

Authentication, error codes, rate limits, idempotency and pagination apply to every call and are documented once under Getting started.

GET /attributes

List attribute definitions

Returns the active product attribute definitions — the specification fields an item can carry — with the rules that govern their values: data type, unit, allowed values for a fixed list, numeric bounds, a pattern text must match, and whether an item may hold several values.

Show the full description

Use code when setting a value with PUT /preview/items/{itemNumber}/attributes/{attributeCode}, and when filtering GET /preview/items with ?attribute=.

items:read Paginated

Query parameters

Field Type Description
search string Matches the attribute code and name, case-insensitively and on partial words.
page integer Page to return, 1-based. Default 1.
pageSize integer Number of records per page. Default 50, max 200.

Responses

200 PagedResult_PublicAttributeResponse

Paginated response: the fields below sit in items[], wrapped in totalCount, page, pageSize, totalPages, hasPreviousPage and hasNextPage. Paginated

Field Type Description
allowedValues string[] · nullable The permitted values when PublicApi.Preview.Items.Queries.PublicAttributeResponse.HasPredefinedValues is true.
code Required string · nullable Stable code, e.g. `material`. This is what you pass when setting a value.
dataType enum Data type of a product attribute value. Mirrors `Domain.Items.AttributeDataType`. Determines how `attributes[].value` is formatted in responses and parsed in requests. Text WholeNumber DecimalNumber Boolean Date Url Html Color
description string · nullable Administrator-facing description of what the attribute means.
group string · nullable Group the attribute is shown under, e.g. `Dimensions`.
hasPredefinedValues boolean True when the attribute takes its value from PublicApi.Preview.Items.Queries.PublicAttributeResponse.AllowedValues rather than free input.
isMultiValue boolean True when an item may hold several values for this attribute.
isVisibleOnProductPage boolean True when the attribute is shown on the product page in the web shop.
maxValue decimal · nullable Highest accepted value for a numeric attribute. Null means no upper bound.
minValue decimal · nullable Lowest accepted value for a numeric attribute. Null means no lower bound.
name Required string · nullable Display name, e.g. `Material`.
pattern string · nullable Regular expression a text value must match in full. Null means no pattern is enforced.
unit string · nullable Unit shown after the value, e.g. `kg`. Null when the attribute has no unit.

Standard errors: 401 403 Errors

Examples

curl
curl "https://api.erp.fluit.cloud/preview/attributes"
Response 200
{
  "hasNextPage": true,
  "hasPreviousPage": true,
  "items": [
    {
      "allowedValues": [
        "string"
      ],
      "code": "string",
      "dataType": "Text",
      "description": "string",
      "group": "string",
      "hasPredefinedValues": true,
      "isMultiValue": true,
      "isVisibleOnProductPage": true,
      "maxValue": "299.00",
      "minValue": "299.00",
      "name": "Acme AB",
      "pattern": "string",
      "unit": "st"
    }
  ],
  "page": 1,
  "pageSize": 50,
  "totalCount": 137,
  "totalPages": 3
}

Base URL https://api.erp.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

GET /inventory/availability

List stock availability for many items

Returns stock availability for every stocked item, paginated, with the same per-warehouse breakdown as GET /preview/items/{itemNumber}/availability — including whether movements in that warehouse require serial or batch numbers.

Show the full description

Use this instead of calling the per-item endpoint in a loop: a catalogue of a few thousand SKUs otherwise consumes the entire rate limit budget on every sync cycle. Items with no stock record in any active warehouse are omitted. Pagination is over items, never over warehouse rows, so an item's totals are always complete.

Query parameters

Field Type Description
itemNumbers string Comma-separated item numbers to limit the result to. Max 200 values.
warehouseCode string Restricts the breakdown to one warehouse, in which case the totals cover that warehouse only.
modifiedSince string(date-time) Returns only items whose stock records were created or changed at or after this instant (ISO 8601 UTC datetime). This is what makes a recurring poll cheap.
page integer Page to return, 1-based. Default 1.
pageSize integer Number of records per page. Default 50, max 200.

Responses

200 PagedResult_PublicItemAvailabilityResponse

Paginated response: the fields below sit in items[], wrapped in totalCount, page, pageSize, totalPages, hasPreviousPage and hasNextPage. Paginated

Field Type Description
itemNumber string · nullable Item number of the item.
totalAllocatedQuantity decimal Total quantity reserved for orders across all warehouses. Serialised as a decimal string.
totalAvailableQuantity decimal Total quantity available for new orders (on hand − allocated). Serialised as a decimal string.
totalQuantityOnHand decimal Total physical quantity on hand across all warehouses. Serialised as a decimal string.
warehouses WarehouseAvailability[] · nullable Per-warehouse breakdown. Empty list if the item is not stocked in any warehouse.
400 ProblemDetails itemNumbers held more than 200 values.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl "https://api.erp.fluit.cloud/preview/inventory/availability"
Response 200
{
  "hasNextPage": true,
  "hasPreviousPage": true,
  "items": [
    {
      "itemNumber": "WIDGET-A",
      "totalAllocatedQuantity": "10",
      "totalAvailableQuantity": "10",
      "totalQuantityOnHand": "10",
      "warehouses": [
        {
          "allocatedQuantity": "10",
          "availableQuantity": "10",
          "quantityOnHand": "10",
          "replenishmentType": "Purchase",
          "requiresBatch": true,
          "requiresSerial": true,
          "trackingType": "None",
          "warehouseCode": "MAIN",
          "warehouseName": "Main warehouse"
        }
      ]
    }
  ],
  "page": 1,
  "pageSize": 50,
  "totalCount": 137,
  "totalPages": 3
}

Base URL https://api.erp.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

GET /items

List items

Returns a paginated list of items for the authenticated tenant. Sorted by item number. Filters combine with AND. Enum filters are matched case-insensitively and an unknown value returns 400.

Show the full description

Delta sync: ?modifiedSince= (ISO 8601 UTC datetime) returns records created or changed at or after that instant, and is the intended way to run an incremental sync. A change anywhere inside the record counts: editing a line moves the parent's modifiedDate too, so no change can hide below the resource level. Newly created items are included even though they have no modifiedDate yet. Deletions are not visible here: a deleted record is really gone, so it simply stops appearing, which is indistinguishable from "unchanged". Poll GET /preview/deletions?deletedSince= alongside this endpoint to learn what was removed.

Query parameters

Field Type Description
search string Matches item number, name and description, case-insensitively and on partial words.
status enum Filters on the item's lifecycle status. Draft PendingApproval Active PhasingOut Discontinued Archived
modifiedSince string(date-time) Returns only records created or changed at or after this instant (ISO 8601 UTC datetime). A change anywhere inside the record counts, including on its lines.
reference string Looks the value up as an identifier: first the item number, then the item's own barcode, then barcodes on alternative units (case, pallet) and finally cross-references such as manufacturer (MPN) and OEM numbers. The identifier that matched is reported per row in matchedOn. Barcodes are not guaranteed unique, so this returns a list rather than one item.
referenceType enum Restricts ?reference= to one cross-reference type instead of searching every identifier. Manufacturer Oem IndustryStandard Superseded Competitor Barcode Custom
itemNumbers string Comma-separated item numbers to fetch in one call, so a change notification covering many items costs one request instead of one each. Max 200 values.
itemType enum Filters on what kind of item it is. StockItem NonStockItem Service Work Consumable Kit Phantom Charge VariantMaster
grade enum Filters on the item's quality grade. A B C D
publishOnWeb boolean Retired. Use sales-channel publications instead.
isSellable boolean Filters on whether the item may be sold.
isConfigurable boolean True returns only made-to-order items that have a configuration schema at GET /preview/items/{itemNumber}/configuration; false returns only the plain catalogue items.
isVariant boolean True returns only variants, false only non-variants.
categoryCode string Filters on the stable category code, counting only active and non-deleted assignments. Subcategories are not included — expand the tree client-side. This is also how you build the picker for an ItemSelection feature, by passing its selectableItemCategoryCode.
brandCode string Filters on the brand code.
parentItemNumber string Returns the variants of one variant master, given by its item number.
attribute string Filters on an attribute code from GET /preview/attributes. Alone it returns the items that have the attribute filled in at all — useful for finding what is still missing. Combine with attributeValue to filter on the value.
attributeValue string The attribute value to match, exactly. Requires ?attribute=. Numbers are compared as numbers, so 40 matches a stored 40.000000. For partial matches across all text, use ?search= instead.
language string ISO 639-1 language code, e.g. en. Returns name, description and short description translated to that language where a translation exists; other fields and untranslated texts come back in the base language. An unknown or inactive language is ignored.
page integer Page to return, 1-based. Default 1.
pageSize integer Number of records per page. Default 50, max 200.

Responses

200 PagedResult_PublicItemResponse

Paginated response: the fields below sit in items[], wrapped in totalCount, page, pageSize, totalPages, hasPreviousPage and hasNextPage. Paginated

Field Type Description
barcode string · nullable EAN / GTIN barcode or other scanning code. Null if not set.
baseUnitCode string · nullable Code of the item's base unit of measure, e.g. `st`, `kg`. Null if not set.
brandCode string · nullable Stable brand code, usable to correlate against your own brand register. Null if not set.
brandName string · nullable Brand name. Null if not set.
categoryCode string · nullable Stable code of the item's primary-hierarchy category, e.g. `TOOLS-HAND` — the value to pass to `?categoryCode=` and the one a feature's `selectableItemCategoryCode` refers to. Null if not categorised.
categoryName string · nullable Name of the item's primary-hierarchy category. Null if not categorised.
countryOfOrigin string · nullable ISO 3166-1 alpha-2 country of manufacture, e.g. `SE`, `CN`. Null if not set.
createdDate string(date-time) UTC timestamp when the item was created.
decimalPlaces integer Number of decimals allowed on quantities for this item (0–6). Quantities with more decimals are rejected.
depth decimal · nullable Depth in centimetres. Serialised as a decimal string. Null if not set.
description string · nullable Long-form description, e.g. for a product page. Null if not set.
grade enum Item condition grade (A/B/C-stock) exposed via the Public API. Mirrors `Domain.Items.Grade`. A B C D
height decimal · nullable Height in centimetres. Serialised as a decimal string. Null if not set.
hsCode string · nullable Harmonized System (HS / KN) customs tariff code. Null if not set.
id string(uuid) Internal unique identifier (UUID v7).
isActive boolean Whether the item is active. Inactive items cannot be placed on new orders.
isConfigurable boolean Whether the item is made to order from configurable features (measurements, fabrics, add-ons). True means GET /preview/items/{itemNumber}/configuration returns a configuration schema and the item is ordered through /preview/configurations rather than as a plain order line.
isSellable boolean Whether the item can be sold. False for component-only items.
isStockable boolean Whether the item is held in inventory. False for services, charges and drop-shipped items. Derived from `itemType` — use this rather than matching on the type yourself, so a new item type does not silently change how your integration classifies the item.
itemNumber string · nullable Unique item number — business key, e.g. `WIDGET-PRO`.
itemType enum Item type exposed via the Public API. Mirrors `Domain.Items.ItemType`. StockItem NonStockItem Service Work Consumable Kit Phantom Charge VariantMaster
links Links Hypermedia links for a public API resource. Exposed as a computed `links` property on the public response DTOs so that create and read responses carry the same self-reference — the canonical URL is derived from the business key already present on the DTO and can never drift from the route it points at.
matchedOn string · nullable Which identifier the `?reference=` lookup matched on: `ItemNumber`, `Barcode` (the item's own), `PackBarcode` (a barcode on an alternative unit such as a box) or `CrossReference` (manufacturer/OEM number). Null unless `?reference=` was used. A scanner uses this to tell a single unit from a case: a `PackBarcode` match means the scanned code represents several base units, so read `units[]` on the item detail for the conversion factor before booking a quantity.
modifiedDate string(date-time) · nullable UTC timestamp of the last modification. Null if never modified after creation.
name string · nullable Display name / product name.
netWeight decimal · nullable Net weight in kilograms. Serialised as a decimal string to avoid IEEE 754 precision loss. Null if not set.
parentItemNumber string · nullable Item number of the variant master this item belongs to. Null unless the item is a variant.
publishOnWeb boolean Whether the item has an active publication on at least one sales channel. Retained as a compatibility alias; new integrations should use channel publications.
salesEndDate string(date) · nullable Date until which the item can be sold (ISO 8601 date). Null if unrestricted.
salesPrice decimal · nullable Default sales price in the tenant default currency. Serialised as a decimal string. Null if not set.
salesStartDate string(date) · nullable Date from which the item can be sold (ISO 8601 date). Null if unrestricted.
shortDescription string · nullable Short selling description, e.g. for a product card. Null if not set.
slug string · nullable URL slug for storefronts. Null when the item has none and the item number is used.
status enum Item status exposed via the Public API. Mirrors `Domain.Items.ItemStatus`. Draft PendingApproval Active PhasingOut Discontinued Archived
taxClassCode string · nullable Code of the tax class governing VAT for this item, e.g. `STANDARD`. Null if not set, in which case the tenant default applies. Look the rate up via GET /preview/reference/tax-classes — the rate depends on country and date and is therefore not a property of the item.
thumbnailUrl string · nullable URL to the item's thumbnail image. Null if no image is set.
width decimal · nullable Width in centimetres. Serialised as a decimal string. Null if not set.
400 ProblemDetails An enum filter (status, referenceType, itemType, grade) got a value outside its list, itemNumbers held more than 200 values, or the retired publishOnWeb filter was provided.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl "https://api.erp.fluit.cloud/preview/items"
Response 200
{
  "hasNextPage": true,
  "hasPreviousPage": true,
  "items": [
    {
      "barcode": "string",
      "baseUnitCode": "st",
      "brandCode": "STD",
      "brandName": "Fluit",
      "categoryCode": "STD",
      "categoryName": "Hand tools",
      "countryOfOrigin": "string",
      "createdDate": "2026-06-11T09:24:13.418",
      "decimalPlaces": 2,
      "depth": "299.00",
      "description": "string",
      "grade": "A",
      "height": "299.00",
      "hsCode": "STD",
      "id": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
      "isActive": true,
      "isConfigurable": true,
      "isSellable": true,
      "isStockable": true,
      "itemNumber": "WIDGET-A",
      "itemType": "StockItem",
      "links": {
        "self": "string"
      },
      "matchedOn": "string",
      "modifiedDate": "2026-06-11T09:24:13.418",
      "name": "Widget A",
      "netWeight": "1.250",
      "parentItemNumber": "ABC-001",
      "publishOnWeb": true,
      "salesEndDate": "2026-06-11",
      "salesPrice": "299.00",
      "salesStartDate": "2026-06-11",
      "shortDescription": "string",
      "slug": "string",
      "status": "Draft",
      "taxClassCode": "STD",
      "thumbnailUrl": "https://cdn.fluit.cloud/assets/widget-a-front-thumb.jpg",
      "width": "299.00"
    }
  ],
  "page": 1,
  "pageSize": 50,
  "totalCount": 137,
  "totalPages": 3
}

Base URL https://api.erp.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

POST /items

Create an item

Creates a new item for the authenticated tenant. Item number is auto-generated if not provided. The response body is the same representation as GET /preview/items/{itemNumber}; the canonical URL is returned in the Location header and in links.self.

Body required

Field Type Description
barcode string · nullable EAN / GTIN barcode or other scanning code.
costPrice decimal · nullable Purchase / cost price in the tenant default currency.
countryOfOrigin string · nullable ISO 3166-1 alpha-2 country of manufacture, e.g. `SE`, `CN`.
description string · nullable Long-form description, e.g. for a webshop product page.
hsCode string · nullable Harmonized System (HS / KN) customs tariff code.
itemNumber string · nullable Unique item number. Only uppercase letters, digits, hyphens and underscores are allowed. Auto-generated if omitted.
name Required string Display name / product name.
netWeight decimal · nullable Net weight in kilograms.
salesPrice decimal · nullable Default sales price in the tenant default currency.

Responses

201 PublicItemDetailResponse
  • Location — URL of the newly created resource.
Field Type Description
allowBackorder boolean Whether customers can back-order the item when it is out of stock.
allowPreOrder boolean Whether customers can pre-order the item before it is in stock.
attributes ItemAttribute[] · nullable Specification attributes (Material, Energy class, …) as name/value pairs. Empty if none.
barcode string · nullable EAN / GTIN barcode of the base unit. Null if not set.
baseUnitCode string · nullable Code of the item's base unit of measure, e.g. `st`, `kg`. Null if not set.
brandCode string · nullable Stable brand code, usable to correlate against your own brand register. Null if not set.
brandName string · nullable Brand name. Null if not set.
categories ItemCategoryAssignment[] · nullable Category assignments for this item, each with its code, name and whether it belongs to the primary hierarchy. Empty if uncategorised.
costPrice decimal · nullable Purchase / cost price in the tenant default currency. Serialised as a decimal string. Null if not set.
costPriceMethod enum How `costPrice` is maintained. Mirrors `Domain.Items.CostPriceMethod`. Anything other than PublicApi.Preview.Items.Queries.PublicCostPriceMethod.Manual means the ERP recalculates the cost price on stock and supplier price changes — a value written through the API will not necessarily stay put. Manual WeightedAverage LastPurchasePrice PrimarySupplier
countryOfOrigin string · nullable ISO 3166-1 alpha-2 country of manufacture, e.g. `SE`, `CN`. Null if not set.
createdDate string(date-time) UTC timestamp when the item was created.
crossReferences ItemCrossReference[] · nullable Alternative identifiers (manufacturer part numbers, OEM numbers, extra barcodes, …). Empty if none.
decimalPlaces integer Number of decimals allowed on quantities for this item (0–6). Quantities with more decimals are rejected.
defaultReplenishmentType enum How an item is replenished. Mirrors `Domain.Items.ReplenishmentType`. Can be overridden per warehouse. Purchase Manufacture Transfer Assembly
depth decimal · nullable Depth in centimetres. Serialised as a decimal string. Null if not set.
description string · nullable Long-form description, e.g. for a product page. Null if not set.
grade enum Item condition grade (A/B/C-stock) exposed via the Public API. Mirrors `Domain.Items.Grade`. A B C D
height decimal · nullable Height in centimetres. Serialised as a decimal string. Null if not set.
hsCode string · nullable Harmonized System (HS / KN) customs tariff code. Null if not set.
id string(uuid) Internal unique identifier (UUID v7).
isActive boolean Whether the item is active. Inactive items cannot be placed on new orders.
isConfigurable boolean Whether the item is made to order from configurable features (measurements, fabrics, add-ons). True means GET /preview/items/{itemNumber}/configuration returns a configuration schema and the item is ordered through /preview/configurations rather than as a plain order line.
isSellable boolean Whether the item can be sold. False for component-only items.
isStockable boolean Whether the item is held in inventory. False for services, charges and drop-shipped items. Derived from `itemType` — use this rather than matching on the type yourself, so a new item type does not silently change how your integration classifies the item.
itemNumber string · nullable Unique item number — business key, e.g. `WIDGET-PRO`.
itemType enum Item type exposed via the Public API. Mirrors `Domain.Items.ItemType`. StockItem NonStockItem Service Work Consumable Kit Phantom Charge VariantMaster
legacyItemNumber string · nullable Item number in the system this item was migrated from. Null if not migrated.
links Links Hypermedia links for a public API resource. Exposed as a computed `links` property on the public response DTOs so that create and read responses carry the same self-reference — the canonical URL is derived from the business key already present on the DTO and can never drift from the route it points at.
modifiedDate string(date-time) · nullable UTC timestamp of the last modification. Null if never modified after creation.
name string · nullable Display name / product name.
netWeight decimal · nullable Net weight in kilograms. Serialised as a decimal string. Null if not set.
parentItemNumber string · nullable Item number of the variant master this item belongs to. Null unless the item is a variant.
publishOnWeb boolean Whether the item has an active publication on at least one sales channel. Retained as a compatibility alias; new integrations should use channel publications.
salesEndDate string(date) · nullable Date until which the item can be sold (ISO 8601 date). Null if unrestricted.
salesPrice decimal · nullable Default sales price in the tenant default currency. Serialised as a decimal string. Null if not set.
salesStartDate string(date) · nullable Date from which the item can be sold (ISO 8601 date). Null if unrestricted.
shortDescription string · nullable Short selling description, e.g. for a product card. Null if not set.
slug string · nullable URL slug for storefronts. Null when the item has none and the item number is used.
status enum Item status exposed via the Public API. Mirrors `Domain.Items.ItemStatus`. Draft PendingApproval Active PhasingOut Discontinued Archived
taxClassCode string · nullable Code of the tax class governing VAT for this item, e.g. `STANDARD`. Null if not set, in which case the tenant default applies. Look the rate up via GET /preview/reference/tax-classes.
thumbnailUrl string · nullable URL to the item's thumbnail image. Null if no image is set.
units ItemUnit[] · nullable All orderable units: the base unit first (factor 1), then alternative units (box, pallet, …) with their conversion factors and barcodes.
variantAttributes ItemVariantAttribute[] · nullable The variant's own attribute values (e.g. Colour=Red, Size=M). Empty unless the item is a variant.
variantAxes ItemVariantAxis[] · nullable The axes this variant master varies on, with the values available on each (e.g. Colour = [Red, Blue], Size = [S, M, L]). Empty unless the item is a variant master. This is the master's side of the relationship — `variantAttributes` above is a single variant's values. Use GET /preview/items/{itemNumber}/variants to enumerate the variants themselves.
volume decimal · nullable Volume in <b>cubic metres</b>, computed from width × height × depth — which are in <b>centimetres</b>. Serialised as a decimal string. Null unless all three dimensions are set.
width decimal · nullable Width in centimetres. Serialised as a decimal string. Null if not set.
400 ProblemDetails A field failed validation, for example an item number containing characters outside A-Z, 0-9, hyphen and underscore.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl -X POST "https://api.erp.fluit.cloud/preview/items" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @body.json
Full item with pricing and customs
{
  "barcode": "7350100500001",
  "costPrice": "120.00",
  "countryOfOrigin": "SE",
  "description": "High-quality widget for professional use.",
  "hsCode": "84795000",
  "itemNumber": "WIDGET-PRO",
  "name": "Widget Pro 3000",
  "salesPrice": "299.00"
}
Minimal — name only
{
  "name": "Widget Pro 3000"
}
Response 201
{
  "allowBackorder": true,
  "allowPreOrder": true,
  "attributes": [
    {
      "code": "string",
      "dataType": "Text",
      "name": "Widget A",
      "unit": "st",
      "value": "string"
    }
  ],
  "barcode": "string",
  "baseUnitCode": "st",
  "brandCode": "STD",
  "brandName": "Fluit",
  "categories": [
    {
      "code": "string",
      "isPrimary": true,
      "name": "Hand tools"
    }
  ],
  "costPrice": "299.00",
  "costPriceMethod": "Manual",
  "countryOfOrigin": "string",
  "createdDate": "2026-06-11T09:24:13.418",
  "crossReferences": [
    {
      "isPrimary": true,
      "referenceNumber": "ABC-001",
      "source": "string",
      "type": "Manufacturer"
    }
  ],
  "decimalPlaces": 2,
  "defaultReplenishmentType": "Purchase",
  "depth": "299.00",
  "description": "string",
  "grade": "A",
  "height": "299.00",
  "hsCode": "STD",
  "id": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
  "isActive": true,
  "isConfigurable": true,
  "isSellable": true,
  "isStockable": true,
  "itemNumber": "WIDGET-A",
  "itemType": "StockItem",
  "legacyItemNumber": "ABC-001",
  "links": {
    "self": "string"
  },
  "modifiedDate": "2026-06-11T09:24:13.418",
  "name": "Widget A",
  "netWeight": "1.250",
  "parentItemNumber": "ABC-001",
  "publishOnWeb": true,
  "salesEndDate": "2026-06-11",
  "salesPrice": "299.00",
  "salesStartDate": "2026-06-11",
  "shortDescription": "string",
  "slug": "string",
  "status": "Draft",
  "taxClassCode": "STD",
  "thumbnailUrl": "https://cdn.fluit.cloud/assets/widget-a-front-thumb.jpg",
  "units": [
    {
      "barcode": "string",
      "conversionFactor": "299.00",
      "isPurchaseUnit": true,
      "isSalesUnit": true,
      "unitCode": "st"
    }
  ],
  "variantAttributes": [
    {
      "name": "Widget A",
      "value": "string"
    }
  ],
  "variantAxes": [
    {
      "name": "Widget A",
      "values": [
        "string"
      ]
    }
  ],
  "volume": "299.00",
  "width": "299.00"
}

Base URL https://api.erp.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

GET /items/{itemNumber}

Get an item by item number

Returns the full details of an item by its unique item number: all orderable units with barcodes and conversion factors (base unit first), specification attributes, category assignments, cross-references (MPN/OEM/extra barcodes) and, for variants, the parent item and variant attribute values.

Show the full description

The list endpoint returns a leaner representation without these collections. Responses carry a weak ETag; pass it back in If-None-Match to get 304 Not Modified while the record is unchanged. The validator follows the whole record, so a change to a nested part invalidates it too.

items:read Supports ETag

Path parameters

Field Type Description
itemNumber Required string Item number of the item to read.

Query parameters

Field Type Description
language string ISO 639-1 language code, e.g. en. Returns name, description and short description translated to that language where a translation exists; other fields and untranslated texts come back in the base language. An unknown or inactive language is ignored.

Responses

200 PublicItemDetailResponse
  • ETag — Weak validator for this representation. Pass it back in If-None-Match to get 304 Not Modified while the record is unchanged.
Field Type Description
allowBackorder boolean Whether customers can back-order the item when it is out of stock.
allowPreOrder boolean Whether customers can pre-order the item before it is in stock.
attributes ItemAttribute[] · nullable Specification attributes (Material, Energy class, …) as name/value pairs. Empty if none.
barcode string · nullable EAN / GTIN barcode of the base unit. Null if not set.
baseUnitCode string · nullable Code of the item's base unit of measure, e.g. `st`, `kg`. Null if not set.
brandCode string · nullable Stable brand code, usable to correlate against your own brand register. Null if not set.
brandName string · nullable Brand name. Null if not set.
categories ItemCategoryAssignment[] · nullable Category assignments for this item, each with its code, name and whether it belongs to the primary hierarchy. Empty if uncategorised.
costPrice decimal · nullable Purchase / cost price in the tenant default currency. Serialised as a decimal string. Null if not set.
costPriceMethod enum How `costPrice` is maintained. Mirrors `Domain.Items.CostPriceMethod`. Anything other than PublicApi.Preview.Items.Queries.PublicCostPriceMethod.Manual means the ERP recalculates the cost price on stock and supplier price changes — a value written through the API will not necessarily stay put. Manual WeightedAverage LastPurchasePrice PrimarySupplier
countryOfOrigin string · nullable ISO 3166-1 alpha-2 country of manufacture, e.g. `SE`, `CN`. Null if not set.
createdDate string(date-time) UTC timestamp when the item was created.
crossReferences ItemCrossReference[] · nullable Alternative identifiers (manufacturer part numbers, OEM numbers, extra barcodes, …). Empty if none.
decimalPlaces integer Number of decimals allowed on quantities for this item (0–6). Quantities with more decimals are rejected.
defaultReplenishmentType enum How an item is replenished. Mirrors `Domain.Items.ReplenishmentType`. Can be overridden per warehouse. Purchase Manufacture Transfer Assembly
depth decimal · nullable Depth in centimetres. Serialised as a decimal string. Null if not set.
description string · nullable Long-form description, e.g. for a product page. Null if not set.
grade enum Item condition grade (A/B/C-stock) exposed via the Public API. Mirrors `Domain.Items.Grade`. A B C D
height decimal · nullable Height in centimetres. Serialised as a decimal string. Null if not set.
hsCode string · nullable Harmonized System (HS / KN) customs tariff code. Null if not set.
id string(uuid) Internal unique identifier (UUID v7).
isActive boolean Whether the item is active. Inactive items cannot be placed on new orders.
isConfigurable boolean Whether the item is made to order from configurable features (measurements, fabrics, add-ons). True means GET /preview/items/{itemNumber}/configuration returns a configuration schema and the item is ordered through /preview/configurations rather than as a plain order line.
isSellable boolean Whether the item can be sold. False for component-only items.
isStockable boolean Whether the item is held in inventory. False for services, charges and drop-shipped items. Derived from `itemType` — use this rather than matching on the type yourself, so a new item type does not silently change how your integration classifies the item.
itemNumber string · nullable Unique item number — business key, e.g. `WIDGET-PRO`.
itemType enum Item type exposed via the Public API. Mirrors `Domain.Items.ItemType`. StockItem NonStockItem Service Work Consumable Kit Phantom Charge VariantMaster
legacyItemNumber string · nullable Item number in the system this item was migrated from. Null if not migrated.
links Links Hypermedia links for a public API resource. Exposed as a computed `links` property on the public response DTOs so that create and read responses carry the same self-reference — the canonical URL is derived from the business key already present on the DTO and can never drift from the route it points at.
modifiedDate string(date-time) · nullable UTC timestamp of the last modification. Null if never modified after creation.
name string · nullable Display name / product name.
netWeight decimal · nullable Net weight in kilograms. Serialised as a decimal string. Null if not set.
parentItemNumber string · nullable Item number of the variant master this item belongs to. Null unless the item is a variant.
publishOnWeb boolean Whether the item has an active publication on at least one sales channel. Retained as a compatibility alias; new integrations should use channel publications.
salesEndDate string(date) · nullable Date until which the item can be sold (ISO 8601 date). Null if unrestricted.
salesPrice decimal · nullable Default sales price in the tenant default currency. Serialised as a decimal string. Null if not set.
salesStartDate string(date) · nullable Date from which the item can be sold (ISO 8601 date). Null if unrestricted.
shortDescription string · nullable Short selling description, e.g. for a product card. Null if not set.
slug string · nullable URL slug for storefronts. Null when the item has none and the item number is used.
status enum Item status exposed via the Public API. Mirrors `Domain.Items.ItemStatus`. Draft PendingApproval Active PhasingOut Discontinued Archived
taxClassCode string · nullable Code of the tax class governing VAT for this item, e.g. `STANDARD`. Null if not set, in which case the tenant default applies. Look the rate up via GET /preview/reference/tax-classes.
thumbnailUrl string · nullable URL to the item's thumbnail image. Null if no image is set.
units ItemUnit[] · nullable All orderable units: the base unit first (factor 1), then alternative units (box, pallet, …) with their conversion factors and barcodes.
variantAttributes ItemVariantAttribute[] · nullable The variant's own attribute values (e.g. Colour=Red, Size=M). Empty unless the item is a variant.
variantAxes ItemVariantAxis[] · nullable The axes this variant master varies on, with the values available on each (e.g. Colour = [Red, Blue], Size = [S, M, L]). Empty unless the item is a variant master. This is the master's side of the relationship — `variantAttributes` above is a single variant's values. Use GET /preview/items/{itemNumber}/variants to enumerate the variants themselves.
volume decimal · nullable Volume in <b>cubic metres</b>, computed from width × height × depth — which are in <b>centimetres</b>. Serialised as a decimal string. Null unless all three dimensions are set.
width decimal · nullable Width in centimetres. Serialised as a decimal string. Null if not set.
304 Empty body.
  • ETag — Weak validator for this representation. Pass it back in If-None-Match to get 304 Not Modified while the record is unchanged.
404 ProblemDetails No item with that item number.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl "https://api.erp.fluit.cloud/preview/items/{itemNumber}"
Response 200
{
  "allowBackorder": true,
  "allowPreOrder": true,
  "attributes": [
    {
      "code": "string",
      "dataType": "Text",
      "name": "Widget A",
      "unit": "st",
      "value": "string"
    }
  ],
  "barcode": "string",
  "baseUnitCode": "st",
  "brandCode": "STD",
  "brandName": "Fluit",
  "categories": [
    {
      "code": "string",
      "isPrimary": true,
      "name": "Hand tools"
    }
  ],
  "costPrice": "299.00",
  "costPriceMethod": "Manual",
  "countryOfOrigin": "string",
  "createdDate": "2026-06-11T09:24:13.418",
  "crossReferences": [
    {
      "isPrimary": true,
      "referenceNumber": "ABC-001",
      "source": "string",
      "type": "Manufacturer"
    }
  ],
  "decimalPlaces": 2,
  "defaultReplenishmentType": "Purchase",
  "depth": "299.00",
  "description": "string",
  "grade": "A",
  "height": "299.00",
  "hsCode": "STD",
  "id": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
  "isActive": true,
  "isConfigurable": true,
  "isSellable": true,
  "isStockable": true,
  "itemNumber": "WIDGET-A",
  "itemType": "StockItem",
  "legacyItemNumber": "ABC-001",
  "links": {
    "self": "string"
  },
  "modifiedDate": "2026-06-11T09:24:13.418",
  "name": "Widget A",
  "netWeight": "1.250",
  "parentItemNumber": "ABC-001",
  "publishOnWeb": true,
  "salesEndDate": "2026-06-11",
  "salesPrice": "299.00",
  "salesStartDate": "2026-06-11",
  "shortDescription": "string",
  "slug": "string",
  "status": "Draft",
  "taxClassCode": "STD",
  "thumbnailUrl": "https://cdn.fluit.cloud/assets/widget-a-front-thumb.jpg",
  "units": [
    {
      "barcode": "string",
      "conversionFactor": "299.00",
      "isPurchaseUnit": true,
      "isSalesUnit": true,
      "unitCode": "st"
    }
  ],
  "variantAttributes": [
    {
      "name": "Widget A",
      "value": "string"
    }
  ],
  "variantAxes": [
    {
      "name": "Widget A",
      "values": [
        "string"
      ]
    }
  ],
  "volume": "299.00",
  "width": "299.00"
}

Base URL https://api.erp.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

PATCH /items/{itemNumber}

Update an item

Partially updates an item. Only provided fields are updated (JSON Merge Patch semantics). Omitted fields are left unchanged. Pass null to clear a nullable field.

Show the full description

Unknown fields are rejected with 400, naming the field and listing the ones this endpoint accepts. itemNumber cannot be changed here — it is the resource's public key and the address external systems reference.

items:write

Path parameters

Field Type Description
itemNumber Required string Item number of the item to update.

Body required

Field Type Description
allowBackorder boolean · nullable Whether customers can back-order the item when it is out of stock.
allowPreOrder boolean · nullable Whether customers can pre-order the item before it is in stock.
barcode string · nullable EAN / GTIN barcode or other scanning code. Pass `null` to clear.
costPrice decimal · nullable Purchase / cost price in the tenant default currency. Pass `null` to clear.
countryOfOrigin string · nullable ISO 3166-1 alpha-2 country of manufacture, e.g. `SE`, `CN`. Pass `null` to clear.
depth decimal · nullable Depth in centimetres. Pass `null` to clear.
description string · nullable Long-form description, e.g. for a webshop product page. Pass `null` to clear.
height decimal · nullable Height in centimetres. Pass `null` to clear.
hsCode string · nullable Harmonized System (HS / KN) customs tariff code. Pass `null` to clear.
itemType enum Item type exposed via the Public API. Mirrors `Domain.Items.ItemType`. StockItem NonStockItem Service Work Consumable Kit Phantom Charge VariantMaster
name string · nullable Display name / product name.
netWeight decimal · nullable Net weight in kilograms. Pass `null` to clear.
salesEndDate string(date) · nullable Date until which the item can be sold. Pass `null` to clear.
salesPrice decimal · nullable Default sales price in the tenant default currency. Pass `null` to clear.
salesStartDate string(date) · nullable Date from which the item can be sold. Pass `null` to clear.
status enum Item status exposed via the Public API. Mirrors `Domain.Items.ItemStatus`. Draft PendingApproval Active PhasingOut Discontinued Archived
width decimal · nullable Width in centimetres. Pass `null` to clear.

Responses

204 Empty body.
400 ProblemDetails The body is not a JSON object, contains a field this endpoint does not have, or a field present in it failed validation.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable
404 ProblemDetails No item with that item number.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl -X PATCH "https://api.erp.fluit.cloud/preview/items/{itemNumber}" \
  -H "Content-Type: application/json" \
  -d @body.json
Response 400
{
  "detail": "string",
  "instance": "string",
  "status": 42,
  "title": "string",
  "type": "string"
}

Base URL https://api.erp.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

GET /items/{itemNumber}/assets

List item assets

Returns a paginated list of the item's public images and documents, primary image first and then by sort order. Only assets marked as public are included. url points either to an external location or to GET /preview/items/{itemNumber}/assets/{assetId}/download (same API key required).

Show the full description

Use languageCode to pick language-specific assets where present.

items:read Paginated

Path parameters

Field Type Description
itemNumber Required string Item number of the item whose assets to list.

Query parameters

Field Type Description
page integer Page to return, 1-based. Default 1.
pageSize integer Number of records per page. Default 50, max 200.

Responses

200 PagedResult_PublicItemAssetResponse

Paginated response: the fields below sit in items[], wrapped in totalCount, page, pageSize, totalPages, hasPreviousPage and hasNextPage. Paginated

Field Type Description
altText string · nullable Alt text for images (SEO/accessibility). Null if not set.
assetType enum Type of an item asset. Mirrors `Domain.Items.AssetType`. Image Document
category enum Category of an item asset. Mirrors `Domain.Items.AssetCategory`. MainImage GalleryImage LifestyleImage TechnicalImage VariantImage Datasheet Manual Certificate SafetySheet Warranty Brochure Installation Firmware Software Other
contentType string · nullable MIME content type, e.g. `image/jpeg`, `application/pdf`.
description string · nullable Free-text description. Null if not set.
displayName string · nullable Display name for UI listings. Null if not set.
fileName string · nullable Original file name, e.g. `widget-pro-front.jpg`.
fileSize integer File size in bytes.
height integer · nullable Image height in pixels. Null for non-images or if unknown.
id string(uuid) Internal unique identifier of the asset.
isPrimary boolean Whether this is the item's primary image (used as thumbnail in item responses).
languageCode string · nullable ISO 639-1 language code if the asset is language-specific, e.g. `sv`. Null if language-neutral.
sortOrder integer Sort order for galleries (ascending).
thumbnailUrl string · nullable URL to a thumbnail rendition. Null if no thumbnail exists.
url string · nullable URL to download the full asset. Either an external URL or a /preview download endpoint (requires the same API key).
width integer · nullable Image width in pixels. Null for non-images or if unknown.
404 ProblemDetails No item with that item number.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl "https://api.erp.fluit.cloud/preview/items/{itemNumber}/assets"
Response 200
{
  "hasNextPage": true,
  "hasPreviousPage": true,
  "items": [
    {
      "altText": "string",
      "assetType": "Image",
      "category": "MainImage",
      "contentType": "image/jpeg",
      "description": "string",
      "displayName": "Widget A",
      "fileName": "widget-a-front.jpg",
      "fileSize": 42,
      "height": 42,
      "id": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
      "isPrimary": true,
      "languageCode": "STD",
      "sortOrder": 42,
      "thumbnailUrl": "https://cdn.fluit.cloud/assets/widget-a-front-thumb.jpg",
      "url": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
      "width": 42
    }
  ],
  "page": 1,
  "pageSize": 50,
  "totalCount": 137,
  "totalPages": 3
}

Base URL https://api.erp.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

POST /items/{itemNumber}/assets

Upload an item image

Uploads a product image as multipart/form-data. The field name is 'file'; everything else is a query parameter. Supported types: PNG, JPEG, GIF and WebP. Maximum 50 MB per file.

Show the full description

The file's own bytes are checked against the format signatures, so a file that only claims to be an image is rejected. Images only — documents (datasheets, manuals, firmware) are not uploadable here. Uploaded images are always public: they are what the storefront and this API's list endpoint show. isPrimary=true makes the image the item's primary image, which is what the item's thumbnailUrl points at and what a storefront shows in listings; the item's previous primary image loses the flag. The response is the representation GET /preview/items/{itemNumber}/assets/{assetId} returns, and Location points at that address. This POST takes no Idempotency-Key — a multipart body cannot be hashed the way a JSON one can — so a retry after a network failure may create a second image. There is no delete on this surface yet: list the item's assets to see whether the first attempt landed before retrying, and remove a duplicate in the Fluit app. Known error codes: ItemAssets.EmptyFile, ItemAssets.FileTooLarge, ItemAssets.UnsupportedType, ItemAssets.NotAnImage, Item.NotFound. **Not idempotent.** A file upload carries no Idempotency-Key: the body cannot be buffered and hashed the way a JSON request can. Retrying after a network failure may therefore create a second copy — list the folder and compare before retrying, or delete the duplicate afterwards.

items:write

Path parameters

Field Type Description
itemNumber Required string Item number of the item to attach the image to.

Query parameters

Field Type Description
category enum Image category. Defaults to MainImage when isPrimary is true, otherwise GalleryImage. Document categories are rejected — this endpoint uploads images only. MainImage GalleryImage LifestyleImage TechnicalImage VariantImage Datasheet Manual Certificate SafetySheet Warranty Brochure Installation Firmware Software Other
isPrimary boolean Whether this becomes the item's primary image. Defaults to false.
displayName string Display name in listings. Defaults to the file name.
altText string Alt text for accessibility and SEO. Strongly recommended.
description string Free-text description.
languageCode string ISO 639-1 code when the image is language-specific, e.g. sv. Omit for a language-neutral image.

Body

Field Type
file Required string(binary)

Responses

201 PublicItemAssetResponse
  • Location — URL of the newly created resource.
Field Type Description
altText string · nullable Alt text for images (SEO/accessibility). Null if not set.
assetType enum Type of an item asset. Mirrors `Domain.Items.AssetType`. Image Document
category enum Category of an item asset. Mirrors `Domain.Items.AssetCategory`. MainImage GalleryImage LifestyleImage TechnicalImage VariantImage Datasheet Manual Certificate SafetySheet Warranty Brochure Installation Firmware Software Other
contentType string · nullable MIME content type, e.g. `image/jpeg`, `application/pdf`.
description string · nullable Free-text description. Null if not set.
displayName string · nullable Display name for UI listings. Null if not set.
fileName string · nullable Original file name, e.g. `widget-pro-front.jpg`.
fileSize integer File size in bytes.
height integer · nullable Image height in pixels. Null for non-images or if unknown.
id string(uuid) Internal unique identifier of the asset.
isPrimary boolean Whether this is the item's primary image (used as thumbnail in item responses).
languageCode string · nullable ISO 639-1 language code if the asset is language-specific, e.g. `sv`. Null if language-neutral.
sortOrder integer Sort order for galleries (ascending).
thumbnailUrl string · nullable URL to a thumbnail rendition. Null if no thumbnail exists.
url string · nullable URL to download the full asset. Either an external URL or a /preview download endpoint (requires the same API key).
width integer · nullable Image width in pixels. Null for non-images or if unknown.
400 ProblemDetails The file is empty, not a valid image, not one of the supported image types, has no file name, category got a value outside its list or is a document category, or displayName, altText, description or languageCode is longer than allowed.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable
404 ProblemDetails No item with that item number.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable
413 ProblemDetails The request body is larger than 50 MB plus multipart overhead.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl -X POST "https://api.erp.fluit.cloud/preview/items/{itemNumber}/assets" \
  -H "Content-Type: application/json" \
  -d @body.json
Response 201
{
  "altText": "string",
  "assetType": "Image",
  "category": "MainImage",
  "contentType": "image/jpeg",
  "description": "string",
  "displayName": "Widget A",
  "fileName": "widget-a-front.jpg",
  "fileSize": 42,
  "height": 42,
  "id": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
  "isPrimary": true,
  "languageCode": "STD",
  "sortOrder": 42,
  "thumbnailUrl": "https://cdn.fluit.cloud/assets/widget-a-front-thumb.jpg",
  "url": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
  "width": 42
}

Base URL https://api.erp.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

GET /items/{itemNumber}/assets/{assetId}

Read one item asset

Returns the record for one image or document on the item: its url plus the metadata the listing carries. This endpoint returns JSON, not the file itself — the bytes are fetched from GET /preview/items/{itemNumber}/assets/{assetId}/download, which needs the same API key.

Show the full description

This is the address the upload's Location header points at. Responses carry a weak ETag; pass it back in If-None-Match to get 304 Not Modified while the record is unchanged.

items:read Supports ETag

Path parameters

Field Type Description
itemNumber Required string Item number of the item the asset belongs to.
assetId Required string(uuid) The asset's id, as returned by the upload and by the listing.

Responses

200 PublicItemAssetResponse
  • ETag — Weak validator for this representation. Pass it back in If-None-Match to get 304 Not Modified while the record is unchanged.
Field Type Description
altText string · nullable Alt text for images (SEO/accessibility). Null if not set.
assetType enum Type of an item asset. Mirrors `Domain.Items.AssetType`. Image Document
category enum Category of an item asset. Mirrors `Domain.Items.AssetCategory`. MainImage GalleryImage LifestyleImage TechnicalImage VariantImage Datasheet Manual Certificate SafetySheet Warranty Brochure Installation Firmware Software Other
contentType string · nullable MIME content type, e.g. `image/jpeg`, `application/pdf`.
description string · nullable Free-text description. Null if not set.
displayName string · nullable Display name for UI listings. Null if not set.
fileName string · nullable Original file name, e.g. `widget-pro-front.jpg`.
fileSize integer File size in bytes.
height integer · nullable Image height in pixels. Null for non-images or if unknown.
id string(uuid) Internal unique identifier of the asset.
isPrimary boolean Whether this is the item's primary image (used as thumbnail in item responses).
languageCode string · nullable ISO 639-1 language code if the asset is language-specific, e.g. `sv`. Null if language-neutral.
sortOrder integer Sort order for galleries (ascending).
thumbnailUrl string · nullable URL to a thumbnail rendition. Null if no thumbnail exists.
url string · nullable URL to download the full asset. Either an external URL or a /preview download endpoint (requires the same API key).
width integer · nullable Image width in pixels. Null for non-images or if unknown.
304 Empty body.
  • ETag — Weak validator for this representation. Pass it back in If-None-Match to get 304 Not Modified while the record is unchanged.
404 ProblemDetails No item with that item number, or no asset with that id on the item.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl "https://api.erp.fluit.cloud/preview/items/{itemNumber}/assets/{assetId}"
Response 200
{
  "altText": "string",
  "assetType": "Image",
  "category": "MainImage",
  "contentType": "image/jpeg",
  "description": "string",
  "displayName": "Widget A",
  "fileName": "widget-a-front.jpg",
  "fileSize": 42,
  "height": 42,
  "id": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
  "isPrimary": true,
  "languageCode": "STD",
  "sortOrder": 42,
  "thumbnailUrl": "https://cdn.fluit.cloud/assets/widget-a-front-thumb.jpg",
  "url": "https://cdn.fluit.cloud/assets/widget-a-front.jpg",
  "width": 42
}

Base URL https://api.erp.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

GET /items/{itemNumber}/assets/{assetId}/download

Download an item asset

Streams the asset file (image or document). Externally hosted assets return a 302 redirect to the external URL. Only assets marked as public can be downloaded.

items:read

Path parameters

Field Type Description
itemNumber Required string Item number of the item the asset belongs to.
assetId Required string(uuid) Id of the asset, as returned by the asset list endpoint.

Responses

200 Empty body.
302 Empty body.
404 ProblemDetails No public asset with that id on that item — the same answer whether the item, the asset or only its public flag is missing.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl "https://api.erp.fluit.cloud/preview/items/{itemNumber}/assets/{assetId}/download"
Response 404
{
  "detail": "string",
  "instance": "string",
  "status": 42,
  "title": "string",
  "type": "string"
}

Base URL https://api.erp.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

PUT /items/{itemNumber}/attributes/{attributeCode}

Set an item attribute value

Sets one attribute value on an item, replacing any previous value. Pass value for a single-value attribute and values for one where isMultiValue is true — the list replaces the whole set, so values left out are removed.

Show the full description

The value is checked against the attribute's rules: data type, numeric bounds, pattern, and its list of permitted values where it has one. See GET /preview/attributes for those rules. Send an empty value to clear the attribute.

items:write

Path parameters

Field Type Description
itemNumber Required string Item number of the item to set the value on.
attributeCode Required string Attribute code, from GET /preview/attributes.

Body required

Field Type Description
isVisibleOnWeb boolean · nullable Overrides whether the attribute is shown on the web. Omit to use the attribute's default.
value string · nullable The value to set. Use this for single-value attributes.
values string[] · nullable The complete list of values, for attributes where isMultiValue is true. Values not included are removed. Max 50 values.

Responses

204 Empty body.
400 ProblemDetails The value is not valid for the attribute — wrong type, outside its bounds, not in its list of permitted values, or not matching its pattern. Several values were given for an attribute that holds one.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable
404 ProblemDetails No item with that item number, or no active attribute with that code.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl -X PUT "https://api.erp.fluit.cloud/preview/items/{itemNumber}/attributes/{attributeCode}" \
  -H "Content-Type: application/json" \
  -d @body.json
Response 400
{
  "detail": "string",
  "instance": "string",
  "status": 42,
  "title": "string",
  "type": "string"
}

Base URL https://api.erp.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

GET /items/{itemNumber}/availability

Get item stock availability

Returns the item's stock availability summed across all active warehouses and broken down per warehouse. availableQuantity is the quantity that can be promised to new orders (on hand minus reservations).

Show the full description

Items never stocked in a warehouse return an empty warehouses list with zero totals. The warehouse breakdown is bounded by the tenant's warehouse count and is not paginated.

items:read

Path parameters

Field Type Description
itemNumber Required string Item number of the item to read availability for.

Responses

200 PublicItemAvailabilityResponse
Field Type Description
itemNumber string · nullable Item number of the item.
totalAllocatedQuantity decimal Total quantity reserved for orders across all warehouses. Serialised as a decimal string.
totalAvailableQuantity decimal Total quantity available for new orders (on hand − allocated). Serialised as a decimal string.
totalQuantityOnHand decimal Total physical quantity on hand across all warehouses. Serialised as a decimal string.
warehouses WarehouseAvailability[] · nullable Per-warehouse breakdown. Empty list if the item is not stocked in any warehouse.
404 ProblemDetails No item with that item number.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl "https://api.erp.fluit.cloud/preview/items/{itemNumber}/availability"
Response 200
{
  "itemNumber": "WIDGET-A",
  "totalAllocatedQuantity": "10",
  "totalAvailableQuantity": "10",
  "totalQuantityOnHand": "10",
  "warehouses": [
    {
      "allocatedQuantity": "10",
      "availableQuantity": "10",
      "quantityOnHand": "10",
      "replenishmentType": "Purchase",
      "requiresBatch": true,
      "requiresSerial": true,
      "trackingType": "None",
      "warehouseCode": "MAIN",
      "warehouseName": "Main warehouse"
    }
  ]
}

Base URL https://api.erp.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

GET /items/{itemNumber}/price

Calculate item price

Calculates the price for an item via the price engine — the same price an order line would get. quantityBreaks lists the volume price tiers of the applied price list.

items:read

Path parameters

Field Type Description
itemNumber Required string Item number of the item to price.

Query parameters

Field Type Description
customerNumber string Prices for this customer, applying their price lists, agreements and campaigns. Omit for the default price.
currencyCode string ISO 4217 currency to price in. Defaults to the customer's currency, then the tenant base currency.
quantity decimal Quantity to price, which is what activates volume pricing. Must be greater than zero. Default 1.

Responses

200 PublicItemPriceResponse
Field Type Description
currencyCode string · nullable ISO 4217 currency code of the price.
customerNumber string · nullable Customer number the price was calculated for. Null for the default price.
found boolean Whether a price was found. If false, unitPrice is 0 and the item has no configured price.
itemName string · nullable Display name of the item.
itemNumber string · nullable Item number of the priced item.
priceListName string · nullable Name of the price list used. Null if no price list applied.
priceSource string · nullable Where the price came from, e.g. `Customer`, `Campaign`, `Standard`.
quantity decimal Quantity the price was calculated for. Serialised as a decimal string.
quantityBreaks QuantityBreak[] · nullable Volume price breaks from the applied price list. Empty if none.
unit string · nullable Unit of measure code the price applies to, e.g. `st`.
unitPrice decimal Calculated net unit price. Serialised as a decimal string.
400 ProblemDetails The quantity is zero or less, or no customer has that customer number.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable
404 ProblemDetails No item with that item number.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl "https://api.erp.fluit.cloud/preview/items/{itemNumber}/price"
Response 200
{
  "currencyCode": "SEK",
  "customerNumber": "CUST-001",
  "found": true,
  "itemName": "Widget A",
  "itemNumber": "WIDGET-A",
  "priceListName": "Retail 2026",
  "priceSource": "string",
  "quantity": "10",
  "quantityBreaks": [
    {
      "discountPercent": "12.50",
      "minQuantity": "10",
      "unitPrice": "299.00"
    }
  ],
  "unit": "st",
  "unitPrice": "299.00"
}

Base URL https://api.erp.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

GET /items/{itemNumber}/variants

List an item's variants

Returns the variants belonging to a variant master, e.g. every colour and size of a T-shirt. The master itself declares which axes it varies on — read variantAxes on GET /preview/items/{itemNumber} — and each variant here reports its own values in variantAttributes.

Show the full description

Returns 404 only if the item number does not exist; an item that is not a variant master returns an empty page, so a catalogue sync can call this for every item without knowing in advance which ones have variants. The status filter is matched case-insensitively and an unknown value returns 400. Sorted by item number.

items:read Paginated

Path parameters

Field Type Description
itemNumber Required string Item number of the variant master whose variants to list.

Query parameters

Field Type Description
status enum Filters on the variant's lifecycle status. Draft PendingApproval Active PhasingOut Discontinued Archived
page integer Page to return, 1-based. Default 1.
pageSize integer Number of records per page. Default 50, max 200.

Responses

200 PagedResult_PublicItemVariantResponse

Paginated response: the fields below sit in items[], wrapped in totalCount, page, pageSize, totalPages, hasPreviousPage and hasNextPage. Paginated

Field Type Description
barcode string · nullable EAN / GTIN barcode of the variant. Null if not set.
id string(uuid) Internal unique identifier (UUID v7).
isActive boolean Whether the variant is active. Inactive variants cannot be placed on new orders.
isSellable boolean Whether the variant can be sold.
itemNumber string · nullable Unique item number of the variant — use this on order lines.
links Links Hypermedia links for a public API resource. Exposed as a computed `links` property on the public response DTOs so that create and read responses carry the same self-reference — the canonical URL is derived from the business key already present on the DTO and can never drift from the route it points at.
name string · nullable Display name of the variant.
salesPrice decimal · nullable Default sales price in the tenant default currency. Serialised as a decimal string. Null if not set.
status enum Item status exposed via the Public API. Mirrors `Domain.Items.ItemStatus`. Draft PendingApproval Active PhasingOut Discontinued Archived
thumbnailUrl string · nullable URL to the variant's thumbnail image. Null if no public image is set.
variantAttributes ItemVariantAttribute[] · nullable The values that distinguish this variant, e.g. Colour=Red, Size=M. One entry per axis declared by the master in `variantAxes`.
400 ProblemDetails ?status= got a value outside its list.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable
404 ProblemDetails No item with that item number. An item that exists but is not a variant master returns an empty page instead.
Field Type
detail string · nullable
instance string · nullable
status integer · nullable
title string · nullable
type string · nullable

Standard errors: 401 403 Errors

Examples

curl
curl "https://api.erp.fluit.cloud/preview/items/{itemNumber}/variants"
Response 200
{
  "hasNextPage": true,
  "hasPreviousPage": true,
  "items": [
    {
      "barcode": "string",
      "id": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
      "isActive": true,
      "isSellable": true,
      "itemNumber": "WIDGET-A",
      "links": {
        "self": "string"
      },
      "name": "Widget A",
      "salesPrice": "299.00",
      "status": "Draft",
      "thumbnailUrl": "https://cdn.fluit.cloud/assets/widget-a-front-thumb.jpg",
      "variantAttributes": [
        {
          "name": "Widget A",
          "value": "string"
        }
      ]
    }
  ],
  "page": 1,
  "pageSize": 50,
  "totalCount": 137,
  "totalPages": 3
}

Base URL https://api.erp.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

POST /items/batch

Create or update many items in one call

Loads up to 200 items per call. `itemNumber` is required on every row — unlike POST /preview/items, this endpoint never generates one. The HTTP status describes the request, not the rows: a well-formed batch always answers 200, and every row carries its own `outcome` (`created`, `updated` or `failed`) plus an `error` when it failed.

Show the full description

A single bad row therefore never blocks the rest of the batch — re-send only the failed rows. 4xx is reserved for the batch itself: more than 200 rows, a missing scope, malformed JSON. `mode` is `upsert` (default), `create` or `update`. An `Idempotency-Key` is required like on every POST under /preview; deriving it from the run and the batch index (for example `sha256(runId + ':' + batchIndex)`) makes an interrupted load safe to resume without duplicates.

Body required

Field Type Description
items Required BatchUpsertItemsItemRow[] The rows to load. At most 200 per call.
mode enum `upsert` (default) creates missing items and updates existing ones, `create` fails a row whose item number already exists, `update` fails a row whose item number does not exist. Upsert Create Update

Responses

200 BatchUpsertItemsResponse
Field Type
createdCount integer
failedCount integer
results BatchUpsertItemsRowResult[] · nullable
updatedCount integer

Standard errors: 400 401 403 Errors

Examples

curl
curl -X POST "https://api.erp.fluit.cloud/preview/items/batch" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d @body.json
Two rows, upsert
{
  "items": [
    {
      "itemNumber": "670-00001",
      "name": "HDMI cable 2 m",
      "salesPrice": "249.00"
    },
    {
      "itemNumber": "670-00002",
      "name": "HDMI cable 5 m",
      "salesPrice": "319.00"
    }
  ]
}
Update prices on existing items
{
  "items": [
    {
      "itemNumber": "670-00001",
      "salesPrice": "259.00"
    },
    {
      "itemNumber": "670-00002",
      "salesPrice": "329.00"
    }
  ],
  "mode": "update"
}
Response 200
{
  "createdCount": 42,
  "failedCount": 42,
  "results": [
    {
      "error": {
        "code": "string",
        "detail": "string"
      },
      "index": 42,
      "itemNumber": "WIDGET-A",
      "outcome": "string"
    }
  ],
  "updatedCount": 42
}

Base URL https://api.erp.fluit.cloud/preview. The response example is generated from the schema: the shape is right, the values are made up.

Schemas

The objects this group's calls refer to. The field tables above go one level deep and link here rather than repeating the same schema on every endpoint.

BatchUpsertItemsItemRow

BatchUpsertItemsItemRow
Field Type Description
barcode string · nullable EAN / GTIN barcode.
costPrice decimal · nullable Purchase / cost price in the tenant default currency.
countryOfOrigin string · nullable ISO 3166-1 alpha-2 country of manufacture.
description string · nullable Long-form description.
hsCode string · nullable Harmonized System (HS / KN) customs tariff code.
itemNumber Required string Business key. Required — it identifies the row in the response.
name string · nullable Item name. Required when the item does not exist yet.
netWeight decimal · nullable Net weight in kilograms.
salesPrice decimal · nullable Default sales price in the tenant default currency.

BatchUpsertItemsRowError

BatchUpsertItemsRowError
Field Type
code string · nullable
detail string · nullable

BatchUpsertItemsRowResult

BatchUpsertItemsRowResult
Field Type Description
error BatchUpsertItemsRowError
index integer
itemNumber string · nullable
outcome string · nullable `created`, `updated` or `failed`.

ItemAttribute

PublicItemAttribute

A specification attribute value on an item.

Field Type Description
code string · nullable Stable attribute code, e.g. `MATERIAL`.
dataType enum Data type of a product attribute value. Mirrors `Domain.Items.AttributeDataType`. Determines how `attributes[].value` is formatted in responses and parsed in requests. Text WholeNumber DecimalNumber Boolean Date Url Html Color
name string · nullable Display name of the attribute, e.g. `Material`.
unit string · nullable Unit of the value, e.g. `mm`, `W`. Null if not applicable.
value string · nullable The attribute value formatted as a string (numbers use invariant format, dates ISO 8601, booleans `true`/`false`).

ItemCategoryAssignment

PublicItemCategoryAssignment

A category the item is assigned to.

Field Type Description
code string · nullable Stable category code, e.g. `TOOLS-HAND`.
isPrimary boolean Whether the category belongs to the primary category type (the main product hierarchy).
name string · nullable Display name of the category.

ItemCrossReference

PublicItemCrossReference

An alternative identifier for the item.

Field Type Description
isPrimary boolean Whether this is the preferred reference of its type.
referenceNumber string · nullable The reference number/value.
source string · nullable Source of the reference, e.g. a manufacturer or system name. Null if not set.
type enum Type of an alternative item identifier. Mirrors `Domain.Items.CrossReferenceType`. Manufacturer Oem IndustryStandard Superseded Competitor Barcode Custom

ItemUnit

PublicItemUnit

An orderable unit of measure for an item.

Field Type Description
barcode string · nullable EAN / GTIN barcode for this specific unit/pack. Null if not set.
conversionFactor decimal How many base units this unit represents (1 KART = 12 st ⇒ 12). Serialised as a decimal string.
isPurchaseUnit boolean Whether the unit may be used on purchase order lines.
isSalesUnit boolean Whether the unit may be used on sales order lines.
unitCode string · nullable Unit code — usable as `unit` on order lines, e.g. `st`, `KART`.

ItemVariantAttribute

PublicItemVariantAttribute

A variant attribute value, e.g. Colour=Red.

Field Type Description
name string · nullable Attribute name, e.g. `Colour`, `Size`.
value string · nullable The variant's value, e.g. `Red`, `M`.

ItemVariantAxis

PublicItemVariantAxis

An axis a variant master varies on, with the values available along it.

Field Type Description
name string · nullable Axis name, e.g. `Colour`, `Size`.
values string[] · nullable The values defined for this axis, e.g. `Red`, `Blue`.

QuantityBreak

PublicQuantityBreak

Volume price break — the unit price that applies from a minimum quantity.

Field Type Description
discountPercent decimal · nullable Discount in percent compared to the base price. Serialised as a decimal string. Null if not applicable.
minQuantity decimal Minimum quantity for this price. Serialised as a decimal string.
unitPrice decimal Unit price at this quantity. Serialised as a decimal string.

WarehouseAvailability

PublicWarehouseAvailability

Stock availability for an item in a single warehouse.

Field Type Description
allocatedQuantity decimal Quantity reserved for orders in this warehouse. Serialised as a decimal string.
availableQuantity decimal Quantity available for new orders (on hand − allocated). Serialised as a decimal string.
quantityOnHand decimal Physical quantity on hand in this warehouse. Serialised as a decimal string.
replenishmentType enum How an item is replenished. Mirrors `Domain.Items.ReplenishmentType`. Can be overridden per warehouse. Purchase Manufacture Transfer Assembly
requiresBatch boolean Whether movements in this warehouse must carry batch/lot numbers (`trackingType` is `Batch` or `BatchOut`).
requiresSerial boolean Whether movements in this warehouse must carry serial numbers (`trackingType` is `Serial` or `SerialOut`). A receipt or shipment without them is rejected.
trackingType enum How an item is tracked in a warehouse. Mirrors `Domain.Items.TrackingType`. Tracking is configured <b>per warehouse</b>, so this value is only meaningful in the context of one warehouse — the same item can be serial-tracked in one warehouse and untracked in another. None Serial SerialOut Batch BatchOut
warehouseCode string · nullable Warehouse code — usable as `warehouseCode` in order creation.
warehouseName string · nullable Display name of the warehouse.