Importing prices and stock
Prices and stock are uploaded in batches, as an array of up to 1,000 items
per request. Processing is asynchronous: the request is accepted immediately, the
response returns a task_id, and the upload itself runs in the background.
Products and warehouses are matched by external identifiers
(product_external_id, store_external_id), the ones set on your accounting
system's side. There is no need to pass the shop's internal ids.
Importing prices
POST /api/merchant-service/import/prices
The body is an array of items:
curl -X POST https://admin.mobiusapp.io/api/merchant-service/import/prices \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '[
{
"product_external_id": "SKU-100",
"store_external_id": "MSK-1",
"price": 1990,
"currency": "RUB"
},
{
"product_external_id": "SKU-101",
"store_external_id": "MSK-1",
"price": 2490,
"currency": "RUB",
"discount_price": 1990,
"discount_from_date": "2026-06-01T00:00:00Z",
"discount_to_date": "2026-06-30T23:59:59Z"
}
]'
Price item fields
| Field | Type | Req. | Description |
|---|---|---|---|
product_external_id |
string | yes | The product's external id (up to 255 characters). |
store_external_id |
string | yes | The warehouse's external id (up to 255 characters). |
price |
number | yes | The price, not less than 0. |
currency |
string | yes | The currency code (see Currencies). |
discount_price |
number | null | no | The discounted price, not less than 0. |
discount_from_date |
datetime | null | no | When the discount starts (ISO 8601). |
discount_to_date |
datetime | null | no | When the discount ends (ISO 8601). |
Importing stock
POST /api/merchant-service/import/stocks
curl -X POST https://admin.mobiusapp.io/api/merchant-service/import/stocks \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '[
{ "product_external_id": "SKU-100", "store_external_id": "MSK-1", "amount": 12 },
{ "product_external_id": "SKU-101", "store_external_id": "MSK-1", "amount": 0 }
]'
Stock item fields
| Field | Type | Req. | Description |
|---|---|---|---|
product_external_id |
string | yes | The product's external id (up to 255 characters). |
store_external_id |
string | yes | The warehouse's external id (up to 255 characters). |
amount |
number | yes | The stock figure, not less than 0. |
The response
Both methods answer the same way: the task has been accepted.
{
"task_id": "imp_7f3a9c12",
"status": "queued",
"items_count": 2,
"processed_at": "2026-06-21T10:15:00Z"
}
| Field | Description |
|---|---|
task_id |
The import task identifier, for your logs and for support. |
status |
The queueing state, queued. |
items_count |
How many items were accepted for processing. |
processed_at |
When the request was accepted. |
The response means the batch was accepted, not that it has been applied. The results appear in the shop as the background processing goes on.
Currencies
Allowed values of currency:
RUB, USD, EUR, BYN, KZT, UAH, AMD, AZN, KGS, MDL, TJS,
TMT, UZS, AED.
Limits and recommendations
- No more than 1,000 items per request. Split large exports into batches.
- One product in different warehouses means different items, differing by
store_external_id. - Before the first upload, make sure products and warehouses exist in the shop with the same external ids you send.
Errors
| Status | When |
|---|---|
403 |
No valid token. |
422 |
A validation error (format) or a business error (no active shop). |
On a validation error the messages field points at the problem item by index:
the key 0.price means the price field of the first array item. See
Errors, limits and pagination.
Related pages
- Orders
- Errors, limits and pagination
- OpenAPI documentation: the price and stock item schemas.