Crear Volume Pricing con las API
Crea una regla de Volume Pricing con la Public API, con la referencia completa del cuerpo de la solicitud.
Este documento explica cómo crear una regla de Volume Pricing con la Public API.
1. Endpoint
Sección titulada «1. Endpoint»Para crear un registro de Volume Pricing, usa el siguiente endpoint:
POST - https://wholesale.samita.io/api/v1/volume-pricingsEste endpoint te permite crear una nueva configuración de Volume Pricing.
2. Encabezados de la solicitud
Sección titulada «2. Encabezados de la solicitud»Todas las solicitudes a la API deben incluir los siguientes encabezados obligatorios:
| Encabezado | Descripción | Obligatorio |
|---|---|---|
X-SAMITA-API-KEY |
Clave de API proporcionada en la aplicación Wholesale | Sí |
X-SAMITA-SHOP-URL |
Dominio de la tienda de Shopify con el formato xxx.myshopify.com | Sí |
CONTENT-TYPE |
Debe ser application/json |
Sí |
Si falta alguno de los encabezados obligatorios, la solicitud se rechazará.
3. Cuerpo de la solicitud
Sección titulada «3. Cuerpo de la solicitud»a. Formato general
Sección titulada «a. Formato general»Los datos para crear Volume Pricing deben enviarse en formato JSON.
Al final de este documento encontrarás un ejemplo de estructura JSON.
Ejemplo de JSON de solicitud:
{ "title": "New Volume Pricing", "status": true, "type": "quantity", "apply_customer": { "type": "all", "tags": [] }, "exclude_customer": { "type": "none", "tags": [] }, "apply_product": { "type": "all", "product_ids": [], "product_tags": [], "collection_ids": [], "apply_for_variants": false }, "exclude_product": { "type": "none", "product_ids": [], "collection_ids": [] }, "discount_for_variants": [ { "id": 8516448190631, "duplicated": false, "variant_pricing": true, "from_qty": "0", "from_amount": "0", "to_qty": "10", "to_amount": "0", "discount_groups": [ { "name": "all", "type": "percent", "value": "10" } ], "variants": [ { "id": 46747346763943, "duplicated": false, "from_qty": "0", "from_amount": "0", "to_qty": "10", "to_amount": "0", "discount_groups": [ { "name": "all", "type": "percent", "value": "10" } ] } ] } ], "apply_market": { "type": "all", "handle": [] }, "discount_method": "variant", "discount_groups": [ { "from_qty": "0", "from_amount": "0", "to_qty": "10", "to_amount": "0", "type": "percent", "value": "10" } ], "active_date": { "types": ["start date", "end date"], "start_at": "2026-01-15T10:00:00", "end_at": "2026-01-15T10:00:00" }}b. title (obligatorio)
Sección titulada «b. title (obligatorio)»- El nombre que identifica el registro de Volume Pricing
- Debe ser una cadena de texto
- Longitud máxima: 255 caracteres
c. status (obligatorio)
Sección titulada «c. status (obligatorio)»- Define si el registro está activo o no
- Solo acepta los siguientes valores:
| Valor | Descripción |
|---|---|
true |
La regla de precios está activa |
false |
La regla de precios está inactiva |
d. type (obligatorio)
Sección titulada «d. type (obligatorio)»Define si el volume pricing se calcula por cantidad o por importe.
Valores aceptados:
quantityamount
e. apply_customer (obligatorio)
Sección titulada «e. apply_customer (obligatorio)»Define qué clientes pueden acceder a esta regla de precios.
Estructura:
"apply_customer": { "type": "all", "tags": []}type
Valores aceptados (solo uno de los siguientes):
all– Se aplica a toda la clientelalogged– Se aplica solo a quienes han iniciado sesiónnon-logged– Se aplica solo a quienes visitan la tienda sin cuentacustomer-tags– Se aplica solo a clientes con etiquetas concretas
tags
- Obligatorio solo cuando
type == customer-tags - Debe ser un array separado por comas
- Ejemplo:
["wholesale","b2b"]
Si type no es customer-tags, este campo se puede ignorar.
f. exclude_customer
Sección titulada «f. exclude_customer»Sirve para excluir a determinados clientes de la regla de precios.
Estructura:
"exclude_customer": { "type": "none", "tags": []}type
- Valor predeterminado:
none - Valores aceptados:
| Valor | Descripción |
|---|---|
none |
No excluir a ningún cliente |
customer-tags |
Excluir clientes por etiquetas |
tags
- Obligatorio solo cuando
type == customer-tags - Array separado por comas
- Ejemplo:
["vip","internal"]
g. apply_product (obligatorio)
Sección titulada «g. apply_product (obligatorio)»Define a qué productos se aplicará la regla de precios.
Estructura:
"apply_product": { "type": "all", "product_ids": [], "product_tags": [], "collection_ids": [], "apply_for_variants": false}type
Valores aceptados:
allproductscollectionsproduct-tags
product_ids
- Obligatorio solo cuando
type == products - Lista de IDs de producto separados por comas
- Ejemplo:
[1,2,3]
product_tags
- Obligatorio solo cuando
type == product-tags - Ejemplo:
["tag1","tag2"]
collection_ids
- Obligatorio solo cuando
type == collections - Ejemplo:
[1,2,3]
apply_for_variants
- Determina si los descuentos se pueden configurar por variante
- Valores aceptados:
trueofalse - Valor predeterminado:
false
h. exclude_product
Sección titulada «h. exclude_product»Define los productos que se excluyen de la regla.
Estructura:
"exclude_product": { "type": "none", "product_ids": [], "collection_ids": []}type
- Valor predeterminado:
none - Valores aceptados:
| Valor | Descripción |
|---|---|
none |
No excluir ningún producto |
products |
Excluir productos concretos |
collections |
Excluir colecciones concretas |
Los demás campos solo son obligatorios según el type seleccionado.
i. discount_for_variants
Sección titulada «i. discount_for_variants»Define la configuración del descuento a nivel de producto o de variante.
- Deja este campo vacío si
apply_product.apply_for_variants == false. - Si
apply_product.apply_for_variants == true, este campo es obligatorio. - La estructura debe ser un array de configuraciones de producto.
Estructura:
"discount_for_variants": [
{
"id": 8516448190631,
"duplicated": false,
"from_qty": "0",
"from_amount": "0",
"to_qty": "10",
"to_amount": "0",
"discount_groups": [
{
"name": "all",
"type": "percent",
"value": "10"
}
],
"variant_pricing": true,
"variants": [
{
"id": 46747346763943,
"duplicated": false,
"from_qty": "0",
"from_amount": "0",
"to_qty": "10",
"to_amount": "0",
"discount_groups": [
{
"name": "all",
"type": "percent",
"value": "10"
}
]
}
]
}
]
i.1. id (obligatorio)
- ID del producto.
- Debe coincidir con un producto existente.
i.2. duplicated
Indica si el producto tiene varios rangos de cantidad o importe.
Valores aceptados:
truefalse
Reglas:
- Si es
true: el producto contiene varios rangos de cantidad o importe. - Si es
false: el producto tiene un único rango de cantidad o importe.
i.3. from_qty / from_amount
Cantidad o importe inicial del rango.
Reglas:
- El primer elemento puede estar vacío (por defecto, 1).
- Todos los elementos siguientes son obligatorios.
i.4. to_qty / to_amount
Cantidad o importe final del rango.
Reglas:
- Puede estar vacío (se calculará automáticamente como el valor
fromdel siguiente elemento menos 1). - Si se indica, debe ser menor que el valor
fromdel siguiente elemento.
Ejemplos:
- Elemento 1: from:0 – to:10 → Elemento 2: from:11 – to:20
- Elemento 1: from:0 – to:blank → Elemento 2: from:10 – to:blank
- Elemento 1: from:blank – to:10 → Elemento 2: from:11 – to:blank
i.5. discount_groups (nivel de producto)
Define la configuración del descuento para cada rango de cantidad o importe a nivel de producto.
- Obligatorio si
variant_pricing == false. - Déjalo vacío si
variant_pricing == true. - Debe ser un array de objetos de descuento que correspondan al
apply_customer.typeconfigurado.
Estructura:
{ "name": "all", "type": "percent", "value": "10"}+ name
Valores aceptados:
all(siapply_customer.type == all)logged(siapply_customer.type == logged)non-logged(siapply_customer.type == non-logged)
Si se indica otro valor, se tratará como una etiqueta de cliente y debe coincidir con una de las etiquetas definidas en apply_customer.tags.
+ type
Define el tipo de descuento.
Valores aceptados:
percent– Descuento porcentualamount– Importe fijo que se resta del preciofixed-amount– Precio final fijo
+ value
- Debe ser un número
- Debe ser mayor que 0
- Si
type == percent, el valor debe ser menor que 100
i.6. variant_pricing
Indica si el descuento se aplica a nivel de variante.
Valores aceptados:
truefalse
i.7. variants
Define la configuración del descuento a nivel de variante.
- Obligatorio si
variant_pricing == true - Déjalo vacío si
variant_pricing == false - Debe ser un array de configuraciones de variante
Estructura:
{ "id": 46747346763943, "duplicated": false, "from_qty": "0", "from_amount": "0", "to_qty": "10", "to_amount": "0", "discount_groups": [ { "name": "all", "type": "percent", "value": "10" } ]}+ id (obligatorio)
- ID de la variante.
+ duplicate
Indica si la variante tiene varios rangos de cantidad o importe.
Valores aceptados:
truefalse
Reglas:
- Si es
true: la variante contiene varios rangos. - Si es
false: la variante tiene un único rango.
+ from_qty / from_amount
Cantidad o importe inicial.
Reglas:
- El primer elemento puede estar vacío (por defecto, 1).
- Todos los elementos siguientes son obligatorios.
+ to_qty / to_amount
Cantidad o importe final.
Reglas:
- Puede estar vacío (se calcula automáticamente como el
fromdel siguiente elemento menos 1). - Si se indica, debe ser menor que el valor
fromdel siguiente elemento.
Ejemplos:
- Elemento 1: from:0 – to:10 → Elemento 2: from:11 – to:20
- Elemento 1: from:0 – to:blank → Elemento 2: from:10 – to:blank
- Elemento 1: from:blank – to:10 → Elemento 2: from:11 – to:blank
+ discount_groups (nivel de variante)
Define la configuración del descuento por rango de cantidad o importe a nivel de variante.
Reglas:
- Si
apply_customer.typees:allloggednon-logged
→ El array debe contener un único elemento.
- Si
apply_customer.type == customer-tags
→ El array debe contener varios elementos (uno por etiqueta de cliente).
name
Valores aceptados:
allloggednon-logged
Si se indica otro valor, se tratará como una etiqueta de cliente y debe coincidir con una etiqueta definida en apply_customer.tags.
type
Valores aceptados:
percentamountfixed-amount
value
- Debe ser un número
- Debe ser mayor que 0
- Si
type == percent, el valor debe ser menor que 100
j. apply_market (obligatorio)
Sección titulada «j. apply_market (obligatorio)»Define a qué mercados de Shopify se aplica la regla.
Estructura:
"apply_market": { "type": "all", "handle": []}type
Valores aceptados:
allspecific-market
handle
- Obligatorio solo cuando
type == specific-market - Lista de handles de mercado separados por comas
- Ejemplo:
["japan","us"]
Para obtener el handle de un mercado, sigue estos pasos:
- En el panel de administración de Shopify, ve a la sección Markets > haz clic en More actions > elige Edit Market handles > copia el handle que aparece allí:


