Bulk Update Products
curl --request POST \
--url https://api-ai.textyess.com/products/bulk-update \
--header 'Content-Type: application/json' \
--header 'x-auth-token: <api-key>' \
--data '
{
"products": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"image": "<string>",
"url": "<string>",
"variants": [
{
"id": "<string>",
"title": "<string>",
"price": "<string>",
"inventory_quantity": 123,
"variant_url": "<string>"
}
],
"collections": [
{}
]
}
]
}
'import requests
url = "https://api-ai.textyess.com/products/bulk-update"
payload = { "products": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"image": "<string>",
"url": "<string>",
"variants": [
{
"id": "<string>",
"title": "<string>",
"price": "<string>",
"inventory_quantity": 123,
"variant_url": "<string>"
}
],
"collections": [{}]
}
] }
headers = {
"x-auth-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-auth-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
products: [
{
id: '<string>',
title: '<string>',
description: '<string>',
image: '<string>',
url: '<string>',
variants: [
{
id: '<string>',
title: '<string>',
price: '<string>',
inventory_quantity: 123,
variant_url: '<string>'
}
],
collections: [{}]
}
]
})
};
fetch('https://api-ai.textyess.com/products/bulk-update', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-ai.textyess.com/products/bulk-update",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'products' => [
[
'id' => '<string>',
'title' => '<string>',
'description' => '<string>',
'image' => '<string>',
'url' => '<string>',
'variants' => [
[
'id' => '<string>',
'title' => '<string>',
'price' => '<string>',
'inventory_quantity' => 123,
'variant_url' => '<string>'
]
],
'collections' => [
[
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-auth-token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-ai.textyess.com/products/bulk-update"
payload := strings.NewReader("{\n \"products\": [\n {\n \"id\": \"<string>\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"image\": \"<string>\",\n \"url\": \"<string>\",\n \"variants\": [\n {\n \"id\": \"<string>\",\n \"title\": \"<string>\",\n \"price\": \"<string>\",\n \"inventory_quantity\": 123,\n \"variant_url\": \"<string>\"\n }\n ],\n \"collections\": [\n {}\n ]\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-auth-token", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api-ai.textyess.com/products/bulk-update")
.header("x-auth-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"products\": [\n {\n \"id\": \"<string>\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"image\": \"<string>\",\n \"url\": \"<string>\",\n \"variants\": [\n {\n \"id\": \"<string>\",\n \"title\": \"<string>\",\n \"price\": \"<string>\",\n \"inventory_quantity\": 123,\n \"variant_url\": \"<string>\"\n }\n ],\n \"collections\": [\n {}\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-ai.textyess.com/products/bulk-update")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-auth-token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"products\": [\n {\n \"id\": \"<string>\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"image\": \"<string>\",\n \"url\": \"<string>\",\n \"variants\": [\n {\n \"id\": \"<string>\",\n \"title\": \"<string>\",\n \"price\": \"<string>\",\n \"inventory_quantity\": 123,\n \"variant_url\": \"<string>\"\n }\n ],\n \"collections\": [\n {}\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Products update queued successfully"
}
{
"message": "You hit rate limit"
}
{
"message": "Unauthorized"
}
Products API
Bulk Update Products
Update multiple products at once in your catalog
POST
/
products
/
bulk-update
Bulk Update Products
curl --request POST \
--url https://api-ai.textyess.com/products/bulk-update \
--header 'Content-Type: application/json' \
--header 'x-auth-token: <api-key>' \
--data '
{
"products": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"image": "<string>",
"url": "<string>",
"variants": [
{
"id": "<string>",
"title": "<string>",
"price": "<string>",
"inventory_quantity": 123,
"variant_url": "<string>"
}
],
"collections": [
{}
]
}
]
}
'import requests
url = "https://api-ai.textyess.com/products/bulk-update"
payload = { "products": [
{
"id": "<string>",
"title": "<string>",
"description": "<string>",
"image": "<string>",
"url": "<string>",
"variants": [
{
"id": "<string>",
"title": "<string>",
"price": "<string>",
"inventory_quantity": 123,
"variant_url": "<string>"
}
],
"collections": [{}]
}
] }
headers = {
"x-auth-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-auth-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
products: [
{
id: '<string>',
title: '<string>',
description: '<string>',
image: '<string>',
url: '<string>',
variants: [
{
id: '<string>',
title: '<string>',
price: '<string>',
inventory_quantity: 123,
variant_url: '<string>'
}
],
collections: [{}]
}
]
})
};
fetch('https://api-ai.textyess.com/products/bulk-update', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-ai.textyess.com/products/bulk-update",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'products' => [
[
'id' => '<string>',
'title' => '<string>',
'description' => '<string>',
'image' => '<string>',
'url' => '<string>',
'variants' => [
[
'id' => '<string>',
'title' => '<string>',
'price' => '<string>',
'inventory_quantity' => 123,
'variant_url' => '<string>'
]
],
'collections' => [
[
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-auth-token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-ai.textyess.com/products/bulk-update"
payload := strings.NewReader("{\n \"products\": [\n {\n \"id\": \"<string>\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"image\": \"<string>\",\n \"url\": \"<string>\",\n \"variants\": [\n {\n \"id\": \"<string>\",\n \"title\": \"<string>\",\n \"price\": \"<string>\",\n \"inventory_quantity\": 123,\n \"variant_url\": \"<string>\"\n }\n ],\n \"collections\": [\n {}\n ]\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-auth-token", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api-ai.textyess.com/products/bulk-update")
.header("x-auth-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"products\": [\n {\n \"id\": \"<string>\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"image\": \"<string>\",\n \"url\": \"<string>\",\n \"variants\": [\n {\n \"id\": \"<string>\",\n \"title\": \"<string>\",\n \"price\": \"<string>\",\n \"inventory_quantity\": 123,\n \"variant_url\": \"<string>\"\n }\n ],\n \"collections\": [\n {}\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-ai.textyess.com/products/bulk-update")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-auth-token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"products\": [\n {\n \"id\": \"<string>\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"image\": \"<string>\",\n \"url\": \"<string>\",\n \"variants\": [\n {\n \"id\": \"<string>\",\n \"title\": \"<string>\",\n \"price\": \"<string>\",\n \"inventory_quantity\": 123,\n \"variant_url\": \"<string>\"\n }\n ],\n \"collections\": [\n {}\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Products update queued successfully"
}
{
"message": "You hit rate limit"
}
{
"message": "Unauthorized"
}
Overview
The bulk update endpoint allows you to modify multiple existing products in your catalog simultaneously. This is useful for updating prices, inventory, or product details in batch.Authentication
This endpoint requires a valid JWT token in thex-auth-token header. You can find your token in the Developers section:
x-auth-token: your_jwt_token
Body Parameters
array
required
Array of products to update. Only include the fields you want to modify - omitted fields will remain unchanged.
Show Show product properties
Show Show product properties
string
required
Unique identifier for the product (required to identify which product to update)
string
Updated product title
string
Updated product description
string
Updated product image URL
string
Updated product page URL
array
array
Updated array of collection names this product belongs to
Response
boolean
Indicates if the update was successful
string
A human-readable message describing the result
{
"success": true,
"message": "Products update queued successfully"
}
{
"message": "You hit rate limit"
}
{
"message": "Unauthorized"
}
Rate Limiting
You can call the bulk update endpoint up to 100 times per 5 minutes. After that will Exceeding this limit will make it impossible for you to make further calls to this endpoint for 3, 12 and finally 24 hours. If this limit is exceeded four times you will not be allowed to make calls to this endpoint indefinitely.Best Practices
- Partial Updates: Only include fields that need to be updated - omitted fields will retain their current values.
- Batch Size: Keep batches under 500 products to avoid rate limits.
- Error Handling: Implement retry logic with exponential backoff for rate limit errors.
- Validation: Always include the product and variant IDs to ensure correct updates.
- Idempotency: The operation is not idempotent - sending the same update multiple times will cause issues.
⌘I