# Get price recommendations for one product This endpoint returns all price recommendations for one product within a given time range. Endpoint: GET /api/v3/vendor/contracts/{contractId}/products/{productId}/pricerecommendationhistory Version: 0.0.7224 Security: BasicAuth, BearerAuth ## Path parameters: - `contractId` (string, required) Unique identifier of the contract Example: "qbcxvb" - `productId` (string, required) Internal product identifier in the pricemonitor system Example: "862342" ## Query parameters: - `startDate` (string) for data retrieval. Format: ISO 8601 date-time in UTC (e.g., ) - If omitted and is provided: = - 48 hours - If both omitted: range is to Example: "2024-01-15T00:00:00Z" - `endDate` (string) for data retrieval. Format: ISO 8601 date-time in UTC (e.g., ) - If omitted and is provided: = + 48 hours - If both omitted: range is to Example: "2024-01-16T23:59:59Z" ## Response 200 fields (application/json): - `data` (array, required) - `data.oldPrice` (number) The price of the cheapest offer of the own shop(s) on the relevant domain - `data.deliveryCosts` (number) The delivery costs which were considered for the recommended price - `data.timestamp` (string, required) The timestamp when the price recommendation has been calculated - `data.oldDeliveryCosts` (number) The delivery costs corresponding to - `data.tags` (array, required) Additional information on this product - `data.tags.doubleValue` (number) The double value depends on the decimal separator which has been provided during product import. - `data.tags.integerValue` (integer) The integer value of the tag. It's only defined when the consists solely of digits. - `data.tags.label` (string, required) The name of the tag. It can't be empty. - `data.tags.stringValue` (string, required) The text value of the tag. - `data.tags.booleanValue` (boolean) The boolean value of the tag. It's only set to true when the is "1" or "true". - `data.price` (number, required) The recommended price of the relevant domain - `data.oldPosition` (integer) The old position on the relevant domain - `data.gtin` (number) GTIN of the product - `data.relativePriceChangePercentage` (number) Absolute percentage how the recommended price changed compared to the e.g. 200 stands for 200% which means the recommended price has doubled - `data.newPosition` (integer) The new position on the relevant domain - `data.decisiveStrategyBranchName` (string) 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) - `data.customerProductId` (string) The customer's id of the product - `data.originalMaxPriceBoundary` (number, required) Max price boundary during the time when the price was calculated - `data.relevantDomain` (string) The decisive domain of the price recommendation. It's been determined by the cheapest price recommendation. - `data.originalMinPriceBoundary` (number, required) Min price boundary during the time when the price was calculated - `data.currency` (string, required) The currency of the price recommendation. - `data.productId` (string, required) The internal product id of the pricemonitor - `data.originalTags` (array, required) 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. - `data.decisiveStrategyTreeLeafNodeId` (integer, required) The leaf node of the strategy branch that calculated the price. This id references the node in the strategy branch that was active at the time the price was calculated (see timestamp) ## Response 400 fields (application/json): - `errors` (array, required) List of errors that occurred during request processing Example: [{"code":"request.invalid","message":"The provided request data is invalid"},{"code":"resource.invalid","message":"The requested resource could not be found"}] - `errors.code` (string, required) Machine-readable error code for programmatic error handling. Typically follows a structured format like 'request.invalid' or 'resource.invalid'. Example: "request.invalid" - `errors.message` (string, required) Human-readable error message providing details about the issue Example: "The provided email address is not in a valid format"