curl --request PUT \
--url https://api.service.getjusto.com/v3/ecommerce/products/{productId}/menus/{menuId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"price": 5490,
"discountPrice": 4990,
"available": true
}
'import requests
url = "https://api.service.getjusto.com/v3/ecommerce/products/{productId}/menus/{menuId}"
payload = {
"price": 5490,
"discountPrice": 4990,
"available": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({price: 5490, discountPrice: 4990, available: true})
};
fetch('https://api.service.getjusto.com/v3/ecommerce/products/{productId}/menus/{menuId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.service.getjusto.com/v3/ecommerce/products/{productId}/menus/{menuId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'price' => 5490,
'discountPrice' => 4990,
'available' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.service.getjusto.com/v3/ecommerce/products/{productId}/menus/{menuId}"
payload := strings.NewReader("{\n \"price\": 5490,\n \"discountPrice\": 4990,\n \"available\": true\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.service.getjusto.com/v3/ecommerce/products/{productId}/menus/{menuId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"price\": 5490,\n \"discountPrice\": 4990,\n \"available\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.service.getjusto.com/v3/ecommerce/products/{productId}/menus/{menuId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"price\": 5490,\n \"discountPrice\": 4990,\n \"available\": true\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"productId": "<string>",
"importId": "<string>",
"name": "<string>",
"internalName": "<string>",
"description": "<string>",
"seoTitle": "<string>",
"seoDescription": "<string>",
"seoImageURL": "<string>",
"richContent": "<string>",
"richContentPosition": "beforeModifiers",
"hasRichContent": true,
"url": "<string>",
"partialUrl": "<string>",
"categoriesNames": [
"<string>"
],
"categoriesIds": [
"<string>"
],
"modifiersIds": [
"<string>"
],
"externalId": "<string>",
"metadata": {},
"images": [
"<string>"
],
"menus": [
{
"menuId": "<string>",
"price": 123,
"discount": 123,
"available": true,
"externalId": "<string>"
}
]
}
}{
"success": "false",
"error": {
"error": "error",
"message": "The request has an error"
}
}Editar precio de un producto en un menú
Cambia el precio, el precio con descuento o la disponibilidad del producto en un menú, sin modificar los demás menús. El precio actual en cada menú está en menus de GET /ecommerce/products/. Requiere edición de productos habilitada en la marca.
Cómo funcionan los menús y precios
Un menú es una lista de precios: dice qué productos se venden y a qué precio. En el administrador se llama menú y en la API precio: cada menú es un registro de GET /ecommerce/prices, y su _id es el menuId que aparece en menus de cada producto. Una marca puede tener varios menús, por ejemplo uno general, uno para un local y uno de almuerzo.
1. Cada pedido usa un solo menú. Los menús no se mezclan: el cliente ve el precio y la disponibilidad que el producto tiene en el menú que se está usando.
2. Cómo se elige el menú en la tienda online. Se revisan los menús habilitados de mayor a menor priority y se usa el primero que cumple todas estas condiciones:
storesIdsestá vacío o incluye el local del pedido. Mientras no se sepa el local, los menús con locales no aplican.channelsestá vacío o incluye el canal del pedido. Si el cliente aún no elige cómo recibir el pedido, se considera delivery.scheduleestá abierto a la hora de entrega menos el tiempo de preparación del local, o ahora si el pedido no es programado. El horario solo restringe siavailableAtPeriodsestrue; si no, el menú aplica a toda hora, salvo los días cerrados (closedDays).- Faltan al menos
daysBeforedías de calendario para esa fecha. segmentIdsestá vacío, o el cliente inició sesión y pertenece a alguna de esas audiencias.
Si ningún menú cumple, se usa el menú por defecto (isDefault), aunque no cumpla sus condiciones. Si la marca no tiene menú por defecto, se usa el de mayor priority. Si la marca tiene un solo menú habilitado, se usa siempre.
3. Productos no disponibles. Si el producto no está disponible en el menú que se usa, no aparece en la tienda. Si en el administrador tiene un mensaje de no disponible, aparece con ese mensaje, pero no se puede comprar. Un producto tampoco aparece si tiene un modificador obligatorio sin opciones disponibles en ese menú. Agotado (out-of-stock) es otra cosa: se marca por local, y el producto aparece como agotado, salvo que la marca active Ocultar productos no disponibles o sin stock: entonces los agotados no aparecen.
4. Cada menú tiene su propio precio. Cambiar el precio en un menú no cambia los demás. Para cambiarlo en toda la marca, cámbialo en cada menú donde el producto está disponible. Para cambiarlo solo en un local, canal u horario, usa el punto 2 para saber qué menú se usa ahí.
5. Descuentos. discountPrice es el precio final que paga el cliente, no un monto ni un porcentaje, y no puede ser mayor que el precio: si bajas price por debajo del descuento guardado, envía también discountPrice. Si es menor que el precio, la tienda muestra el precio normal tachado. En las respuestas viene como discount. Enviar discountPrice deja un solo descuento, y null lo quita. En el administrador se pueden guardar varios descuentos seguidos: en ese caso discount es el primero, pero el cliente paga el último.
6. Los cambios no son instantáneos. La tienda se actualiza en segundo plano, y el menú elegido para cada cliente se guarda hasta 15 minutos, así que un cambio en las condiciones de un menú puede tardar ese tiempo en verse.
curl --request PUT \
--url https://api.service.getjusto.com/v3/ecommerce/products/{productId}/menus/{menuId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"price": 5490,
"discountPrice": 4990,
"available": true
}
'import requests
url = "https://api.service.getjusto.com/v3/ecommerce/products/{productId}/menus/{menuId}"
payload = {
"price": 5490,
"discountPrice": 4990,
"available": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({price: 5490, discountPrice: 4990, available: true})
};
fetch('https://api.service.getjusto.com/v3/ecommerce/products/{productId}/menus/{menuId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.service.getjusto.com/v3/ecommerce/products/{productId}/menus/{menuId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'price' => 5490,
'discountPrice' => 4990,
'available' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.service.getjusto.com/v3/ecommerce/products/{productId}/menus/{menuId}"
payload := strings.NewReader("{\n \"price\": 5490,\n \"discountPrice\": 4990,\n \"available\": true\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.service.getjusto.com/v3/ecommerce/products/{productId}/menus/{menuId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"price\": 5490,\n \"discountPrice\": 4990,\n \"available\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.service.getjusto.com/v3/ecommerce/products/{productId}/menus/{menuId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"price\": 5490,\n \"discountPrice\": 4990,\n \"available\": true\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"productId": "<string>",
"importId": "<string>",
"name": "<string>",
"internalName": "<string>",
"description": "<string>",
"seoTitle": "<string>",
"seoDescription": "<string>",
"seoImageURL": "<string>",
"richContent": "<string>",
"richContentPosition": "beforeModifiers",
"hasRichContent": true,
"url": "<string>",
"partialUrl": "<string>",
"categoriesNames": [
"<string>"
],
"categoriesIds": [
"<string>"
],
"modifiersIds": [
"<string>"
],
"externalId": "<string>",
"metadata": {},
"images": [
"<string>"
],
"menus": [
{
"menuId": "<string>",
"price": 123,
"discount": 123,
"available": true,
"externalId": "<string>"
}
]
}
}{
"success": "false",
"error": {
"error": "error",
"message": "The request has an error"
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
ID Justo o ID externo del producto.
ID Justo o ID externo del menú (GET /ecommerce/prices).
Body
Cambios del producto en un menú. Los campos omitidos y los demás menús se conservan.
Precio base en la moneda de la marca. 0 significa gratis. Es obligatorio si el producto aún no tiene precio en ese menú.
x >= 0Precio con descuento: el precio final rebajado, menor o igual al precio base. No es un monto ni un porcentaje. Reemplaza los descuentos guardados en ese menú; null los quita. Si bajas price por debajo del precio con descuento actual, envía también discountPrice o null.
x >= 0Si el producto se vende en ese menú. Al asignar un precio en un menú nuevo sin este campo, queda disponible.