FullBAI API · Sellers

Hi!

This is your API key. Every example on this page is already filled in with it.

Important: do not share this link — your credential is in the URL. Anyone who opens it can create, modify and delete products in your catalog. Treat it like a password: never in screenshots, chats or tickets.
Importante: no compartas este enlace — tu credencial va en la URL. Quien lo abra puede crear, modificar y eliminar productos de tu catálogo. Guardalo como una contraseña: nunca en capturas de pantalla, chats ni tickets.

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.

REST · JSON Prices in US dollars Precios en dólares Bulk up to 5,000 items Alta en lote hasta 5.000 Stock validated in real time Validación de stock en tiempo real

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ónEndpointIdentifierIdentificador
Create productAlta de producto/webhook/create-productyour skutu sku
UpdateActualización/webhook/update-productyour skutu sku
DeleteBaja/webhook/delete-productyour skutu sku
Bulk uploadEnvío en lote/webhook/batch/{create|update|delete}one sku per itemun sku por ítem
Stock & priceStock y precioyour endpointtu endpointFullBAI calls youFullBAI te consulta
The sku is always yours
El sku siempre es el tuyo

In 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.

Your key reaches your entire catalog
Tu clave alcanza tu catálogo entero

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

POSThttps://api.fullbai.com/webhook/create-product

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."
}

FieldsCampos

FieldCampoTypeTipoDescriptionDescripción
namestringreq.obl.Full product name.Nombre completo del producto.
typestringreq.obl.simple oro variable.
skustringreq.obl.Your unique code. It is the key to every operation.Tu código único. Es la llave de todas las operaciones.
regular_pricestringreq.obl.Regular price in US dollars. "199.99" = US$ 199.99.Precio regular en dólares. "199.99" = US$ 199,99.
sale_pricestringopt.opc.Promotional price in US dollars.Precio promocional en dólares.
stock_quantityintegerreq.obl.Available quantity. The only number that is not sent as text.Cantidad disponible. Es el único numérico que no va como texto.
weightstringreq.obl.Weight in grams.Peso en gramos.
dimensionsobjectreq.obl.height, length, width in centimeters, as text.en centímetros, como texto.
categoriesarrayreq.obl.List of { "name": "…" }. The name must match the catalog.Lista de { "name": "…" }. El nombre debe coincidir con el catálogo.
imagesarrayreq.obl.List of { "src": "…" }. The first one is the featured image.Lista de { "src": "…" }. La primera es la destacada.
attributesarrayopt.opc.Color, size, brand… See attributes.Color, talla, marca… Ver atributos.
short_descriptionstringopt.opc.Short description, for listings.Descripción corta, para listados.
descriptionstringopt.opc.Full description, on the product page.Descripción completa, en la ficha.
We download the images ourselves
Las imágenes las descargamos nosotros

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

POSThttps://api.fullbai.com/webhook/create-product

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.

Two levels of attributes
Dos niveles de atributos

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."
}
Variation fieldCampo de la variaciónTypeTipoDescriptionDescripción
skustringreq.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_pricestringreq.obl.Price of this combination, in US dollars.Precio de esta combinación, en dólares.
manage_stockbooleanreq.obl.true to track stock per variation.para controlar stock por variación.
stock_quantitystringreq.obl.Stock of this combination.Stock de esta combinación.
weight, dimensionsstring / objectreq.obl.Its own weight and measurements — used for shipping.Peso y medidas propios — se usan para el envío.
imageobjectopt.opc.A single { "src": "…" } (singular, not an array).Un solo { "src": "…" } (singular, no array).
attributes[].optionstringreq.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

POSThttps://api.fullbai.com/webhook/update-product

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.

Send only what changes
Mandá sólo lo que cambia

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
}
Images are replaced entirely
Las imágenes se reemplazan por completo

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

POSThttps://api.fullbai.com/webhook/update-product

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"
}
One direction only: published → draft
Una sola dirección: publicado → borrador

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 actualYou sendEnviásResultResultado
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.
anycualquieraother valueotro valorRefused. 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

POSThttps://api.fullbai.com/webhook/delete-product

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"
}
There is no undo
No tiene vuelta atrás

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.

Each item is the same body you already send one product at a time, placed inside items. A create item is the full create body, an update item is the update body, and a delete item is just the sku.