k. discount_methods (obligatorio)
Sección titulada «k. discount_methods (obligatorio)»Valores aceptados:
variant→ Same Variantacross_group→ Mix Variantswithin_each_group→ Mix Products
Corresponden a las opciones disponibles en la aplicación.
Ejemplo:
"discount_method": "variant",l. discount_group (obligatorio)
Sección titulada «l. discount_group (obligatorio)»Define los rangos de cantidad o importe y los valores de descuento.
from_qty / from_amount
to_qty / to_amount
Se aplican las mismas reglas de validación descritas arriba.
Valores aceptados de “type”:
percentamountfixed-amount
value:
- Debe ser > 0
- Si es percent → debe ser < 100
Estructura:
"discount_groups": [ { "from_qty": "0", "from_amount": "0", "to_qty": "10", "to_amount": "0", "type": "percent", "value": "10" } ],Las reglas son las mismas que se describen arriba para los tipos y valores de descuento.
m. active_date
Sección titulada «m. active_date»Sirve para configurar la fecha y hora de inicio y fin de la regla de precios.
Estructura:
"active_date": { "types": ["start_date", "end_date"], "start_at": "2026-01-15 10:00:00", "end_at": "2026-01-15 10:00:00"}types
- Opcional
- Valores aceptados:
start_date,end_date - Puede incluir uno o ambos, separados por comas
- Ejemplo:
["start_date","end_date"]
start_at
- Obligatorio si
typesincluyestart_date - Formato:
YYYY-MM-DD HH:MM:SS
end_at
- Obligatorio si
typesincluyeend_date - Formato:
YYYY-MM-DD HH:MM:SS
4. Respuesta de la API
Sección titulada «4. Respuesta de la API»a. Respuestas de error
Sección titulada «a. Respuestas de error»401 – Unauthorized
Posibles motivos:
- Falta la URL de la tienda
- Falta la clave de API
- URL de la tienda no válida
- Clave de API no válida
- La clave de API no corresponde a la tienda
403 – This action is unauthorized
- La clave de API no tiene el permiso Create
- Cada clave de API puede tener los permisos View, Create, Update y Delete
- Esta API requiere el permiso Create
- También se devuelve cuando un ID indicado no existe
429 – Too Many Requests
- Se superó el límite de solicitudes
- Máximo permitido:
| Límite | Valor |
|---|---|
| Frecuencia de solicitudes | 1 solicitud cada 5 minutos |
| Límite diario | 50 solicitudes al día |
b. Respuesta correcta
Sección titulada «b. Respuesta correcta»200 – API Success
- El registro de Volume Pricing se creó correctamente
- La respuesta se devuelve en formato JSON
{ "id": 1, "title": "New Volume Pricing", "status": true, "type": "quantity", "apply_customer": { "type": "all", "tags": [] }, "exclude_customer": { "type": "none", "tags": [] }, "apply_product": { "type": "all", "product_ids": [], "product_tags": [], "collection_ids": [], "apply_for_variants": false }, "exclude_product": { "type": "none", "product_ids": [], "collection_ids": [] }, "discount_for_variants": [ { "id": 8516448190631, "duplicated": false, "variant_pricing": true, "from_qty": "0", "from_amount": "0", "to_qty": "10", "to_amount": "0", "discount_groups": [ { "name": "all", "type": "percent", "value": "10" } ], "variants": [ { "id": 46747346763943, "duplicated": false, "from_qty": "0", "from_amount": "0", "to_qty": "10", "to_amount": "0", "discount_groups": [ { "name": "all", "type": "percent", "value": "10" } ] } ] } ], "apply_market": { "type": "all", "handle": [] }, "discount_method": "variant", "discount_groups": [ { "from_qty": "0", "from_amount": "0", "to_qty": "10", "to_amount": "0", "type": "percent", "value": "10" } ], "active_date": { "types": [], "start_at": "", "end_at": "" }, "created_at": "2026-01-15T10:00:00", "updated_at": "2026-01-15T10:00:00"}