/
IN
invendor
Search skmtc…
⌘K
Docs
Sign in
Docs
History
Schema
Generate
Filter operations
Accounts
20
Auth
3
Barcodes
1
DataJobs
2
Devices
13
Dimensions
10
DimensionValues
9
Doors
1
DynamicScanContent
2
ExtendedProperties
5
FeatureFlags
1
FlagTypes
5
GlobalSettings
10
ItemPrices
12
get
/v1/Items/{itemId}/prices
List one item's price rows across companies, paged. Purchase rows are hidden from non-owner callers. `asOf` is required and `status` selects which lifecycles to return (defaulting to all of them); see IO.Catalog.Contracts.DTO.Pricelists.ItemPricesListRequest for every parameter.
post
/v1/Items/{itemId}/prices
Create a price for an item. Restricted to the tenant company or the item owner.
get
/v1/Items/{itemId}/prices/download/xlsx
Download one item's price rows for the given price type as an `.xlsx` for offline bulk editing — the item price sheet (`companyCode, price, quantity, fromDate, endDate`). The edited file is re-imported via the bulk-upsert endpoint, which accepts exactly these fields (the client parses the sheet back into JSON). Applies the same purchase-price visibility rule as the list endpoint.
get
/v1/Items/{itemId}/effective-price
Resolve the effective price for an item + account (company tier → base price) on a given date. <br>`asOf` is required, and is a System.DateOnly. It used to be an optional System.DateTime, which made this the one place in the feature where the answer depended on where the question was asked from — twice over. Omitted, the server substituted its own UTC date, so a caller in UTC+3 asking at 01:00 local was answered for the previous day. Supplied with an offset, query-string binding converted it to universal time, so `2026-08-01T00:00:00+03:00` resolved prices as of `2026-07-31T21:00Z` — again the wrong calendar day, and again only east of UTC. A calendar date has no instant to convert, and requiring it leaves the caller as the only party who decides what "today" means.
put
/v1/Items/{itemId}/prices/{id}
Update a price's mutable fields. Restricted to the tenant company or the item owner.
delete
/v1/Items/{itemId}/prices/{id}
Hard-delete a price row. Restricted to the tenant company or the item owner.
post
/v1/Items/{itemId}/prices/bulk
Bulk-upsert one item's price rows from the item price sheet (bulk admin entry / re-import of the exported `.xlsx`). Body fields match M:IO.CommonAPI.Controllers.v1.Catalog.ItemPricesController.DownloadXlsx(System.Int32,IO.Domain.Shared.Enums.PriceType,IO.Catalog.Contracts.DTO.Pricelists.ItemPricesExportRequest,System.Threading.CancellationToken)'s columns exactly; an empty `companyCode` targets the item's base price. Returns the count upserted.
get
/v1/Accounts/{accountId}/prices
List one company's price rows across items, paged. Purchase rows are hidden per non-owned item. `asOf` is required and `status` selects which lifecycles to return; see IO.Catalog.Contracts.DTO.Pricelists.AccountPricesListRequest for every parameter.
get
/v1/Accounts/{accountId}/prices/download/xlsx
Download one company's price rows for the given price type as an `.xlsx` — the company price sheet (`itemCode, price, quantity, fromDate, endDate`), the mirror image of the item sheet. Re-imported via M:IO.CommonAPI.Controllers.v1.Catalog.ItemPricesController.BulkUpsertByAccount(System.Int32,IO.Domain.Shared.Enums.PriceType,System.Collections.Generic.List{IO.Catalog.Contracts.DTO.Pricelists.CompanyPriceSheetRow},System.Threading.CancellationToken), which accepts exactly these fields. The underlying query is already Company-scoped to this account and applies the purchase-price visibility rule per item, so no extra gating is needed here.
post
/v1/Accounts/{accountId}/prices/bulk
Bulk-upsert one company's price rows from the company price sheet (re-import of the exported `.xlsx`). Body fields match M:IO.CommonAPI.Controllers.v1.Catalog.ItemPricesController.DownloadXlsxByAccount(System.Int32,IO.Domain.Shared.Enums.PriceType,IO.Catalog.Contracts.DTO.Pricelists.AccountPricesExportRequest,System.Threading.CancellationToken)'s columns exactly; every row is bound to the route's company, and each row's `itemCode` selects the item. Returns the count upserted.
get
/v1/Items/prices/base/download/xlsx
Download every item's <b>base</b> price as an xlsx — the catalogue-wide base sheet, and the round-trip template for M:IO.CommonAPI.Controllers.v1.Catalog.ItemPricesController.BulkUpsertBasePrices(IO.Domain.Shared.Enums.PriceType,System.Collections.Generic.List{IO.Catalog.Contracts.DTO.Pricelists.BasePriceSheetRow},System.Threading.CancellationToken). Columns are <c>itemCode, price, quantity, fromDate, endDate</c>; the price type comes from `type` and every emitted row is a `relation=Item, relationId=0` row. <br><b>Tenant-primary only</b>, matching the import rather than the two sibling exports. This sheet exists to be edited and posted back, so a caller who could fetch it but not import it would hold a file they cannot use. R1 still applies underneath: a purchase sheet omits rows on items the caller does not own — though for a tenant-primary caller that is every item.<br>Answers `204` when nothing is exportable, `202` with a job id above IO.Admin.BulkExportOptions.SyncRowThreshold, and takes no row filter — the base sheet pins no axis, so it offers none (see IO.Catalog.Contracts.DTO.Pricelists.BasePricesExportRequest).
post
/v1/Items/prices/base/bulk
Bulk-upsert item <b>base</b> prices from the base price sheet — every item's own company-agnostic price, across the whole catalogue. Each row's `itemCode` selects the item and every row is written as `relation=Item, relationId=0`; the price type comes from `type`. Returns the count upserted. <br><b>Tenant-primary only</b>, and that is the substantive difference from the other two bulk imports rather than an incidental one. A base price is what every company without an override of its own resolves to, so writing them across the catalogue is a tenant-level act, not an ownership-scoped one — there is no R2 ownership branch on this endpoint because the primary gate subsumes it. Checked here, before M:IO.Admin.BulkExportOptionsExtensions.RouteImport(IO.Admin.BulkExportOptions,System.Int32), so the inline and queued paths are covered by one statement; re-checked in the handler and in the worker's validation, the same belt-and-braces the `PRICELISTS` feature gate gets.<br>Deliberately stricter than `POST /v1/Items/{itemId}/prices/bulk`, where a non-primary owner may still write their own item's base row via an empty `companyCode`. One item at a time is an ownership act; the whole catalogue is not.<br>The third sheet, and the only one that pins neither axis by route — which is why the queued job needs an explicit IO.Domain.Shared.Enums.PriceSheetScope rather than inferring the sheet from whichever id the config carries.<br><b>Import only.</b> There is deliberately no matching export: the other two sheets are a round trip and their export doubles as the template, whereas this one ships a static template. Note base prices are already readable per item — `GET /v1/Items/{itemId}/prices` returns the base row whenever `relationId` is omitted, and the item sheet exports it with an empty `companyCode` — so what is missing is only the catalogue-wide axis this endpoint writes on.
ItemQuantities
2
Items
46
ItemTransactions
1
Journals
13
Locations
31
OperationDimGroups
5
Operations
31
Orders
18
QuestionDefinitions
5
Reports
7
Roles
8
ScaleLocker
6
Scales
1
Services
2
Subscriptions
5
UniqueItemStatuses
5
UnitConversions
6
Units
8
UserProfiles
14
Users
18
WMSItemLocationParams
11
WMSLocations
14
ItemPrices
Copy
Copy Markdown
Copy Markdown
Copying…
Copied
Copy failed
Changes to Hard-delete a price row. Restricted to the tenant company or the item owner.
delete
/v1/Items/{itemId}/prices/{id}
Aug 27, 2026
61263b2302a0
Revision changes
info
endpoint added