curl --request POST \
--url https://api.revem.ai/products/public/v1 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sku": "CONT-20ST",
"name": "Contenedor 20 pies",
"price": 1250000,
"currency": "CLP",
"Estado": "Disponible"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
sku: 'CONT-20ST',
name: 'Contenedor 20 pies',
price: 1250000,
currency: 'CLP',
Estado: 'Disponible'
})
};
fetch('https://api.revem.ai/products/public/v1', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.revem.ai/products/public/v1"
payload = {
"sku": "CONT-20ST",
"name": "Contenedor 20 pies",
"price": 1250000,
"currency": "CLP",
"Estado": "Disponible"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"ok": true,
"id": "3f2b6c1e-8d4a-4f0b-9c2e-7a1d5e6f8b90",
"created": true,
"warnings": []
}{
"ok": false,
"error": "body/price Invalid input: expected number, received undefined"
}{
"error": "Unauthorized",
"message": "Invalid API key"
}{
"ok": false,
"error": "Forbidden",
"message": "This endpoint is not available to API keys"
}{
"ok": false,
"error": "Conflict",
"message": "El SKU \"CONT-20ST\" lo usa un producto del simulador; resuélvelo en Productos"
}{
"ok": false,
"error": "Unprocessable Entity",
"message": "Atributos de producto sin definición: Terminal. Créalos en Productos antes de enviarlos",
"unknownAttributes": [
"Terminal"
]
}{
"ok": false,
"error": "Too many requests. Retry in 1 minute."
}Crear o actualizar un producto
Escribe un producto identificado por su SKU: si ya existe uno con ese SKU se actualiza, si no se crea. Una clave ausente deja el valor guardado como está, así que una solicitud parcial es una actualización parcial.
Guarda el id que devuelve: es la identidad estable, y es lo que permite cambiarle el SKU después con PATCH /products/public/v1/{id}.
Un producto del simulador sigue siendo dueño de su SKU: escribirle responde 409 y se resuelve desde la app. Un atributo marcado como obligatorio hay que enviarlo al crear; cuando el SKU ya existe la solicitud es una actualización y sólo se revisan los atributos que nombra.
curl --request POST \
--url https://api.revem.ai/products/public/v1 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"sku": "CONT-20ST",
"name": "Contenedor 20 pies",
"price": 1250000,
"currency": "CLP",
"Estado": "Disponible"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
sku: 'CONT-20ST',
name: 'Contenedor 20 pies',
price: 1250000,
currency: 'CLP',
Estado: 'Disponible'
})
};
fetch('https://api.revem.ai/products/public/v1', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.revem.ai/products/public/v1"
payload = {
"sku": "CONT-20ST",
"name": "Contenedor 20 pies",
"price": 1250000,
"currency": "CLP",
"Estado": "Disponible"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"ok": true,
"id": "3f2b6c1e-8d4a-4f0b-9c2e-7a1d5e6f8b90",
"created": true,
"warnings": []
}{
"ok": false,
"error": "body/price Invalid input: expected number, received undefined"
}{
"error": "Unauthorized",
"message": "Invalid API key"
}{
"ok": false,
"error": "Forbidden",
"message": "This endpoint is not available to API keys"
}{
"ok": false,
"error": "Conflict",
"message": "El SKU \"CONT-20ST\" lo usa un producto del simulador; resuélvelo en Productos"
}{
"ok": false,
"error": "Unprocessable Entity",
"message": "Atributos de producto sin definición: Terminal. Créalos en Productos antes de enviarlos",
"unknownAttributes": [
"Terminal"
]
}{
"ok": false,
"error": "Too many requests. Retry in 1 minute."
}Authorizations
La API key de tu organización, con la forma rvm_<prefijo>.<secreto>, enviada como Authorization: Bearer rvm_…. Revem la emite y sólo se muestra una vez; si la pierdes se reemplaza, no se recupera.
Body
sku, name y price son obligatorios: este cuerpo puede crear el producto y son las tres columnas sin valor por defecto. Los atributos personalizados van al mismo nivel que los campos fijos, identificados por su nombre en Revem (sin distinguir mayúsculas). Tienen que estar definidos para productos: un nombre sin definición responde 422 con la lista en unknownAttributes, y un valor que no calza con el tipo declarado —o una opción que no está en un select— también responde 422. Un null quita el atributo. Hasta 100 atributos por solicitud.
Identificador del producto en tu sistema. Único dentro del tenant; es la identidad con la que el upsert resuelve.
1 - 255Nombre del producto, hasta 500 caracteres.
1 - 500Precio, hasta dos decimales. Un tercer decimal responde 400 en vez de truncarse.
0 <= x <= 9999999999.99Descripción, hasta 5000 caracteres. Una cadena vacía no borra la descripción guardada.
5000Código de moneda de 3 letras, por ejemplo CLP.
^[A-Za-z]{3}$UNIQUE, WEEKLY, MONTHLY, QUARTERLY, SEMI_ANNUAL o ANNUAL. Al crear, si se omite, queda en UNIQUE.
UNIQUE, WEEKLY, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL UNIQUE para un cobro único o RECURRENT para uno recurrente.
UNIQUE, RECURRENT UNIT, HOUR, DAY, MONTH, KG, G, LITER, METER o M2.
UNIT, HOUR, DAY, MONTH, KG, G, LITER, METER, M2 Descuento máximo permitido, entero de 0 a 100.
0 <= x <= 100Impuesto aplicable, entero de 0 a 100.
0 <= x <= 100Si el producto está disponible. Esta API no borra productos: dar de baja es enviar active: false.
Enlace http o https a la imagen. Responde 409 si la administra la integración que importó el producto.
2000Enlace http o https donde se ve o se compra. Responde 409 si la administra la integración que importó el producto.
2000Response
Producto creado o actualizado.