Cada ítem es el mismo cuerpo que ya mandás de a un producto, dentro de items. Un ítem de alta es el cuerpo completo de alta, uno de actualización es el de actualizar, y uno de baja es sólo el sku.

RouteRutaEach item carriesCada ítem llevaExampleEjemplo
/webhook/batch/createThe full product bodyEl cuerpo completo del producto5 complete products5 productos completos
/webhook/batch/updatesku, type and what changesy lo que cambiaPrice and stock of the same 5Precio y stock de los mismos 5
/webhook/batch/deleteskuDelete the same 5Baja de los mismos 5
/webhook/batchAny of the above, plus opCualquiera de los anteriores, más opCreate, update and delete togetherAlta, actualización y baja juntas
Prefer one route per operation
Preferí una ruta por operación

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.

POST Bulk · createLote · alta

POSThttps://api.fullbai.com/webhook/batch/create

Five complete products in a single request. Each item carries everything a product needs — prices, stock, weight, dimensions, categories, images, attributes and descriptions — with the same fields as create simple product. Items do not share or inherit anything from each other.

Cinco productos completos en una sola solicitud. Cada ítem lleva todo lo que un producto necesita — precios, stock, peso, medidas, categorías, imágenes, atributos y descripciones — con los mismos campos que el alta de producto simple. Los ítems no comparten ni heredan nada entre sí.

Save the Body tab as productos.json — the Download button does it — and send it with the cURL tab.

Guardá la pestaña Body como productos.json — el botón Descargar lo hace — y mandalo con la pestaña cURL.

