Pharmacy SKUs
View and update your pharmacy’s product stock levels, pricing, and external system IDs.List SKUs
integer
default:"0"
Page number (0-indexed)
integer
default:"50"
Items per page. Capped at a maximum of 500 — values above 500 are silently reduced to 500.
string
Required for group-wide API keys
Response
The
price field is in euro cents (e.g., 1299 = €12.99).sku.product_handle is an opaque identifier taken from the organisation’s product catalogue. Its format is not guaranteed — it can be a slug such as medication-x, a number, or null — so do not use it to identify products. Use sku.product_uid for the product and sku.uid or sku.pzn for the SKU.REST SKU responses deliberately omit
markup, priority, and type (platform margin). Those fields may still appear on pharmacy_sku_stock_updated webhooks — treat webhook-only fields as opaque and do not expect them on GET/PATCH pharmacy SKUs.Hidden SKU types: Your account may be configured to hide SKUs of a particular type (digital or physical). SKUs of a hidden type are automatically excluded from this listing — they will not appear in the
data array and are not counted in totalRegistries. This setting is off by default and is configured by your rxscale administrator. If you believe SKUs are missing from your listing, contact rxscale support.Update SKU
Update price, stock, and/or external_id for a pharmacy SKU.Request Body
All fields are optional — include only the fields you want to update.integer
Your physical on-hand stock for this SKU, including units that are already reserved for your open RxScale orders. Each request sets an absolute value; it does not add to or subtract from the current stock. See Stock and reservations below.
integer
Your pharmacy’s own price per unit, in euro cents (e.g.,
1500 = €15.00). When a new pharmacy order is created, the current price is stored on it as a snapshot (order_items[].pharmacy_sku.price), so a change does not affect existing orders. It does not change the price patients pay in the shop. A request that changes only the price triggers no webhook.string
Your own reference for this SKU at your pharmacy, for example the article number in your system. Free text, up to 255 characters. It does not have to be unique, and RxScale does not use it to look up SKUs. It is returned to you in order items (
order_items[].pharmacy_sku.external_id), in webhooks, and on the picklist in the Pharmacy Portal. To clear it, send an empty string (""); null is rejected with 400.Stock values may be negative (for example,
-40) to represent oversold inventory in your own system.Stock and reservations
stockis your physical on-hand stock. It includes units that are already reserved for your open RxScale orders.reserved_amountis the quantity on your open RxScale orders — orders in any status exceptcompletedandcancelled. It is included in thepharmacy_sku_stock_updatedwebhook, not in the REST SKU responses.- Available stock is
stock - reserved_amount. Do not send the available quantity asstock, because the reservations would then be subtracted twice. - When you complete an order with
complete_order, RxScale reducesstockby the ordered amount automatically. If your own system has already deducted the shipped units, send its stock value only after callingcomplete_order— otherwise the units are deducted twice until your next sync. - A
pharmacy_sku_stock_updatedwebhook is sent when the stock changes through this API — including through your own PATCH requests — and when completing an order reduces it. A request that sends the stock value the SKU already has triggers no webhook.
Update Stock Only
A convenience endpoint to update only the stock level.Update External ID
Link a pharmacy SKU to your external system.""); null is rejected with 400.
Syncing Many SKUs
There is no bulk update endpoint. For a regular sync, for example every night:- Load your SKUs with
GET /v1/external_pharmacy_api/pharmacy_skus/?limit=500(500 is the maximum page size) and page through the results withpage. - Compare them with your own system and send a PATCH only for SKUs whose values changed.
- Spread the requests over time and stay well below the rate limit.