Hi!
This is your API key. Every example on this page is already filled in with it.
FullBAI Seller API
API FullBAI para Sellers
Create, update and delete products in the FullBAI catalog, upload in bulk, and validate stock and price in real time. Every body on this page is the official one.
Alta, actualización y baja de productos en el catálogo FullBAI, envío en lote y validación de stock y precio en tiempo real. Todos los cuerpos de esta página son los oficiales.
Integrate once and the catalog keeps itself up to date. Every operation is a
POST with Content-Type: application/json to the matching endpoint.
Integrá una vez y el catálogo se mantiene solo. Cada operación es un
POST con Content-Type: application/json al endpoint correspondiente.
| OperationOperación | Endpoint | IdentifierIdentificador |
|---|---|---|
| Create productAlta de producto | /webhook/create-product | your skutu sku |
| UpdateActualización | /webhook/update-product | your skutu sku |
| DeleteBaja | /webhook/delete-product | your skutu sku |
| Bulk uploadEnvío en lote | /webhook/batch/{create|update|delete} | one sku per itemun sku por ítem |
| Stock & priceStock y precio | your endpointtu endpoint | FullBAI calls youFullBAI te consulta |
sku is always yourssku siempre es el tuyoIn every body, sku is your own internal code — the same one you sent
when creating the product. Never the Full-XXXXXXXX you see in the panel: that is our
internal identifier — no product is found with it, and nothing changes.
En todos los cuerpos, sku es tu código interno — el mismo que enviaste al dar
de alta el producto. Nunca el Full-XXXXXXXX que ves en el panel: ese es nuestro
identificador interno — no encuentra ningún producto y no cambia nada.
AuthenticationAutenticación
Every request carries your key in the Authorization header. You receive it when
you are onboarded as a partner, and it is per seller: it only reaches your own products.
Toda solicitud lleva tu clave en el header Authorization. La recibís al homologarte
como socio y es por seller: sólo alcanza tus propios productos.
Authorization: Bearer TU_API_KEY Content-Type: application/json
Nothing leaves your machine: it is kept in localStorage and sent to no server.
Nada sale de tu equipo: se guarda en localStorage y no se envía a ningún servidor.
It creates, modifies and deletes products. Treat it like a password: never in repositories, screenshots or the customer's browser. If it leaked, ask support to rotate it.
Con ella se crean, modifican y eliminan productos. Guardala como una contraseña: nunca en repositorios, capturas ni en el navegador del cliente. Si se filtró, pedí la rotación al soporte.
Isolation between sellersAislamiento entre sellers
Every product records which seller it belongs to, and that is checked on every call. Using your key on another seller's product finds nothing — it never modifies it.
Cada producto guarda a qué seller pertenece y se verifica en cada llamada. Usar tu clave sobre el producto de otro seller no encuentra nada — nunca lo modifica.
Catalog rulesReglas del catálogo
Five rules explain almost every rejection. Reading them now saves retries later.
Cinco reglas explican casi todos los rechazos. Leerlas ahora ahorra reintentos después.
1 · Numbers go as text1 · Los números van como texto
Price, weight and dimensions are sent as strings, not numbers:
"199.99", not 199.99. The exception is stock_quantity,
which is an integer.
Precio, peso y dimensiones se envían como string, no como número:
"199.99" y no 199.99. La excepción es stock_quantity,
que es entero.
2 · Prices go in US dollars2 · Los precios van en dólares
Always USD, with a decimal point. The store handles the conversion to pesos.
Siempre USD, con punto decimal. La conversión a pesos la hace la tienda.
3 · Your SKU is unique within your catalog3 · Tu SKU es único dentro de tu catálogo
You cannot have two products with the same sku. A create with a SKU you already
have is ignored: it neither creates a duplicate nor overwrites the existing product — even if
the body carries different data. To change something, use update.
No podés tener dos productos con el mismo sku. Un alta con un SKU que ya tenés
se ignora: no crea un duplicado ni pisa el producto existente — aunque el cuerpo traiga datos
distintos. Si querés cambiar algo, usá actualizar.
Sending the same create several times — in parallel or in the same batch — is safe: only one product is created. You never end up with a duplicate because you retried.
Enviar el mismo alta varias veces — en paralelo o en el mismo lote — es seguro: se crea un solo producto. Nunca te queda un duplicado por haber reintentado.
4 · When updating images, send them all4 · Al actualizar imágenes, mandá todas
The system deletes every current image and registers whatever comes in the body. Send one and the product ends up with one. The first is always the featured image; the rest is the gallery.
El sistema borra todas las imágenes actuales y registra las que vengan en el cuerpo. Si mandás una sola, el producto queda con una sola. La primera es siempre la destacada; el resto es la galería.
5 · Publishing belongs to the store5 · Publicar es de la tienda
New products come in as drafts and the store publishes them after review. You can move a published product to draft, but not publish it.
Los productos nuevos entran como borrador y los publica la tienda tras la curaduría. Vos podés pasar a borrador un producto publicado, pero no publicarlo.
POST Create simple productAlta de producto simple
A product without variations. This is the most common case.
Producto sin variaciones. Es el caso más común.
{
"name": "Producto Ejemplo XYZ 123",
"type": "simple",
"short_description": "Descripción corta y atractiva del producto ejemplo.",
"sku": "SKU1234567",
"regular_price": "199.99",
"sale_price": "99.99",
"stock_quantity": 50,
"dimensions": {
"height": "10.0",
"length": "25.0",
"width": "15.0"
},
"weight": "500",
"categories": [
{ "name": "Categoría Ejemplo" },
{ "name": "Categoría Ejemplo 2" }
],
"images": [
{ "src": "https://tu-cdn.com/51jHP4rL3iL._AC_SL1000_.jpg" },
{ "src": "https://tu-cdn.com/51GrCyeL3KL._AC_SL1000_.jpg" }
],
"attributes": [
{
"name": "COLOR",
"is_optional": false,
"options": ["Azul", "Verde", "Amarillo"],
"variation": true,
"visible": true
},
{
"name": "MARCA",
"is_optional": false,
"options": ["Marca Ejemplo"],
"variation": false,
"visible": true
}
],
"description": "Descripción completa del producto, con especificaciones técnicas y beneficios."
}
curl -X POST https://api.fullbai.com/webhook/create-product \ -H "Authorization: Bearer TU_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Producto Ejemplo XYZ 123", "type": "simple", "sku": "SKU1234567", "regular_price": "199.99", "sale_price": "99.99", "stock_quantity": 50, "weight": "500", "dimensions": { "height": "10.0", "length": "25.0", "width": "15.0" }, "categories": [{ "name": "Categoría Ejemplo" }], "images": [{ "src": "https://tu-cdn.com/imagen.jpg" }], "description": "Descripción completa del producto." }'
// Node 18+ — fetch nativo const res = await fetch('https://api.fullbai.com/webhook/create-product', { method: 'POST', headers: { 'Authorization': 'Bearer TU_API_KEY', 'Content-Type': 'application/json' }, body: JSON.stringify({ name: 'Producto Ejemplo XYZ 123', type: 'simple', sku: 'SKU1234567', regular_price: '199.99', stock_quantity: 50, weight: '500', categories: [{ name: 'Categoría Ejemplo' }], images: [{ src: 'https://tu-cdn.com/imagen.jpg' }] }) }); console.log(res.status, await res.json());
<?php $body = [ 'name' => 'Producto Ejemplo XYZ 123', 'type' => 'simple', 'sku' => 'SKU1234567', 'regular_price' => '199.99', 'stock_quantity' => 50, 'weight' => '500', 'categories' => [['name' => 'Categoría Ejemplo']], 'images' => [['src' => 'https://tu-cdn.com/imagen.jpg']], ]; $ch = curl_init('https://api.fullbai.com/webhook/create-product'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer TU_API_KEY', 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode($body), ]); $res = curl_exec($ch); echo curl_getinfo($ch, CURLINFO_HTTP_CODE), ' ', $res;
import requests body = { "name": "Producto Ejemplo XYZ 123", "type": "simple", "sku": "SKU1234567", "regular_price": "199.99", "stock_quantity": 50, "weight": "500", "categories": [{"name": "Categoría Ejemplo"}], "images": [{"src": "https://tu-cdn.com/imagen.jpg"}], } r = requests.post( "https://api.fullbai.com/webhook/create-product", json=body, headers={"Authorization": "Bearer TU_API_KEY"}, timeout=30, ) print(r.status_code, r.json())
FieldsCampos
| FieldCampo | TypeTipo | DescriptionDescripción | |
|---|---|---|---|
name | string | req.obl. | Full product name.Nombre completo del producto. |
type | string | req.obl. | simple oro variable. |
sku | string | req.obl. | Your unique code. It is the key to every operation.Tu código único. Es la llave de todas las operaciones. |
regular_price | string | req.obl. | Regular price in US dollars. "199.99" = US$ 199.99.Precio regular en dólares. "199.99" = US$ 199,99. |
sale_price | string | opt.opc. | Promotional price in US dollars.Precio promocional en dólares. |
stock_quantity | integer | req.obl. | Available quantity. The only number that is not sent as text.Cantidad disponible. Es el único numérico que no va como texto. |
weight | string | req.obl. | Weight in grams.Peso en gramos. |
dimensions | object | req.obl. | height, length, width in centimeters, as text.en centímetros, como texto. |
categories | array | req.obl. | List of { "name": "…" }. The name must match the catalog.Lista de { "name": "…" }. El nombre debe coincidir con el catálogo. |
images | array | req.obl. | List of { "src": "…" }. The first one is the featured image.Lista de { "src": "…" }. La primera es la destacada. |
attributes | array | opt.opc. | Color, size, brand… See attributes.Color, talla, marca… Ver atributos. |
short_description | string | opt.opc. | Short description, for listings.Descripción corta, para listados. |
description | string | opt.opc. | Full description, on the product page.Descripción completa, en la ficha. |
URLs must be publicly accessible, with no login and no signature that expires. We fetch them once and serve them from our CDN. If a URL fails we retry; if it keeps failing, the product is left without that image.
Las URLs deben ser públicamente accesibles, sin login ni firma que venza. Las bajamos una vez y las servimos desde nuestro CDN. Si una URL falla, reintentamos; si sigue fallando, el producto queda sin esa imagen.
POST Create variable productAlta de producto variable
Same endpoint as the simple one, with "type": "variable" and the variations array. Each variation is a sellable product with its own SKU, price and stock.
Mismo endpoint que el simple, con "type": "variable" y el array variations. Cada variación es un producto vendible con su propio SKU, precio y stock.
On the parent product, attributes uses options (plural, the list of possible values). On each variation it uses option (singular, the value of that combination). Mixing them up is the most common error when creating a variable product.
En el producto padre, attributes usa options (plural, lista de valores posibles). En cada variación usa option (singular, el valor de esa combinación). Confundirlos es el error más común del alta variable.
{
"name": "Producto Ejemplo XYZ 123",
"type": "variable",
"short_description": "Descripción corta y atractiva del producto ejemplo.",
"sku": "SKU1230000000",
"regular_price": "199.99",
"sale_price": "99.99",
"stock_quantity": 50,
"dimensions": { "height": "10.0", "length": "25.0", "width": "15.0" },
"weight": "500",
"categories": [{ "name": "Categoría Ejemplo" }],
"images": [{ "src": "https://tu-cdn.com/imagen.jpg" }],
"attributes": [
{
"name": "COLOR",
"is_optional": false,
"options": ["Azul", "Verde", "Amarillo"],
"variation": true,
"visible": true
},
{
"name": "TALLA",
"is_optional": false,
"options": ["S", "M", "L", "XL"],
"variation": true,
"visible": true
}
],
"variations": [
{
"sku": "711121111",
"regular_price": "16.00",
"weight": "10",
"dimensions": { "height": "1.0", "length": "1.0", "width": "1.0" },
"manage_stock": true,
"stock_quantity": "10",
"image": { "src": "https://tu-cdn.com/azul-s.jpg" },
"attributes": [
{ "name": "COLOR", "is_optional": false, "option": "Azul", "variation": true, "visible": true },
{ "name": "TALLA", "is_optional": false, "option": "S", "variation": true, "visible": true }
]
},
{
"sku": "7111111113",
"regular_price": "16.00",
"weight": "10",
"dimensions": { "height": "1.0", "length": "1.0", "width": "1.0" },
"manage_stock": true,
"stock_quantity": "10",
"image": { "src": "https://tu-cdn.com/verde-m.jpg" },
"attributes": [
{ "name": "COLOR", "is_optional": false, "option": "Verde", "variation": true, "visible": true },
{ "name": "TALLA", "is_optional": false, "option": "M", "variation": true, "visible": true }
]
}
],
"description": "Descripción completa del producto."
}
curl -X POST https://api.fullbai.com/webhook/create-product \ -H "Authorization: Bearer TU_API_KEY" \ -H "Content-Type: application/json" \ --data-binary @producto-variable.json
| Variation fieldCampo de la variación | TypeTipo | DescriptionDescripción | |
|---|---|---|---|
sku | string | req.obl. | The variation's own SKU, different from the parent and from the others.SKU propio de la variación, distinto del padre y de las demás. |
regular_price | string | req.obl. | Price of this combination, in US dollars.Precio de esta combinación, en dólares. |
manage_stock | boolean | req.obl. | true to track stock per variation.para controlar stock por variación. |
stock_quantity | string | req.obl. | Stock of this combination.Stock de esta combinación. |
weight, dimensions | string / object | req.obl. | Its own weight and measurements — used for shipping.Peso y medidas propios — se usan para el envío. |
image | object | opt.opc. | A single { "src": "…" } (singular, not an array).Un solo { "src": "…" } (singular, no array). |
attributes[].option | string | req.obl. | Value of this combination. It must exist in the parent's options.Valor de esta combinación. Debe existir en las options del padre. |
POST Update productActualizar producto
Works for simple and variable products. The product is found by your sku.
Sirve para simples y variables. El producto se encuentra por tu sku.
sku and type plus the fields you want to modify is enough. There is no need to resend the whole structure: whatever is not in the body is left untouched.
Basta sku y type más los campos a modificar. No hace falta reenviar la estructura completa: lo que no venga en el cuerpo no se toca.
{
"sku": "SKU1234567",
"type": "simple",
"regular_price": "399.99",
"sale_price": "90.99",
"stock_quantity": 50
}
{
"name": "Producto Ejemplo XYZ 123",
"type": "simple",
"short_description": "Descripción corta y atractiva del producto ejemplo.",
"sku": "SKU1234567",
"regular_price": "399.99",
"sale_price": "90.99",
"stock_quantity": 50,
"dimensions": { "height": "10.0", "length": "25.0", "width": "15.0" },
"weight": "500",
"categories": [{ "name": "Categoría Ejemplo" }],
"images": [
{ "src": "https://tu-cdn.com/destacada.jpg" },
{ "src": "https://tu-cdn.com/galeria-1.jpg" }
],
"description": "Descripción completa del producto."
}
curl -X POST https://api.fullbai.com/webhook/update-product \ -H "Authorization: Bearer TU_API_KEY" \ -H "Content-Type: application/json" \ -d '{"sku":"SKU1234567","type":"simple","stock_quantity":50,"regular_price":"399.99"}'
If you send images, we delete all the current ones and register the new ones, in order: the first is the featured image and the rest is the gallery. Always send every image that should remain, not just the new one. This prevents stale images in the catalog.
Si mandás images, borramos todas las actuales y registramos las nuevas, en orden: la primera es la destacada y el resto es la galería. Mandá siempre todas las que deben quedar, no sólo la nueva. Esto evita imágenes obsoletas en el catálogo.
If you do not send images, the current ones stay untouched.
Si no mandás images, las actuales quedan intactas.
POST Move to draftPasar a borrador
Takes a product out of the store without deleting it. It is an update with the status field.
Saca un producto de la tienda sin eliminarlo. Es un update con el campo status.
{
"sku": "SKU1234567",
"status": "draft"
}
curl -X POST https://api.fullbai.com/webhook/update-product \ -H "Authorization: Bearer TU_API_KEY" \ -H "Content-Type: application/json" \ -d '{"sku": "SKU1234567", "status": "draft"}'
Publishing is not possible through the API. It depends on categorization and the store review, and a product published without that becomes the customer's problem. To publish again, contact support.
Publicar no se puede por API. Depende de la categorización y la conferencia de la tienda, y un producto publicado sin eso se vuelve un problema para el cliente. Para volver a publicar, hablá con el soporte.
| Current statusEstado actual | You sendEnviás | ResultResultado |
|---|---|---|
| publishedpublicado | "draft" | Leaves the store.Sale de la tienda. |
| draftborrador | "draft" | No effect — safe to retry.Sin efecto — podés reintentar tranquilo. |
| anycualquiera | "publish" | Refused. The product stays exactly as it was.Rechazado. El producto queda exactamente como estaba. |
| anycualquiera | other valueotro valor | Refused. Only draft is accepted.Rechazado. Sólo se acepta draft. |
You can combine it with other fields: {"sku":"…","status":"draft","stock_quantity":0}. But if the status is invalid, no field of that request is applied — so you never end up with half an update and no way to know which half went through.
Podés combinarlo con otros campos: {"sku":"…","status":"draft","stock_quantity":0}. Pero si el status es inválido, no se aplica ningún campo de esa solicitud — así nunca te quedás con media actualización sin saber qué mitad pasó.
POST Delete productEliminar producto
Sending the parent product SKU deletes the product and returns a success message. For variable products, the variations are deleted with it.
Enviando el SKU del producto padre, el producto se elimina y se devuelve un mensaje de éxito. En variables, las variaciones se eliminan con él.
{
"sku": "343712"
}
curl -X POST https://api.fullbai.com/webhook/delete-product \ -H "Authorization: Bearer TU_API_KEY" \ -H "Content-Type: application/json" \ -d '{"sku": "343712"}'
The product, its variations and its images are removed from our CDN. There is no trash bin. If you only want to take it off sale, use move to draft.
Se borran el producto, sus variaciones y sus imágenes de nuestro CDN. No hay papelera. Si sólo querés sacarlo de la venta, usá pasar a borrador.
POST Bulk uploadEnvío en lote
Up to 5,000 items per request. It answers immediately and processes in the background, with the same authentication, queue and retries as the single-product endpoints.
Hasta 5.000 ítems por solicitud. Responde de inmediato y procesa en segundo plano, con la misma autenticación, cola y reintentos que los endpoints de a un producto.
On /batch/create, /batch/update and /batch/delete the route already says what to do, so op is optional. If an item does carry an op different from the route, it is rejected with op_mismatch instead of being executed — so a delete that slips into /batch/update never deletes anything.
En /batch/create, /batch/update y /batch/delete la ruta ya dice qué hacer, así que op es opcional. Si un ítem trae un op distinto de la ruta, se rechaza con op_mismatch en vez de ejecutarse — así un delete que se cuele en /batch/update nunca borra nada.
On the mixed route /webhook/batch, op is required on every item:
create, update or delete.
En la ruta mixta /webhook/batch, op es obligatorio en cada ítem:
create, update o delete.
curl -X POST https://api.fullbai.com/webhook/batch/create \ -H "Authorization: Bearer TU_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "items": [ { "sku": "ABC123", "name": "Product A", "type": "simple", "regular_price": "19.90", "stock_quantity": 10 } ], "options": { "batch_id": "create-2026-09-22" } }'
curl -X POST https://api.fullbai.com/webhook/batch/update \ -H "Authorization: Bearer TU_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "items": [ { "sku": "ABC124", "stock_quantity": 0 }, { "sku": "ABC125", "regular_price": "24.90" } ] }'
curl -X POST https://api.fullbai.com/webhook/batch/delete \ -H "Authorization: Bearer TU_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "items": [ { "sku": "ABC126" }, { "sku": "ABC127" } ] }'
{
"items": [
{ "op": "create", "sku": "ABC123", "name": "Product A",
"type": "simple", "regular_price": "19.90", "stock_quantity": 10 },
{ "op": "update", "sku": "ABC124", "stock_quantity": 0 },
{ "op": "delete", "sku": "ABC125" }
],
"options": { "batch_id": "carga-2026-09-22" }
}
{
"batch_id": "create-2026-09-22",
"total_received": 3,
"total_queued": 1,
"total_rejected": 2,
"rejected": [
{ "index": 1, "code": "invalid_op" },
{ "index": 2, "code": "missing_sku" }
]
}
Response fieldsCampos de la respuesta
Same shape on all four routes.
Mismo formato en las cuatro rutas.
| FieldCampo | MeaningSignificado |
|---|---|
batch_id | Yours if you sent it in options; generated otherwise.El tuyo si lo mandaste en options; si no, generado. |
total_received | Items that arrived in the body.Ítems que llegaron en el cuerpo. |
total_queued | Items accepted and queued for processing.Ítems aceptados y en la cola para procesar. |
total_rejected | Items discarded on the spot.Ítems descartados en el acto. |
rejected[] | One per discarded item: its index in items and the code.Uno por ítem descartado: su index en items y el code. |
Rejection codesCódigos de rechazo
Each item is judged on its own: one bad item does not stop the rest of the batch.
Cada ítem se evalúa por separado: un ítem inválido no frena el resto del lote.
| CodeCódigo | WhenCuándo |
|---|---|
op_mismatch | The item op differs from the route. Only on the separate routes.El op del ítem es distinto de la ruta. Sólo en las rutas separadas. |
invalid_op | Unknown op. Only on the mixed route. Use create, update or delete.op desconocido. Sólo en la ruta mixta. Usá create, update o delete. |
missing_sku | The item has no sku.El ítem vino sin sku. |
invalid_item | The item is not a JSON object.El ítem no es un objeto JSON. |
These codes only check the shape of each item, which is what lets 5,000 items in fast. The catalog rules — a SKU you already have, publishing, a SKU that is not yours — are applied during processing, and an item that breaks them still counts in total_queued. See responses and rules.
Estos códigos sólo revisan la forma de cada ítem, que es lo que permite que entren 5.000 rápido. Las reglas del catálogo — un SKU que ya tenés, publicar, un SKU que no es tuyo — se aplican al procesar, y un ítem que las rompe igual cuenta en total_queued. Mirá respuestas y reglas.
Stock and price validationValidación de stock y precio
Here the direction flips: FullBAI calls your endpoint. When a customer adds a product to the cart, we query your system to validate stock and price in real time.
Acá el sentido se invierte: FullBAI llama a tu endpoint. Cuando un cliente agrega un producto al carrito, consultamos tu sistema para validar stock y precio en tiempo real.
Your endpoint must respond within 15 seconds. On error or timeout, FullBAI allows adding to the cart (fail-safe): we would rather review a sale than lose it because your side went down.
Tu endpoint debe responder en máximo 15 segundos. Ante error o timeout, FullBAI permite agregar al carrito (fail-safe): preferimos una venta a revisar antes que perderla por una caída tuya.
Supported endpoint formatsFormatos de endpoint soportados
| FormatFormato | ExampleEjemplo | How the SKU arrivesCómo llega el SKU | |
|---|---|---|---|
| GET | with placeholdercon placeholder | https://api.seller.com/stock?cod=123&sku={sku} |
{sku} is replaced automatically.{sku} se reemplaza automáticamente. |
| GET | ending in sku=terminando en sku= |
https://api.seller.com/stock?cod=123&sku= |
Appended to the end of the URL.Se agrega al final de la URL. |
| POST | with JSON bodycon JSON body | https://api.seller.com/webhook |
In the body (classic format).En el cuerpo (formato clásico). |
What you will receiveLo que vas a recibir
POST https://tu-endpoint.com/api/fullbai-stock Content-Type: application/json X-Seller: nombre_seller { "sku": "ABC123", "sku-simple": "ABC123", "sku-variation": ["ABC123"] }
GET https://api.seller.com/stock?cod=123&sku=ABC123 X-Seller: nombre_seller # El SKU viaja en la URL. El header X-Seller identifica al seller.
What you must returnLo que debés responder
Always HTTP 200 with Content-Type: application/json. Three shapes are accepted.
Siempre HTTP 200 con Content-Type: application/json. Se aceptan tres formas.
{
"sku": "ABC123",
"stock": 10,
"price": 49.90
}
[
{
"sku-variation": "ABC123",
"stock": 10,
"price": 49.90
}
]
[
{
"sku": "ABC123",
"stock": 10,
"price": 49.90
},
{
"sku": "ABC124",
"stock": 0,
"price": 39.90
}
]
| FieldCampo | TypeTipo | DescriptionDescripción | |
|---|---|---|---|
sku · sku-simple · sku-variation | string | req.obl. | Product SKU. Any of the three names works.SKU del producto. Cualquiera de los tres nombres sirve. |
stock | numbernúmero | req.obl. | Available quantity. 0 = out of stock.Cantidad disponible. 0 = agotado. |
price | numbernúmero | opt.opc. | Current price (informational).Precio actual (informativo). |
regular_price | float / null | opt.opc. | Regular price.Precio regular. |
sale_price | float / null | opt.opc. | Promotional price. null or 0 removes it.Precio promocional. null o 0 lo elimina. |
Price fields are numbers here, not text — the opposite of product creation. It is not an oversight: they are two different contracts.
Los campos de precio son números acá, no texto — al revés que en el alta de productos. No es un descuido: son dos contratos distintos.
Managing sale pricesGestión de precios de oferta
To remove the sale pricePara eliminar el precio de oferta
Send sale_price as null, 0, "" or "null".
Enviá sale_price como null, 0, "" o "null".
{
"sku": "ABC123",
"stock": 10,
"sale_price": null
}
{
"sku": "ABC123",
"stock": 10,
"regular_price": 299.90,
"sale_price": 0
}
Result: the promotional price is removed and the product shows only the regular one.
Resultado: el precio promocional se elimina y el producto muestra sólo el regular.
To update prices while keeping the salePara actualizar precios manteniendo la oferta
{
"sku": "ABC123",
"stock": 10,
"regular_price": 399.90,
"sale_price": 299.90
}
BehaviorComportamiento
| SituationSituación | ResultResultado |
|---|---|
stock: 0 | Product blocked, not added to the cart.Producto bloqueado, no se agrega al carrito. |
stock < quantity requestedcantidad pedida | Shows an error with the available stock.Muestra error con el stock disponible. |
stock ≥ quantity requestedcantidad pedida | Product added normally.Producto agregado normalmente. |
sale_price: null / 0 | Removes the promotional price.Elimina el precio promocional. |
| No price fieldsSin campos de precio | Prices are left unchanged.No altera precios. |
| Error or timeoutError o timeout | Allows adding to the cart (fail-safe).Permite agregar al carrito (fail-safe). |
Errors on your sideErrores de tu lado
If your endpoint fails, return a status other than 200:
Si tu endpoint falla, devolvé un status distinto de 200:
{ "error": "Base de datos no disponible" }
FullBAI logs it and applies the fail-safe. Do not return 200 with an error body: we would read it as valid stock.
FullBAI lo registra y aplica el fail-safe. No devuelvas 200 con un cuerpo de error: lo interpretaríamos como stock válido.
AttributesAtributos
Attributes are not decorative: they feed the store filters, the segmentation and the product page layout. A well-attributed product shows up in more searches.
Los atributos no son decorativos: alimentan los filtros de la tienda, las segmentaciones y el diseño de la ficha. Un producto bien atribuido aparece en más búsquedas.
| AttributeAtributo | ExampleEjemplo | variation | visible | UseUso |
|---|---|---|---|---|
| COLOR | Azul, Verde, Amarillo | true | true | Generates variations (affects combinations).Genera variaciones (afecta combinaciones). |
| TALLA | S, M, L, XL | true | true | Generates variations (affects combinations).Genera variaciones (afecta combinaciones). |
| MODELO | XYZ-123 | false | true | Informational, display only.Informativo, sólo visible. |
| MARCA | Marca Ejemplo | false | true | Informational, display only.Informativo, sólo visible. |
| POTENCIA | 1500W | false | true | Informational, useful for electronics.Informativo, útil en electrónicos. |
| CÓDIGO DE BARRAS | 7891524632587 | false | true | Informational.Informativo. |
| PAÍS DE ORIGEN | Importado | false | true | Informational.Informativo. |
variation: true only on attributes that actually generate combinations. Marking MARCA as variation multiplies variations nobody chose.
variation: true sólo en los atributos que realmente generan combinaciones. Marcar MARCA como variation multiplica variaciones que nadie eligió.
"attributes": [ { "name": "COLOR", "is_optional": false, "options": ["Rojo", "Negro", "Blanco"], "variation": true, "visible": true }, { "name": "ROPA", "is_optional": false, "options": ["L", "M", "S", "XS"], "variation": true, "visible": true }, { "name": "CÓDIGO DE BARRAS", "is_optional": false, "options": ["7891524632587"], "variation": false, "visible": true }, { "name": "COMPOSICIÓN DEL MATERIAL", "is_optional": false, "options": ["95% Algodón, 5% Elastano"], "variation": false, "visible": true }, { "name": "INSTRUCCIONES DE CUIDADO", "is_optional": false, "options": ["Lavar a máquina con agua fría, No usar blanqueador"], "variation": false, "visible": true }, { "name": "PAÍS DE ORIGEN", "is_optional": false, "options": ["Importado"], "variation": false, "visible": true } ]
Responses and rulesRespuestas y reglas
The API answers as soon as it receives your request. A 200 means it is in the queue — not that it was applied. The catalog rules are applied during processing, a few seconds later.
La API responde apenas recibe tu solicitud. Un 200 significa que está en la cola — no que se aplicó. Las reglas del catálogo se aplican al procesar, unos segundos después.
What the API answersLo que responde la API
| HTTP | MeaningSignificado | What to doQué hacer |
|---|---|---|
200 | Received and queued.Recibido y en la cola. | Nothing. Processing happens in the background.Nada. El procesamiento sigue en segundo plano. |
401 | API key missing or invalid.API key ausente o inválida. | Check the Authorization: Bearer header.Revisá el header Authorization: Bearer. |
In a bulk upload, items with a malformed shape come back right away in rejected[] — see the codes in that section. Everything else follows the rules below.
En un envío en lote, los ítems con forma inválida vuelven en el acto en rejected[] — mirá los códigos en esa sección. Todo lo demás sigue las reglas de abajo.
What happens during processingLo que pasa al procesar
| You sendEnviás | Result on your catalogResultado en tu catálogo |
|---|---|
| A create with a SKU you already haveUn alta con un SKU que ya tenés | Ignored. No duplicate, and the existing product is not overwritten. To change data, use update.Se ignora. No hay duplicado y el producto existente no se pisa. Para cambiar datos, usá actualizar. |
A create without name or typeUn alta sin name o type |
Not created.No se crea. |
| An update or delete of a SKU that is not in your catalogUn update o delete de un SKU que no está en tu catálogo | Nothing changes. Check that you sent your own SKU and not the Full-XXXXXXXX.No cambia nada. Verificá que mandaste tu SKU y no el Full-XXXXXXXX. |
"status": "publish" |
Refused. The product stays as it was — publishing belongs to the store.Rechazado. El producto queda como estaba — publicar es de la tienda. |
A status other than draftUn status distinto de draft |
Refused, and no field of that request is applied.Rechazado, y no se aplica ningún campo de esa solicitud. |
| Another seller's SKUEl SKU de otro seller | Never modified. Your key only reaches your own products.Nunca se modifica. Tu clave sólo alcanza tus productos. |
Because validation happens after the response, a request that breaks one of these rules still answers 200. When something does not show up in your catalog as expected, check it against this table before retrying — retrying the same body gives the same result.
Como la validación ocurre después de la respuesta, una solicitud que rompe alguna de estas reglas igual responde 200. Cuando algo no aparece en tu catálogo como esperabas, compará con esta tabla antes de reintentar — reintentar el mismo cuerpo da el mismo resultado.
SupportSoporte
If something does not match what is documented here, write to us with the SKU, the body you sent and the response you got. With those three we can find the case in the logs.
Si algo no encaja con lo documentado acá, escribinos con el SKU, el cuerpo enviado y la respuesta recibida. Con esos tres datos encontramos el caso en los registros.
Before writing, check the three most frequent causes: numbers sent as numbers instead of text, image URLs that are not public, and the Full-XXXXXXXX used instead of your SKU.
Antes de escribir, revisá las tres causas más frecuentes: números enviados como número en vez de texto, URLs de imagen que no son públicas, y el Full-XXXXXXXX usado en lugar de tu SKU.