{
  "items": [
    {
      "name": "Perfume Lattafa Khamrah EDP Unisex - 100mL",
      "type": "simple",
      "short_description": "Oriental especiado con dátiles, canela y praliné. Larga duración.",
      "sku": "1580001",
      "regular_price": "45.00",
      "sale_price": "39.90",
      "stock_quantity": 24,
      "dimensions": { "height": "15.0", "length": "10.0", "width": "7.0" },
      "weight": "520",
      "categories": [{ "name": "Perfumes Árabes" }, { "name": "Perfumes unisex" }],
      "images": [
        { "src": "https://tu-cdn.com/lattafa-khamrah-frente.jpg" },
        { "src": "https://tu-cdn.com/lattafa-khamrah-caja.jpg" }
      ],
      "attributes": [
        { "name": "MARCA", "is_optional": false, "options": ["Lattafa"], "variation": false, "visible": true },
        { "name": "CONCENTRACIÓN", "is_optional": false, "options": ["EDP"], "variation": false, "visible": true },
        { "name": "VOLUMEN", "is_optional": false, "options": ["100mL"], "variation": false, "visible": true },
        { "name": "GÉNERO", "is_optional": false, "options": ["Unisex"], "variation": false, "visible": true },
        { "name": "FAMILIA OLFATIVA", "is_optional": false, "options": ["Oriental especiada"], "variation": false, "visible": true }
      ],
      "description": "Khamrah de Lattafa abre con canela, nuez moscada y bergamota; el corazón mezcla dátiles, praliné y tuberosa, y el fondo, vainilla, haba tonka y benjuí."
    },
    {
      "name": "Apple Watch SE 3 GPS 40mm MEHC4LW/A - Midnight",
      "type": "simple",
      "short_description": "Pantalla Retina siempre activa, detección de choques y resistencia al agua.",
      "sku": "1580002",
      "regular_price": "259.00",
      "stock_quantity": 6,
      "dimensions": { "height": "10.0", "length": "12.0", "width": "5.0" },
      "weight": "410",
      "categories": [{ "name": "Smartwatches" }],
      "images": [
        { "src": "https://tu-cdn.com/apple-watch-se3-40-frente.jpg" },
        { "src": "https://tu-cdn.com/apple-watch-se3-40-lateral.jpg" }
      ],
      "attributes": [
        { "name": "MARCA", "is_optional": false, "options": ["Apple"], "variation": false, "visible": true },
        { "name": "MODELO", "is_optional": false, "options": ["MEHC4LW/A"], "variation": false, "visible": true },
        { "name": "COLOR", "is_optional": false, "options": ["Midnight"], "variation": false, "visible": true },
        { "name": "PANTALLA", "is_optional": false, "options": ["40mm"], "variation": false, "visible": true },
        { "name": "GARANTÍA", "is_optional": false, "options": ["12 meses"], "variation": false, "visible": true }
      ],
      "description": "Apple Watch SE 3 de 40mm con GPS, correa deportiva talle M/L, sensores de frecuencia cardíaca y detección de caídas."
    },
    {
      "name": "Auriculares JBL Tune 520BT Bluetooth - Negro",
      "type": "simple",
      "short_description": "Inalámbricos, hasta 57 horas de batería y carga rápida.",
      "sku": "1580003",
      "regular_price": "49.90",
      "sale_price": "44.90",
      "stock_quantity": 40,
      "dimensions": { "height": "20.0", "length": "18.0", "width": "7.0" },
      "weight": "320",
      "categories": [{ "name": "Auriculares" }],
      "images": [{ "src": "https://tu-cdn.com/jbl-tune520bt-negro.jpg" }],
      "attributes": [
        { "name": "MARCA", "is_optional": false, "options": ["JBL"], "variation": false, "visible": true },
        { "name": "MODELO", "is_optional": false, "options": ["Tune 520BT"], "variation": false, "visible": true },
        { "name": "COLOR", "is_optional": false, "options": ["Negro"], "variation": false, "visible": true },
        { "name": "BLUETOOTH", "is_optional": false, "options": ["5.3"], "variation": false, "visible": true },
        { "name": "BATERÍA", "is_optional": false, "options": ["57 horas"], "variation": false, "visible": true }
      ],
      "description": "JBL Pure Bass, Bluetooth 5.3 con conexión multipunto, micrófono para llamadas y 5 minutos de carga para 3 horas de uso."
    },
    {
      "name": "Serum Facial Numbuzin No.5 Glutathione - 50mL",
      "type": "simple",
      "short_description": "Serum iluminador con glutatión y niacinamida.",
      "sku": "1580004",
      "regular_price": "18.00",
      "stock_quantity": 60,
      "dimensions": { "height": "13.0", "length": "5.0", "width": "5.0" },
      "weight": "150",
      "categories": [{ "name": "Cuidado de la piel (marcas coreanas)" }],
      "images": [{ "src": "https://tu-cdn.com/numbuzin-no5-serum.jpg" }],
      "attributes": [
        { "name": "MARCA", "is_optional": false, "options": ["Numbuzin"], "variation": false, "visible": true },
        { "name": "VOLUMEN", "is_optional": false, "options": ["50mL"], "variation": false, "visible": true },
        { "name": "ORIGEN", "is_optional": false, "options": ["Corea del Sur"], "variation": false, "visible": true }
      ],
      "description": "Serum de textura liviana que unifica el tono y aporta luminosidad. Uso diario, mañana y noche."
    },
    {
      "name": "Shampoo Tsubaki Premium Repair - 450mL",
      "type": "simple",
      "short_description": "Reparación intensiva para cabello dañado.",
      "sku": "1580005",
      "regular_price": "22.00",
      "stock_quantity": 35,
      "dimensions": { "height": "22.0", "length": "8.0", "width": "6.0" },
      "weight": "560",
      "categories": [{ "name": "Shampoo" }],
      "images": [{ "src": "https://tu-cdn.com/tsubaki-premium-repair-450.jpg" }],
      "attributes": [
        { "name": "MARCA", "is_optional": false, "options": ["Tsubaki"], "variation": false, "visible": true },
        { "name": "VOLUMEN", "is_optional": false, "options": ["450mL"], "variation": false, "visible": true },
        { "name": "ORIGEN", "is_optional": false, "options": ["Japón"], "variation": false, "visible": true }
      ],
      "description": "Shampoo con aceite de camelia y aminoácidos que repara desde la fibra y deja el cabello suave y brillante."
    }
  ],
  "options": { "batch_id": "carga-2026-09-22" }
}
Categories go by name — use one the store already has
Las categorías van por nombre — usá una que la tienda ya tenga

Each name in categories is looked up in the store catalog; the ones in this example are real store categories. A name we do not find is not matched to the closest one: it creates a new, separate category, and the product lands there instead of where you meant it. Never send a placeholder such as Categoría Ejemplo — it becomes a real category.

