This is the API powering Omnia 2.0 and Pricemonitor, containing operations that can also be used directly by customers from their own systems.
Omnia 2.0 API (0.0.7210)
The Omnia 2.0 API is RESTful and provides access to the backend of Omnia 2.0 and Pricemonitor. It is used to manage products, offers, contracts, and more.
This API supports both public endpoints for customer integration and internal endpoints for platform management. All endpoints are authenticated using either Basic Authentication or JWT Bearer tokens.
https://api-docs.omniaretail.dev/_mock/api/omnia/
https://api.patagona.de/
Notes:
- When importing products, you need to provide an unique product identifier. We only allow importing products when they can be uniquely identified. In the very past we solely relied on GTIN for that, but not all customers have a GTIN. So we introduced the generic concept of the unique product identifier.
- When importing products, you can additionally provide tags. These tags are key/value pairs (custom fields) which can be used to categorize your products: E.g. you could add the brand of the product.
The tag names need to be unique and non-empty. - In some endpoints we use caching for up to 5 minutes. So your newly imported products might need up to 5 minutes to get visible.
- Timing is important: It's recommended to import products during a period when no monitorings are scheduled. Otherwise, the monitoring does not cover the most recently added products. A subsequent monitoring run will cover the previously added products.
The preferred way to import products via API is via JSON.
This operation adds products to our system using upsert (insert or update). It needs to be used in conjunction with a timestamp-based product deletion operation.
The delete makes sure that old products, which are not part of your assortment anymore, are dropped from the system.
Typical usage pattern:
- Remember the current time in UTC
- Add products in chunks. Recommended chunk size: 1,000 products
- Delete old products that are not needed in the system anymore by the timestamp from step 1 minus some extra buffer, e.g. one minute.
In order to provide products to our system you can send a CSV file via this operation. This endpoint deactivates all current products and activates the ones which are provided via CSV.
This creates a "task" at our side. Tasks are processed asynchronously. Typically, a big product import with 500K products takes 5-10 minutes. The mentioned endpoint returns a task id and a url where you can check the task state. Possible task states are: pending, executing, failed and succeeded. The last two states are representing a completed task. The task itself contains more details about how many products could get imported, which ones failed plus a preview failure list.
When the product import successfully completed then the previously imported products have been deleted and only the ones which you have provided via CSV file are active in our system.
Use this operation to retrieve products via a query you specify in the request. It supports returning paged results. We recommend to retrieve with a page size of up to 10,000 products.
Use the query operation and just omit the query filter in the request. Results are paginated. A page size of at most 10,000 is recommended.
Our system uses internal product ids that are distinct from your products ids. These internal product ids are sometimes referred to as pricemonitor product ids.
Often API operations require internal product ids to be specified. So you may need to map your product id onto our internal product id.
There are two options:
- Either you store the internal product ids after importing products into our system. The import operation returns the internal product ids for each imported product.
- Or you map product ids on the fly when you need to by querying specifying your product ids in the query. It's recommended to specify 1,000 product ids at once.
Request
This operation is used to import products into the system from JSON formatted data:
Products that are already present will be updated and new products will be added. Identification of the products is done based on the identifying attributes, which need to be provided via the request body.
Note:
This endpoint should be used in conjunction with: DELETE /api/v3/vendor/contracts/{contractId}/products.
Procedure:
1. Add your products in bulks with multiple requests via this endpoint.
2. Send a DELETE request to /api/v3/vendor/contracts/{contractId}/products and set the parameter updatedMax to a date which is older or equal to your first request from step 1.
The body contains the products which should be added
Products which should be added to the pricemonitor
Product name or title as displayed to customers
Customer-specific product identifier. This can be your internal SKU or product ID. Used for mapping products between your system and the pricemonitor.
Global Trade Item Number (GTIN) - typically EAN-13, UPC-A, or GTIN-14. Must be a valid positive number representing the product's global identifier.
Reference price for the product.
For Omnia 2.0: This represents the selling price - the actual price at which you sell the product. For Pricemonitor: One of the use cases is to treat this as MSRP (Manufacturer's Suggested Retail Price).
Used as a baseline for pricing strategies and recommendations. Will be rounded to two decimal places using half-up rounding.
Minimum allowed price boundary for automated pricing. Must be less than or equal to maxPriceBoundary. Will be rounded to two decimal places using half-up rounding.
Maximum allowed price boundary for automated pricing. Must be greater than or equal to minPriceBoundary. Will be rounded to two decimal places using half-up rounding.
Product tags for categorization and strategy application. Used by pricing strategies to group and target specific products.
Tag identifier/name. Must be unique within a single product. Used to categorize products for pricing strategies and reporting.
Non-empty list of product attributes which identify your products uniquely. Please ensure that you specify only one attribute in the list. Avoid using tags as an identifier, as this feature will soon be deprecated. By doing so, may loose historical market data during product import.
- Mock server
https://api-docs.omniaretail.dev/_mock/api/omnia/api/v3/vendor/contracts/{contractId}/products
- Production API
https://api.patagona.de/api/v3/vendor/contracts/{contractId}/products
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
-u <username>:<password> \
https://api-docs.omniaretail.dev/_mock/api/omnia/api/v3/vendor/contracts/qbcxvb/products \
-H 'content-type: application/json' \
-H 'patagona-tags-decimal-separator: .' \
-d '{
"products": [
{
"name": "Samsung Galaxy S24 Ultra 256GB",
"customerProductId": "SKU-GALAXY-S24-256",
"gtin": 8806094937329,
"referencePrice": 1199.99,
"minPriceBoundary": 999.99,
"maxPriceBoundary": 1399.99,
"tags": [
{
"key": "brand",
"value": "Samsung"
},
{
"key": "category",
"value": "smartphones"
},
{
"key": "storage",
"value": "256GB"
}
]
}
],
"version": "2",
"identifyingAttributes": [
"customerProductId"
]
}'
{ "data": [ { … } ] }
Request
This operation is used to import products into the system from CSV formatted data. This process is represented by a task, which is processed asynchronously. In the response you will receive a url which is used to check the status of the import process.
When the process is done all products in csv file from the request body will be in the pricemonitor. Products that were already present before have been updated and new products have been added.
Warning: All products that were in the pricemonitor before but are not present in the new import will be deleted.
Identification of the products is done based on the identifying attributes (see parameter: patagona-product-identifying-attributes)
Note: It is recommended to use the JSON variant to add products as it works synchronously and more efficient.
A single CSV column that identify a product uniquely. Avoid using tags as an identifier, as this feature will soon be deprecated By doing so, you may loose historical market data during product import.
Csv column that contains the reference price
Csv column that contains the min price
Csv column that contains the max price
Csv column that contains an id (There is no requirement for this field to be unique)
Decimal separator used for parsing numbers
The values for patagona-decimal-separator, patagona-csv-column-separator and patagona-csv-quotation-character must be different from one another.
Available values: ",", "."
The csv column separator
It can be provided either as text or as Base64 encoded string (e.g. needed for tab as separator).
The values for patagona-decimal-separator, patagona-csv-column-separator and patagona-csv-quotation-character must be different from one another.
CSV file containing the products. Note: The CSV file should be encoded in UTF-8.
- Mock server
https://api-docs.omniaretail.dev/_mock/api/omnia/api/v3/vendor/contracts/{contractId}/products
- Production API
https://api.patagona.de/api/v3/vendor/contracts/{contractId}/products
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X PUT \
-u <username>:<password> \
https://api-docs.omniaretail.dev/_mock/api/omnia/api/v3/vendor/contracts/qbcxvb/products \
-H 'content-type: text/csv' \
-H 'patagona-csv-column-separator: ,' \
-H 'patagona-csv-quotation-character: "' \
-H 'patagona-decimal-separator: .' \
-H 'patagona-product-customer-id: id-column' \
-H 'patagona-product-gtin: max-price-column' \
-H 'patagona-product-identifying-attributes: id-column' \
-H 'patagona-product-max-price: max-price-column' \
-H 'patagona-product-min-price: min-price-column' \
-H 'patagona-product-name: name-column' \
-H 'patagona-product-reference-price: reference-price-column' \
-d string
{ "data": { "id": "string", "url": "string" } }
Last updated timestamp of products, formatted as ISO Date (i.e. 2019-11-20T13:46:13Z) in UTC.
Products can be deleted which haven't been updated since the specified timestamp.
If the query parameter is missing all products are deleted.
Tag key to consider for deleting products. This parameter works in combination with tagValue.
- Mock server
https://api-docs.omniaretail.dev/_mock/api/omnia/api/v3/vendor/contracts/{contractId}/products
- Production API
https://api.patagona.de/api/v3/vendor/contracts/{contractId}/products
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X DELETE \
-u <username>:<password> \
'https://api-docs.omniaretail.dev/_mock/api/omnia/api/v3/vendor/contracts/qbcxvb/products?updatedMax=2019-08-24T14%3A15%3A22Z&tagKey=string&tagValue=string'
{ "data": { "deleted": 0 } }
- Mock server
https://api-docs.omniaretail.dev/_mock/api/omnia/api/v3/vendor/contracts/{contractId}/products/monitoringstatus
- Production API
https://api.patagona.de/api/v3/vendor/contracts/{contractId}/products/monitoringstatus
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
-u <username>:<password> \
'https://api-docs.omniaretail.dev/_mock/api/omnia/api/v3/vendor/contracts/qbcxvb/products/monitoringstatus?productIds=0'
Monitoring status of the queried products
The monitoring status on each domain. It will contain an entry for each domain which is active for that contract.
The last time pricemonitor tried to monitor the product on the given domain. If this doesn't exist it mean's that pricemonitor haven't tried to monitor this product on the domain yet. One reason could be that the product is very new or the domain has just recently been added to the contract.
The last time pricemonitor completed monitoring the product on the given domain.
{ "data": [ { … } ] }
- Mock server
https://api-docs.omniaretail.dev/_mock/api/omnia/api/v3/vendor/contracts/{contractId}/products/{productId}/pricerecommendationhistory
- Production API
https://api.patagona.de/api/v3/vendor/contracts/{contractId}/products/{productId}/pricerecommendationhistory
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
-u <username>:<password> \
'https://api-docs.omniaretail.dev/_mock/api/omnia/api/v3/vendor/contracts/qbcxvb/products/862342/pricerecommendationhistory?startDate=2024-01-15T00%3A00%3A00Z&endDate=2024-01-16T23%3A59%3A59Z'
A list of price recommendations
The timestamp when the price recommendation has been calculated
Additional information on this product
The double value depends on the decimal separator which has been provided during product import.
The integer value of the tag. It's only defined when the stringValue
consists solely of digits.
Absolute percentage how the recommended price changed compared to the oldPrice
e.g. 200 stands for 200% which means the recommended price has doubled
The strategy branch name that calculated the price. This is only filled if the Strategy branch that calculated the price was given a name in the strategy tree. It will have the name that was active at the time the price was calculated (see timestamp)
Max price boundary during the time when the price was calculated
The decisive domain of the price recommendation. It's been determined by the cheapest price recommendation.
Min price boundary during the time when the price was calculated
List of tags which were set during the time when the price has been calculated. ATTENTION: These are historic tags which are maybe outdated or incomplete.
The double value depends on the decimal separator which has been provided during product import.
The integer value of the tag. It's only defined when the stringValue
consists solely of digits.
{ "data": [ { … } ] }
The body contains the products query.
Currently, it supports only product queries for two attributes:
- by "customerProductId"
- by "productId" (Patagona's internal product id). Allowed values for 'productId' are numerical integer values
For better performance, when paginating over all products of a contract, we recommend to use a limit of 10000 products per page. Pagination works with respective to the given products query.
This is most relevant when querying for a set of customerProductId's.
When the requests are chunked over a set of ids, it is easiest to provide up to 10000 customerProductId's in the query and keep the pagination at start: 0, limit: 10000.
It also contains a boolean optional parameter 'includeTags' which is used to include the tags of the products in the response.
The only allowed pattern is currently:
{
"pagination": {
"start": ${start},
"limit": ${limit}
},
"filter": {
"oneOf": {
"field": "customerProductId",
"values": [${customerProductIds as a list of strings}]
}
},
"includeTags": ${includeTags}
}
example:
{
"pagination": {
"start": 0,
"limit": 10
},
"filter": {
"oneOf": {
"field": "customerProductId",
"values": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
}
},
"includeTags": true
}
This model describes a step in a paginated endpoint. It consists of the start index, set to 0 for the first page. The next page starts at (previous start) + limit. Reasonable values for the limit parameter depend on the specific endpoint.
This class specifies a general query language, even though all fields are marked as optional, exactly one has to be specified. Please note that depending on the endpoint only a subset of the query language might be supported. Refer to the endpoint specific documentation to view the restrictions.
- Mock server
https://api-docs.omniaretail.dev/_mock/api/omnia/api/v3.1/vendor/contracts/{contractId}/products/query
- Production API
https://api.patagona.de/api/v3.1/vendor/contracts/{contractId}/products/query
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
-u <username>:<password> \
https://api-docs.omniaretail.dev/_mock/api/omnia/api/v3.1/vendor/contracts/qbcxvb/products/query \
-H 'Content-Type: application/json' \
-d '{
"pagination": {
"start": 0,
"limit": 0
},
"filter": {
"regex": {
"field": "string",
"pattern": "string"
},
"in": {
"field": "string",
"query": {}
},
"or": [
{}
],
"const": true,
"not": {},
"oneOf": {
"field": "string",
"values": [
"string"
]
},
"lt": {
"field": "string",
"value": "string"
},
"gt": {
"field": "string",
"value": "string"
},
"eq": {
"field": "string",
"value": "string"
},
"and": [
{}
]
},
"includeTags": true
}'
Returns a list of found products.
Additional information on this product.
The double value depends on the decimal separator which has been provided during product import.
The integer value of the tag. It's only defined when the stringValue
consists solely of digits.
Maximum price which pricemonitor can recommend for the product. It won't recommend any price above this boundary.
The customer's id of the product. This field allows to link products in pricemonitor to products in the customer's system.
Minimum price which pricemonitor can recommend for the product. It won't recommend any price below this boundary.
{ "data": [ { … } ] }
Start of time range for data retrieval.
Format: ISO 8601 date-time in UTC (e.g., 2024-01-15T10:30:00Z
)
Default behavior:
- If omitted and
endDate
is provided:startDate
=endDate
- 48 hours - If both omitted: range is
NOW - 48 hours
toNOW
End of time range for data retrieval.
Format: ISO 8601 date-time in UTC (e.g., 2024-01-16T10:30:00Z
)
Default behavior:
- If omitted and
startDate
is provided:endDate
=startDate
+ 48 hours - If both omitted: range is
NOW - 48 hours
toNOW
Where to start fetching the Amazon Buy Box statistics. Must be positive. Default value is 0.
- Mock server
https://api-docs.omniaretail.dev/_mock/api/omnia/api/v3/vendor/contracts/{contractId}/products/amazon/buybox/stats
- Production API
https://api.patagona.de/api/v3/vendor/contracts/{contractId}/products/amazon/buybox/stats
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
-u <username>:<password> \
'https://api-docs.omniaretail.dev/_mock/api/omnia/api/v3/vendor/contracts/qbcxvb/products/amazon/buybox/stats?startDate=2024-01-15T00%3A00%3A00Z&endDate=2024-01-16T23%3A59%3A59Z&start=0&limit=50000'
{ "data": [ { … } ] }
Request
⚠️ DEPRECATED: This endpoint is deprecated and should no longer be used.
Retrieves all products for a contract without pagination support. This endpoint has performance limitations and lacks proper pagination. Use the newer product query endpoints instead.
Note: The attributes
parameter is required but poorly documented in this legacy version.
REQUIRED: Comma-separated list of product attributes to include in the response.
Available attributes: gtin
, identifier
, name
, referencePrice
, minPriceBoundary
, maxPriceBoundary
, tags
, strategy
- Mock server
https://api-docs.omniaretail.dev/_mock/api/omnia/api/2/v/contracts/{contractId}/products
- Production API
https://api.patagona.de/api/2/v/contracts/{contractId}/products
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
-u <username>:<password> \
'https://api-docs.omniaretail.dev/_mock/api/omnia/api/2/v/contracts/qbcxvb/products?attributes=gtin%2Cname%2CreferencePrice%2Ctags'
[ { "tags": [ … ], "gtin": 0, "maxPriceBoundary": 0.1, "minPriceBoundary": 0.1, "name": "string", "productId": "string", "referencePrice": 0.1 } ]