WinShopAPI docs
Getting started

Conventions

Naming, dates, numbers, query strings and HTTP semantics shared by every endpoint.

These rules hold for the whole API. The reference pages do not repeat them.

JSON

  • Property names are camelCase: internalNumber, dateOfOrder. The keys of dictionaries are camelCase too.
  • Enums are strings, not numbers: "type": ["supplier"]. The reference lists the allowed values of each enum.
  • null is left out. A property that has no value is missing from the response instead of being null. Treat a missing property as "no value".
  • Ids are integers.
  • Decimals are JSON numbers: "totalPrice": 1210.5. Parse them into a decimal type, not a binary floating point type, when you handle money.
  • Durations are strings in the form "HH:mm:ss", for example "01:30:00".

Dates and times

Dates are ISO 8601 strings without a time zone offset:

{ "dateOfOrder": "2026-10-11T14:03:00" }

These are local times, not UTC

A timestamp is the wall-clock time of the instance. For all current customers that is the Europe/Prague time zone. There is no Z and no +02:00, and you must not add one. Treat every timestamp as a naive local time, both when you read it and when you send it.

The same goes for the values you send in filters and request bodies. Format them as local time without an offset:

// DateTime with Kind = Unspecified serialises without an offset.
// Do not use DateTimeOffset or DateTime.UtcNow.
var prague = TimeZoneInfo.FindSystemTimeZoneById("Europe/Prague");
DateTime now = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, prague);

string json = System.Text.Json.JsonSerializer.Serialize(new { dateFrom = now });
// {"dateFrom":"2026-10-11T14:03:00.1234567"}

Query strings

An array parameter repeats its key once per value:

curl "https://<your-instance>/api/products/product-details?productIds=1&productIds=2" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Do not send productIds=1,2 or productIds[]=1.

HTTP methods and status codes

MethodUseSuccess
GETRead one resource or a small fixed list.200
POST …/filter-paginatedSearch a large list. See Filtering and pagination.200
POSTCreate a resource or run an action such as process.200 or 201
PUTReplace a resource.200
DELETEDelete a resource.200 or 204

201 Created and Location

Endpoints that create a document answer 201 Created, and so do the ones that create one document from another, for example an invoice from a delivery note. The Location header holds the URL of the new resource. Some other create endpoints answer 201 too, and the rest answer 200.

HTTP/1.1 201 Created
Location: https://<your-instance>/api/documents/invoices/5120

Accept any 2xx status as success rather than testing for 200 exactly.

PUT replaces

PUT works on the whole resource. Read it with GET, change what you need and send the complete object back. Do not assume that a property you leave out keeps its value.

Documents are more forgiving: their PUT keeps the header fields you leave out. It also takes one extra query parameter, removeItemsNotInRequest, which controls what happens to the stored items that your request body does not mention:

curl -X PUT "https://<your-instance>/api/documents/orders/internet/8841?removeItemsNotInRequest=true" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d @order.json

With removeItemsNotInRequest=true, items missing from the body are deleted. Without it they stay.

Errors

Every error has the same JSON body. See Errors.

On this page