Cada nombre de categories se busca en el catálogo de la tienda; los de este ejemplo son categorías reales de la tienda. Un nombre que no encontramos no se asocia al más parecido: crea una categoría nueva y separada, y el producto cae ahí en vez de donde lo querías. Nunca mandes un nombre de relleno como Categoría Ejemplo — se convierte en una categoría real.

POST Bulk · updateLote · actualizar

POSThttps://api.fullbai.com/webhook/batch/update

The everyday case: new prices and stock for the same five products. Each item carries only sku, type and what changes — images, attributes, categories and descriptions stay as they are.

El caso de todos los días: precio y stock nuevos para los mismos cinco productos. Cada ítem lleva sólo sku, type y lo que cambia — imágenes, atributos, categorías y descripciones quedan como están.

{
  "items": [
    { "sku": "1580001", "type": "simple", "regular_price": "45.00", "sale_price": "36.90", "stock_quantity": 18 },
    { "sku": "1580002", "type": "simple", "regular_price": "249.00", "stock_quantity": 4 },
    { "sku": "1580003", "type": "simple", "regular_price": "49.90", "sale_price": "41.90", "stock_quantity": 32 },
    { "sku": "1580004", "type": "simple", "regular_price": "17.50", "stock_quantity": 0 },
    { "sku": "1580005", "type": "simple", "regular_price": "22.00", "sale_price": "19.90", "stock_quantity": 50 }
  ],
  "options": { "batch_id": "precios-2026-09-22" }
}
SKUPrice (US$)Precio (US$)Sale price (US$)Precio de oferta (US$)Stock
158000145.0039.90 → 36.9024 → 18
1580002259.00 → 249.006 → 4
158000349.9044.90 → 41.9040 → 32
158000418.00 → 17.5060 → 0
158000522.00nonesin oferta19.9035 → 50

A field you leave out keeps its current value: 1580002 and 1580004 send no sale_price and simply stay without an offer.

Un campo que no mandás conserva su valor actual: 1580002 y 1580004 no mandan sale_price y simplemente siguen sin oferta.

POST Bulk · deleteLote · eliminar

POSThttps://api.fullbai.com/webhook/batch/delete

Only the sku of each product. Variable products take their variations with them.

Sólo el sku de cada producto. Los variables se llevan sus variaciones.

{
  "items": [
    { "sku": "1580001" },
    { "sku": "1580002" },
    { "sku": "1580003" },
    { "sku": "1580004" },
    { "sku": "1580005" }
  ],
  "options": { "batch_id": "bajas-2026-09-22" }
}
There is no undo
No tiene vuelta atrás

Each product, its variations and its images are removed from our CDN — for every item in the batch. If you only want to take products off sale, use move to draft.

Se borran cada producto, sus variaciones y sus imágenes de nuestro CDN — para todos los ítems del lote. Si sólo querés sacarlos de la venta, usá pasar a borrador.

POST Bulk · mixedLote · mixto

POSThttps://api.fullbai.com/webhook/batch mixedmixto

A typical day in one request: a new product comes in with its full body, another one's stock changes, and a discontinued one leaves. Here op is required on every item: create, update or delete.

Un día típico en una sola solicitud: entra un producto nuevo con su cuerpo completo, cambia el stock de otro y sale uno discontinuado. Acá op es obligatorio en cada ítem: create, update o delete.

{
  "items": [
    {
      "op": "create",
      "name": "Auriculares JBL Tune 520BT Bluetooth - Blanco",
      "type": "simple",
      "short_description": "Inalámbricos, hasta 57 horas de batería y carga rápida.",
      "sku": "1580006",
      "regular_price": "49.90",
      "stock_quantity": 25,
      "dimensions": { "height": "20.0", "length": "18.0", "width": "7.0" },
      "weight": "320",
      "categories": [{ "name": "Auriculares" }],
      "images": [{ "src": "https://tu-cdn.com/jbl-tune520bt-blanco.jpg" }],
      "attributes": [
        { "name": "MARCA", "is_optional": false, "options": ["JBL"], "variation": false, "visible": true },
        { "name": "MODELO", "is_optional": false, "options": ["Tune 520BT"], "variation": false, "visible": true },
        { "name": "COLOR", "is_optional": false, "options": ["Blanco"], "variation": false, "visible": true },
        { "name": "BLUETOOTH", "is_optional": false, "options": ["5.3"], "variation": false, "visible": true },
        { "name": "BATERÍA", "is_optional": false, "options": ["57 horas"], "variation": false, "visible": true }
      ],
      "description": "JBL Pure Bass, Bluetooth 5.3 con conexión multipunto, micrófono para llamadas y 5 minutos de carga para 3 horas de uso."
    },
    { "op": "update", "sku": "1580001", "type": "simple", "stock_quantity": 10 },
    { "op": "delete", "sku": "1580002" }
  ],
  "options": { "batch_id": "dia-2026-09-22" }
}

Bulk · responseLote · respuesta

Same shape on all four routes. It arrives right away, before any item is processed.

Mismo formato en las cuatro rutas. Llega en el acto, antes de procesar cualquier ítem.

{
  "Status Code": 200,
  "Status Description": "Success",
  "batch_id": "carga-2026-09-22",
  "total_received": 5,
  "total_queued": 5,
  "total_rejected": 0,
  "rejected": []
}

Response fieldsCampos de la respuesta

FieldCampoMeaningSignificado
batch_idYours if you sent it in options; generated otherwise.El tuyo si lo mandaste en options; si no, generado.
total_receivedItems that arrived in the body.Ítems que llegaron en el cuerpo.
total_queuedItems accepted and queued for processing.Ítems aceptados y en la cola para procesar.
total_rejectedItems discarded on the spot.Ítems descartados en el acto.
rejected[]One per discarded item: its index in items, counting from 0, and the code. "index": 3 is the fourth item.Uno por ítem descartado: su index en items, contando desde 0, y el code. "index": 3 es el cuarto ítem.

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ódigoWhenCuándo
op_mismatchThe 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_opUnknown 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_skuThe item has no sku.El ítem vino sin sku.
invalid_itemThe item is not a JSON object.El ítem no es un objeto JSON.
Queued is not the same as applied
En cola no es lo mismo que aplicado

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.

15 seconds, and it fails safe
15 segundos, y falla del lado seguro

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

FormatFormatoExampleEjemploHow the SKU arrivesCómo llega el SKU
GETwith placeholdercon placeholder https://api.seller.com/stock?cod=123&sku={sku} {sku} is replaced automatically.{sku} se reemplaza automáticamente.
GETending 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.
POSTwith 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"]
}

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
}
FieldCampoTypeTipoDescriptionDescripción
sku · sku-simple · sku-variationstring req.obl.Product SKU. Any of the three names works.SKU del producto. Cualquiera de los tres nombres sirve.
stocknumbernúmeroreq.obl.Available quantity. 0 = out of stock.Cantidad disponible. 0 = agotado.
pricenumbernúmeroopt.opc.Current price (informational).Precio actual (informativo).
regular_pricefloat / nullopt.opc.Regular price.Precio regular.
sale_pricefloat / nullopt.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
}

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ónResultResultado
stock: 0Product blocked, not added to the cart.Producto bloqueado, no se agrega al carrito.
stock < quantity requestedcantidad pedidaShows an error with the available stock.Muestra error con el stock disponible.
stockquantity requestedcantidad pedidaProduct added normally.Producto agregado normalmente.
sale_price: null / 0Removes the promotional price.Elimina el precio promocional.
No price fieldsSin campos de precioPrices are left unchanged.No altera precios.
Error or timeoutError o timeoutAllows 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.

AttributeAtributoExampleEjemplovariationvisibleUseUso
COLORAzul, Verde, AmarillotruetrueGenerates variations (affects combinations).Genera variaciones (afecta combinaciones).
TALLAS, M, L, XLtruetrueGenerates variations (affects combinations).Genera variaciones (afecta combinaciones).
MODELOXYZ-123falsetrueInformational, display only.Informativo, sólo visible.
MARCAMarca EjemplofalsetrueInformational, display only.Informativo, sólo visible.
POTENCIA1500WfalsetrueInformational, useful for electronics.Informativo, útil en electrónicos.
CÓDIGO DE BARRAS7891524632587falsetrueInformational.Informativo.
PAÍS DE ORIGENImportadofalsetrueInformational.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

HTTPMeaningSignificadoWhat to doQué hacer
200Received and queued.Recibido y en la cola.Nothing. Processing happens in the background.Nada. El procesamiento sigue en segundo plano.
401API 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ásResult 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.
A 200 does not guarantee the change was applied
Un 200 no garantiza que el cambio se aplicó

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.