Products
Products, variants, collections and the product taxonomy. Every example sets SOOQUNA_TOKEN from the environment; see authentication. Responses are from a test store, cut to two items per list.
| Endpoint | Method | Path |
|---|---|---|
| Create a product | POST | /products |
| List products | GET | /products |
| Get a product | GET | /products/{id} |
| List a product’s variants | GET | /products/{id}/variants |
| Update a product | PUT | /products/{id} |
| Duplicate a product | POST | /products/{id}/duplicate |
| Change many products at once | POST | /products/bulk |
| Delete a product | DELETE | /products/{id} |
| Add an image to a product | POST | /products/{id}/media |
| Reorder a product’s media | PUT | /products/{id}/media/order |
| Update an image’s alt text | PATCH | /products/{id}/media/{media_id} |
| Remove an image from a product | DELETE | /products/{id}/media/{media_id} |
| Create a collection | POST | /collections |
| List collections | GET | /collections |
| Get a collection | GET | /collections/{id} |
| Update a collection | PUT | /collections/{id} |
| List a collection’s products | GET | /collections/{id}/products |
| Add products to a manual collection | POST | /collections/{id}/products |
| Reorder a manual collection’s products | PUT | /collections/{id}/products/order |
| Remove products from a manual collection | POST | /collections/{id}/products/remove |
| Delete a collection | DELETE | /collections/{id} |
| Search the product category taxonomy | GET | /taxonomy |
| Get a product category | GET | /taxonomy/{id} |
Create a product
Section titled “Create a product”POST /products · Scope: write_products
curl -X POST "https://api.sooquna.com/admin/api/2026-10/products" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "title": "Embroidered linen abaya", "body_html": "<p>Soft linen, hand-embroidered in Doha.</p>", "status": "active", "vendor": "Layla", "product_type": "Abayas", "tags": ["linen", "summer"], "options": [ { "name": "Size", "values": [{"value": "S"}, {"value": "M"}, {"value": "L"}] } ], "variants": [ { "options": ["S"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-S" }, { "options": ["M"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-M" }, {"options": ["L"], "price": "450.00", "sku": "ABY-LIN-L"} ]}'const res = await fetch("https://api.sooquna.com/admin/api/2026-10/products", { method: "POST", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, "Content-Type": "application/json", }, body: JSON.stringify({ "title": "Embroidered linen abaya", "body_html": "<p>Soft linen, hand-embroidered in Doha.</p>", "status": "active", "vendor": "Layla", "product_type": "Abayas", "tags": ["linen", "summer"], "options": [ { "name": "Size", "values": [{"value": "S"}, {"value": "M"}, {"value": "L"}] } ], "variants": [ { "options": ["S"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-S" }, { "options": ["M"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-M" }, {"options": ["L"], "price": "450.00", "sku": "ABY-LIN-L"} ] }),});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.post( "https://api.sooquna.com/admin/api/2026-10/products", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], }, json={ "title": "Embroidered linen abaya", "body_html": "<p>Soft linen, hand-embroidered in Doha.</p>", "status": "active", "vendor": "Layla", "product_type": "Abayas", "tags": ["linen", "summer"], "options": [ { "name": "Size", "values": [{"value": "S"}, {"value": "M"}, {"value": "L"}], }, ], "variants": [ { "options": ["S"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-S", }, { "options": ["M"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-M", }, {"options": ["L"], "price": "450.00", "sku": "ABY-LIN-L"}, ], },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/products');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), 'Content-Type: application/json', ], CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => json_encode([ 'title' => 'Embroidered linen abaya', 'body_html' => '<p>Soft linen, hand-embroidered in Doha.</p>', 'status' => 'active', 'vendor' => 'Layla', 'product_type' => 'Abayas', 'tags' => ['linen', 'summer'], 'options' => [ [ 'name' => 'Size', 'values' => [['value' => 'S'], ['value' => 'M'], ['value' => 'L']], ], ], 'variants' => [ [ 'options' => ['S'], 'price' => '450.00', 'compare_at_price' => '520.00', 'sku' => 'ABY-LIN-S', ], [ 'options' => ['M'], 'price' => '450.00', 'compare_at_price' => '520.00', 'sku' => 'ABY-LIN-M', ], [ 'options' => ['L'], 'price' => '450.00', 'sku' => 'ABY-LIN-L', ], ], ], JSON_UNESCAPED_UNICODE),]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os" "strings")
func main() { body := `{ "title": "Embroidered linen abaya", "body_html": "<p>Soft linen, hand-embroidered in Doha.</p>", "status": "active", "vendor": "Layla", "product_type": "Abayas", "tags": ["linen", "summer"], "options": [ { "name": "Size", "values": [{"value": "S"}, {"value": "M"}, {"value": "L"}] } ], "variants": [ { "options": ["S"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-S" }, { "options": ["M"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-M" }, {"options": ["L"], "price": "450.00", "sku": "ABY-LIN-L"} ]}` req, err := http.NewRequest("POST", "https://api.sooquna.com/admin/api/2026-10/products", strings.NewReader(body)) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) req.Header.Set("Content-Type", "application/json") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Post, "https://api.sooquna.com/admin/api/2026-10/products");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));req.Content = new StringContent("""{ "title": "Embroidered linen abaya", "body_html": "<p>Soft linen, hand-embroidered in Doha.</p>", "status": "active", "vendor": "Layla", "product_type": "Abayas", "tags": ["linen", "summer"], "options": [ { "name": "Size", "values": [{"value": "S"}, {"value": "M"}, {"value": "L"}] } ], "variants": [ { "options": ["S"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-S" }, { "options": ["M"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-M" }, {"options": ["L"], "price": "450.00", "sku": "ABY-LIN-L"} ]}""", Encoding.UTF8, "application/json");var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Response 201
{ "body_html": "<p>Soft linen, hand-embroidered in Doha.</p>", "category_id": null, "channels": ["online_store"], "collections": [], "created_at": "2026-10-18T09:30:00Z", "currency": "QAR", "gift_card": false, "handle": "embroidered-linen-abaya", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000005", "media": [], "options": [ { "id": "0193a1b2-c3d4-7e5f-8a6b-000000000038", "name": "Size", "position": 1, "values": [{"value": "S"}, {"value": "M"}] } ], "product_type": "Abayas", "publish_at": null, "published": true, "published_at": "2026-10-18T09:30:00Z", "seo_description": "", "seo_title": "", "status": "active", "tags": ["linen", "summer"], "template_suffix": "", "title": "Embroidered linen abaya", "updated_at": "2026-10-18T09:30:00Z", "variants": [ { "barcode": "", "compare_at_price": "520.00", "country_of_origin": null, "hs_code": "", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000019", "image_media_id": null, "inventory_item_id": "0193a1b2-c3d4-7e5f-8a6b-000000000017", "inventory_policy": "deny", "inventory_tracked": true, "options": ["S"], "position": 1, "price": "450.00", "requires_shipping": true, "sku": "ABY-LIN-S", "tax_code": "", "taxable": true, "title": "S", "version": 1, "weight": 0, "weight_grams": 0, "weight_unit": "kg" }, { "barcode": "", "compare_at_price": "520.00", "country_of_origin": null, "hs_code": "", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000014", "image_media_id": null, "inventory_item_id": "0193a1b2-c3d4-7e5f-8a6b-000000000020", "inventory_policy": "deny", "inventory_tracked": true, "options": ["M"], "position": 2, "price": "450.00", "requires_shipping": true, "sku": "ABY-LIN-M", "tax_code": "", "taxable": true, "title": "M", "version": 1, "weight": 0, "weight_grams": 0, "weight_unit": "kg" } ], "vendor": "Layla", "version": 1}List products
Section titled “List products”GET /products · Scope: read_products
| Parameter | In | Description |
|---|---|---|
status |
query | For example active. |
limit |
query | For example 10. |
curl -X GET "https://api.sooquna.com/admin/api/2026-10/products?status=active&limit=10" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN"const res = await fetch("https://api.sooquna.com/admin/api/2026-10/products?status=active&limit=10", { method: "GET", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, },});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.get( "https://api.sooquna.com/admin/api/2026-10/products?status=active&limit=10", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/products?status=active&limit=10');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), ], CURLOPT_RETURNTRANSFER => true,]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os")
func main() { req, err := http.NewRequest("GET", "https://api.sooquna.com/admin/api/2026-10/products?status=active&limit=10", nil) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Get, "https://api.sooquna.com/admin/api/2026-10/products?status=active&limit=10");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Response 200
{ "data": [ { "category": null, "created_at": "2026-10-18T09:30:00Z", "handle": "embroidered-linen-abaya", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000005", "price_max": "450.00", "price_min": "450.00", "product_type": "Abayas", "published": true, "status": "active", "tags": ["linen", "summer"], "title": "Embroidered linen abaya", "total_inventory": 0, "tracked_variants": 3, "updated_at": "2026-10-18T09:30:00Z", "variants_count": 3, "vendor": "Layla" } ], "page_info": {"has_next_page": false}}Get a product
Section titled “Get a product”GET /products/{id} · Scope: read_products
| Parameter | In | Description |
|---|---|---|
id |
path | The resource’s ID. |
curl -X GET "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN"const res = await fetch("https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005", { method: "GET", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, },});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.get( "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), ], CURLOPT_RETURNTRANSFER => true,]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os")
func main() { req, err := http.NewRequest("GET", "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005", nil) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Get, "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Response 200
{ "body_html": "<p>Soft linen, hand-embroidered in Doha.</p>", "category_id": null, "channels": ["online_store"], "collections": [], "created_at": "2026-10-18T09:30:00Z", "currency": "QAR", "gift_card": false, "handle": "embroidered-linen-abaya", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000005", "media": [], "options": [ { "id": "0193a1b2-c3d4-7e5f-8a6b-000000000038", "name": "Size", "position": 1, "values": [{"value": "S"}, {"value": "M"}] } ], "product_type": "Abayas", "publish_at": null, "published": true, "published_at": "2026-10-18T09:30:00Z", "seo_description": "", "seo_title": "", "status": "active", "tags": ["linen", "summer"], "template_suffix": "", "title": "Embroidered linen abaya", "updated_at": "2026-10-18T09:30:00Z", "variants": [ { "barcode": "", "compare_at_price": "520.00", "country_of_origin": null, "hs_code": "", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000019", "image_media_id": null, "inventory_item_id": "0193a1b2-c3d4-7e5f-8a6b-000000000017", "inventory_policy": "deny", "inventory_tracked": true, "options": ["S"], "position": 1, "price": "450.00", "requires_shipping": true, "sku": "ABY-LIN-S", "tax_code": "", "taxable": true, "title": "S", "version": 1, "weight": 0, "weight_grams": 0, "weight_unit": "kg" }, { "barcode": "", "compare_at_price": "520.00", "country_of_origin": null, "hs_code": "", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000014", "image_media_id": null, "inventory_item_id": "0193a1b2-c3d4-7e5f-8a6b-000000000020", "inventory_policy": "deny", "inventory_tracked": true, "options": ["M"], "position": 2, "price": "450.00", "requires_shipping": true, "sku": "ABY-LIN-M", "tax_code": "", "taxable": true, "title": "M", "version": 1, "weight": 0, "weight_grams": 0, "weight_unit": "kg" } ], "vendor": "Layla", "version": 1}List a product’s variants
Section titled “List a product’s variants”GET /products/{id}/variants · Scope: read_products
| Parameter | In | Description |
|---|---|---|
id |
path | The resource’s ID. |
curl -X GET "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/variants" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN"const res = await fetch("https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/variants", { method: "GET", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, },});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.get( "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/variants", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/variants');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), ], CURLOPT_RETURNTRANSFER => true,]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os")
func main() { req, err := http.NewRequest("GET", "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/variants", nil) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Get, "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/variants");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Response 200
{ "data": [ { "barcode": "", "compare_at_price": "520.00", "country_of_origin": null, "hs_code": "", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000019", "image_media_id": null, "inventory_item_id": "0193a1b2-c3d4-7e5f-8a6b-000000000017", "inventory_policy": "deny", "inventory_tracked": true, "options": ["S"], "position": 1, "price": "450.00", "requires_shipping": true, "sku": "ABY-LIN-S", "tax_code": "", "taxable": true, "title": "S", "version": 1, "weight": 0, "weight_grams": 0, "weight_unit": "kg" }, { "barcode": "", "compare_at_price": "520.00", "country_of_origin": null, "hs_code": "", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000014", "image_media_id": null, "inventory_item_id": "0193a1b2-c3d4-7e5f-8a6b-000000000020", "inventory_policy": "deny", "inventory_tracked": true, "options": ["M"], "position": 2, "price": "450.00", "requires_shipping": true, "sku": "ABY-LIN-M", "tax_code": "", "taxable": true, "title": "M", "version": 1, "weight": 0, "weight_grams": 0, "weight_unit": "kg" } ]}Update a product
Section titled “Update a product”PUT /products/{id} · Scope: write_products
Send the whole product with the version you read: variants left out are deleted, and a stale version gets 409.
| Parameter | In | Description |
|---|---|---|
id |
path | The resource’s ID. |
curl -X PUT "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "title": "Embroidered linen abaya", "status": "active", "vendor": "Layla", "product_type": "Abayas", "tags": ["linen", "summer", "eid"], "options": [ { "name": "Size", "values": [{"value": "S"}, {"value": "M"}, {"value": "L"}] } ], "variants": [ { "id": "0193a1b2-c3d4-7e5f-8a6b-000000000019", "options": ["S"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-S" }, { "id": "0193a1b2-c3d4-7e5f-8a6b-000000000014", "options": ["M"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-M" }, { "id": "0193a1b2-e240-7ff9-88bf-e99d692cae3c", "options": ["L"], "price": "450.00", "sku": "ABY-LIN-L" } ], "version": 1}'const res = await fetch("https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005", { method: "PUT", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, "Content-Type": "application/json", }, body: JSON.stringify({ "title": "Embroidered linen abaya", "status": "active", "vendor": "Layla", "product_type": "Abayas", "tags": ["linen", "summer", "eid"], "options": [ { "name": "Size", "values": [{"value": "S"}, {"value": "M"}, {"value": "L"}] } ], "variants": [ { "id": "0193a1b2-c3d4-7e5f-8a6b-000000000019", "options": ["S"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-S" }, { "id": "0193a1b2-c3d4-7e5f-8a6b-000000000014", "options": ["M"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-M" }, { "id": "0193a1b2-e240-7ff9-88bf-e99d692cae3c", "options": ["L"], "price": "450.00", "sku": "ABY-LIN-L" } ], "version": 1 }),});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.put( "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], }, json={ "title": "Embroidered linen abaya", "status": "active", "vendor": "Layla", "product_type": "Abayas", "tags": ["linen", "summer", "eid"], "options": [ { "name": "Size", "values": [{"value": "S"}, {"value": "M"}, {"value": "L"}], }, ], "variants": [ { "id": "0193a1b2-c3d4-7e5f-8a6b-000000000019", "options": ["S"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-S", }, { "id": "0193a1b2-c3d4-7e5f-8a6b-000000000014", "options": ["M"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-M", }, { "id": "0193a1b2-e240-7ff9-88bf-e99d692cae3c", "options": ["L"], "price": "450.00", "sku": "ABY-LIN-L", }, ], "version": 1, },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), 'Content-Type: application/json', ], CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => json_encode([ 'title' => 'Embroidered linen abaya', 'status' => 'active', 'vendor' => 'Layla', 'product_type' => 'Abayas', 'tags' => ['linen', 'summer', 'eid'], 'options' => [ [ 'name' => 'Size', 'values' => [['value' => 'S'], ['value' => 'M'], ['value' => 'L']], ], ], 'variants' => [ [ 'id' => '0193a1b2-c3d4-7e5f-8a6b-000000000019', 'options' => ['S'], 'price' => '450.00', 'compare_at_price' => '520.00', 'sku' => 'ABY-LIN-S', ], [ 'id' => '0193a1b2-c3d4-7e5f-8a6b-000000000014', 'options' => ['M'], 'price' => '450.00', 'compare_at_price' => '520.00', 'sku' => 'ABY-LIN-M', ], [ 'id' => '0193a1b2-e240-7ff9-88bf-e99d692cae3c', 'options' => ['L'], 'price' => '450.00', 'sku' => 'ABY-LIN-L', ], ], 'version' => 1, ], JSON_UNESCAPED_UNICODE),]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os" "strings")
func main() { body := `{ "title": "Embroidered linen abaya", "status": "active", "vendor": "Layla", "product_type": "Abayas", "tags": ["linen", "summer", "eid"], "options": [ { "name": "Size", "values": [{"value": "S"}, {"value": "M"}, {"value": "L"}] } ], "variants": [ { "id": "0193a1b2-c3d4-7e5f-8a6b-000000000019", "options": ["S"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-S" }, { "id": "0193a1b2-c3d4-7e5f-8a6b-000000000014", "options": ["M"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-M" }, { "id": "0193a1b2-e240-7ff9-88bf-e99d692cae3c", "options": ["L"], "price": "450.00", "sku": "ABY-LIN-L" } ], "version": 1}` req, err := http.NewRequest("PUT", "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005", strings.NewReader(body)) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) req.Header.Set("Content-Type", "application/json") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Put, "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));req.Content = new StringContent("""{ "title": "Embroidered linen abaya", "status": "active", "vendor": "Layla", "product_type": "Abayas", "tags": ["linen", "summer", "eid"], "options": [ { "name": "Size", "values": [{"value": "S"}, {"value": "M"}, {"value": "L"}] } ], "variants": [ { "id": "0193a1b2-c3d4-7e5f-8a6b-000000000019", "options": ["S"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-S" }, { "id": "0193a1b2-c3d4-7e5f-8a6b-000000000014", "options": ["M"], "price": "450.00", "compare_at_price": "520.00", "sku": "ABY-LIN-M" }, { "id": "0193a1b2-e240-7ff9-88bf-e99d692cae3c", "options": ["L"], "price": "450.00", "sku": "ABY-LIN-L" } ], "version": 1}""", Encoding.UTF8, "application/json");var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Response 200
{ "body_html": "", "category_id": null, "channels": ["online_store"], "collections": [], "created_at": "2026-10-18T09:30:00Z", "currency": "QAR", "gift_card": false, "handle": "embroidered-linen-abaya", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000005", "media": [], "options": [ { "id": "0193a1b2-c3d4-7e5f-8a6b-000000000065", "name": "Size", "position": 1, "values": [{"value": "S"}, {"value": "M"}] } ], "product_type": "Abayas", "publish_at": null, "published": true, "published_at": "2026-10-18T09:30:00Z", "seo_description": "", "seo_title": "", "status": "active", "tags": ["eid", "linen"], "template_suffix": "", "title": "Embroidered linen abaya", "updated_at": "2026-10-18T09:30:00Z", "variants": [ { "barcode": "", "compare_at_price": "520.00", "country_of_origin": null, "hs_code": "", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000019", "image_media_id": null, "inventory_item_id": "0193a1b2-c3d4-7e5f-8a6b-000000000017", "inventory_policy": "deny", "inventory_tracked": true, "options": ["S"], "position": 1, "price": "450.00", "requires_shipping": true, "sku": "ABY-LIN-S", "tax_code": "", "taxable": true, "title": "S", "version": 2, "weight": 0, "weight_grams": 0, "weight_unit": "kg" }, { "barcode": "", "compare_at_price": "520.00", "country_of_origin": null, "hs_code": "", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000014", "image_media_id": null, "inventory_item_id": "0193a1b2-c3d4-7e5f-8a6b-000000000020", "inventory_policy": "deny", "inventory_tracked": true, "options": ["M"], "position": 2, "price": "450.00", "requires_shipping": true, "sku": "ABY-LIN-M", "tax_code": "", "taxable": true, "title": "M", "version": 2, "weight": 0, "weight_grams": 0, "weight_unit": "kg" } ], "vendor": "Layla", "version": 2}Duplicate a product
Section titled “Duplicate a product”POST /products/{id}/duplicate · Scope: write_products
| Parameter | In | Description |
|---|---|---|
id |
path | The resource’s ID. |
curl -X POST "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/duplicate" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "title": "Embroidered linen abaya (black)", "include_media": true, "status": "draft"}'const res = await fetch("https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/duplicate", { method: "POST", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, "Content-Type": "application/json", }, body: JSON.stringify({ "title": "Embroidered linen abaya (black)", "include_media": true, "status": "draft" }),});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.post( "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/duplicate", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], }, json={ "title": "Embroidered linen abaya (black)", "include_media": True, "status": "draft", },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/duplicate');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), 'Content-Type: application/json', ], CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => json_encode([ 'title' => 'Embroidered linen abaya (black)', 'include_media' => true, 'status' => 'draft', ], JSON_UNESCAPED_UNICODE),]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os" "strings")
func main() { body := `{ "title": "Embroidered linen abaya (black)", "include_media": true, "status": "draft"}` req, err := http.NewRequest("POST", "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/duplicate", strings.NewReader(body)) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) req.Header.Set("Content-Type", "application/json") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Post, "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/duplicate");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));req.Content = new StringContent("""{ "title": "Embroidered linen abaya (black)", "include_media": true, "status": "draft"}""", Encoding.UTF8, "application/json");var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Response 201
{ "body_html": "", "category_id": null, "channels": [], "collections": [], "created_at": "2026-10-18T09:30:00Z", "currency": "QAR", "gift_card": false, "handle": "embroidered-linen-abaya-black", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000057", "media": [], "options": [ { "id": "0193a1b2-c3d4-7e5f-8a6b-000000000058", "name": "Size", "position": 1, "values": [{"value": "S"}, {"value": "M"}] } ], "product_type": "Abayas", "publish_at": null, "published": false, "published_at": null, "seo_description": "", "seo_title": "", "status": "draft", "tags": ["eid", "linen"], "template_suffix": "", "title": "Embroidered linen abaya (black)", "updated_at": "2026-10-18T09:30:00Z", "variants": [ { "barcode": "", "compare_at_price": "520.00", "country_of_origin": null, "hs_code": "", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000059", "image_media_id": null, "inventory_item_id": "0193a1b2-c3d4-7e5f-8a6b-000000000060", "inventory_policy": "deny", "inventory_tracked": true, "options": ["S"], "position": 1, "price": "450.00", "requires_shipping": true, "sku": "ABY-LIN-S", "tax_code": "", "taxable": true, "title": "S", "version": 1, "weight": 0, "weight_grams": 0, "weight_unit": "kg" }, { "barcode": "", "compare_at_price": "520.00", "country_of_origin": null, "hs_code": "", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000061", "image_media_id": null, "inventory_item_id": "0193a1b2-c3d4-7e5f-8a6b-000000000062", "inventory_policy": "deny", "inventory_tracked": true, "options": ["M"], "position": 2, "price": "450.00", "requires_shipping": true, "sku": "ABY-LIN-M", "tax_code": "", "taxable": true, "title": "M", "version": 1, "weight": 0, "weight_grams": 0, "weight_unit": "kg" } ], "vendor": "Layla", "version": 1}Change many products at once
Section titled “Change many products at once”POST /products/bulk · Scope: write_products
Actions: add_tags, remove_tags, set_status, publish, unpublish, add_to_collections, remove_from_collections, delete.
curl -X POST "https://api.sooquna.com/admin/api/2026-10/products/bulk" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "action": "add_tags", "ids": [ "0193a1b2-c3d4-7e5f-8a6b-000000000005", "0193a1b2-c3d4-7e5f-8a6b-000000000057" ], "tags": ["eid-edit"]}'const res = await fetch("https://api.sooquna.com/admin/api/2026-10/products/bulk", { method: "POST", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, "Content-Type": "application/json", }, body: JSON.stringify({ "action": "add_tags", "ids": [ "0193a1b2-c3d4-7e5f-8a6b-000000000005", "0193a1b2-c3d4-7e5f-8a6b-000000000057" ], "tags": ["eid-edit"] }),});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.post( "https://api.sooquna.com/admin/api/2026-10/products/bulk", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], }, json={ "action": "add_tags", "ids": [ "0193a1b2-c3d4-7e5f-8a6b-000000000005", "0193a1b2-c3d4-7e5f-8a6b-000000000057", ], "tags": ["eid-edit"], },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/products/bulk');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), 'Content-Type: application/json', ], CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => json_encode([ 'action' => 'add_tags', 'ids' => [ '0193a1b2-c3d4-7e5f-8a6b-000000000005', '0193a1b2-c3d4-7e5f-8a6b-000000000057', ], 'tags' => ['eid-edit'], ], JSON_UNESCAPED_UNICODE),]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os" "strings")
func main() { body := `{ "action": "add_tags", "ids": [ "0193a1b2-c3d4-7e5f-8a6b-000000000005", "0193a1b2-c3d4-7e5f-8a6b-000000000057" ], "tags": ["eid-edit"]}` req, err := http.NewRequest("POST", "https://api.sooquna.com/admin/api/2026-10/products/bulk", strings.NewReader(body)) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) req.Header.Set("Content-Type", "application/json") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Post, "https://api.sooquna.com/admin/api/2026-10/products/bulk");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));req.Content = new StringContent("""{ "action": "add_tags", "ids": [ "0193a1b2-c3d4-7e5f-8a6b-000000000005", "0193a1b2-c3d4-7e5f-8a6b-000000000057" ], "tags": ["eid-edit"]}""", Encoding.UTF8, "application/json");var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Response 200
{"updated": 2}Delete a product
Section titled “Delete a product”DELETE /products/{id} · Scope: write_products
| Parameter | In | Description |
|---|---|---|
id |
path | The resource’s ID. |
curl -X DELETE "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000057" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN"const res = await fetch("https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000057", { method: "DELETE", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, },});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.delete( "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000057", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000057');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'DELETE', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), ], CURLOPT_RETURNTRANSFER => true,]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os")
func main() { req, err := http.NewRequest("DELETE", "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000057", nil) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Delete, "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000057");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Response 204
{}Add an image to a product
Section titled “Add an image to a product”POST /products/{id}/media · Scope: write_products
Pass an uploaded file’s asset_id (see Files) or an external_url to import.
| Parameter | In | Description |
|---|---|---|
id |
path | The resource’s ID. |
curl -X POST "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "external_url": "https://cdn.example.com/abaya-front.jpg", "alt": "Embroidered linen abaya", "front": null}'const res = await fetch("https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media", { method: "POST", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, "Content-Type": "application/json", }, body: JSON.stringify({ "external_url": "https://cdn.example.com/abaya-front.jpg", "alt": "Embroidered linen abaya", "front": null }),});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.post( "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], }, json={ "external_url": "https://cdn.example.com/abaya-front.jpg", "alt": "Embroidered linen abaya", "front": None, },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), 'Content-Type: application/json', ], CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => json_encode([ 'external_url' => 'https://cdn.example.com/abaya-front.jpg', 'alt' => 'Embroidered linen abaya', 'front' => null, ], JSON_UNESCAPED_UNICODE),]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os" "strings")
func main() { body := `{ "external_url": "https://cdn.example.com/abaya-front.jpg", "alt": "Embroidered linen abaya", "front": null}` req, err := http.NewRequest("POST", "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media", strings.NewReader(body)) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) req.Header.Set("Content-Type", "application/json") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Post, "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));req.Content = new StringContent("""{ "external_url": "https://cdn.example.com/abaya-front.jpg", "alt": "Embroidered linen abaya", "front": null}""", Encoding.UTF8, "application/json");var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Reorder a product’s media
Section titled “Reorder a product’s media”PUT /products/{id}/media/order · Scope: write_products
| Parameter | In | Description |
|---|---|---|
id |
path | The resource’s ID. |
curl -X PUT "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media/order" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "ids": [ "0193a1b2-0000-7000-8000-00000000a001", "0193a1b2-0000-7000-8000-00000000a002" ]}'const res = await fetch("https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media/order", { method: "PUT", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, "Content-Type": "application/json", }, body: JSON.stringify({ "ids": [ "0193a1b2-0000-7000-8000-00000000a001", "0193a1b2-0000-7000-8000-00000000a002" ] }),});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.put( "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media/order", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], }, json={ "ids": [ "0193a1b2-0000-7000-8000-00000000a001", "0193a1b2-0000-7000-8000-00000000a002", ], },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media/order');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), 'Content-Type: application/json', ], CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => json_encode([ 'ids' => [ '0193a1b2-0000-7000-8000-00000000a001', '0193a1b2-0000-7000-8000-00000000a002', ], ], JSON_UNESCAPED_UNICODE),]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os" "strings")
func main() { body := `{ "ids": [ "0193a1b2-0000-7000-8000-00000000a001", "0193a1b2-0000-7000-8000-00000000a002" ]}` req, err := http.NewRequest("PUT", "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media/order", strings.NewReader(body)) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) req.Header.Set("Content-Type", "application/json") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Put, "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media/order");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));req.Content = new StringContent("""{ "ids": [ "0193a1b2-0000-7000-8000-00000000a001", "0193a1b2-0000-7000-8000-00000000a002" ]}""", Encoding.UTF8, "application/json");var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Update an image’s alt text
Section titled “Update an image’s alt text”PATCH /products/{id}/media/{media_id} · Scope: write_products
| Parameter | In | Description |
|---|---|---|
id |
path | The resource’s ID. |
media_id |
path | The media ID. |
curl -X PATCH "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media/0193a1b2-3af9-7339-89df-609243f7e660" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN" \ -H "Content-Type: application/json" \ -d '{"alt": "Embroidered linen abaya", "back": null}'const res = await fetch("https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media/0193a1b2-3af9-7339-89df-609243f7e660", { method: "PATCH", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, "Content-Type": "application/json", }, body: JSON.stringify({"alt": "Embroidered linen abaya", "back": null}),});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.patch( "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media/0193a1b2-3af9-7339-89df-609243f7e660", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], }, json={"alt": "Embroidered linen abaya", "back": None},)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media/0193a1b2-3af9-7339-89df-609243f7e660');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'PATCH', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), 'Content-Type: application/json', ], CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => json_encode(['alt' => 'Embroidered linen abaya', 'back' => null], JSON_UNESCAPED_UNICODE),]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os" "strings")
func main() { body := `{"alt": "Embroidered linen abaya", "back": null}` req, err := http.NewRequest("PATCH", "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media/0193a1b2-3af9-7339-89df-609243f7e660", strings.NewReader(body)) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) req.Header.Set("Content-Type", "application/json") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Patch, "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media/0193a1b2-3af9-7339-89df-609243f7e660");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));req.Content = new StringContent("""{"alt": "Embroidered linen abaya", "back": null}""", Encoding.UTF8, "application/json");var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Remove an image from a product
Section titled “Remove an image from a product”DELETE /products/{id}/media/{media_id} · Scope: write_products
| Parameter | In | Description |
|---|---|---|
id |
path | The resource’s ID. |
media_id |
path | The media ID. |
curl -X DELETE "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media/0193a1b2-3af9-7339-89df-609243f7e660" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN"const res = await fetch("https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media/0193a1b2-3af9-7339-89df-609243f7e660", { method: "DELETE", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, },});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.delete( "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media/0193a1b2-3af9-7339-89df-609243f7e660", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media/0193a1b2-3af9-7339-89df-609243f7e660');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'DELETE', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), ], CURLOPT_RETURNTRANSFER => true,]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os")
func main() { req, err := http.NewRequest("DELETE", "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media/0193a1b2-3af9-7339-89df-609243f7e660", nil) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Delete, "https://api.sooquna.com/admin/api/2026-10/products/0193a1b2-c3d4-7e5f-8a6b-000000000005/media/0193a1b2-3af9-7339-89df-609243f7e660");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Create a collection
Section titled “Create a collection”POST /collections · Scope: write_products
kind manual takes product_ids; kind smart takes rules (column, relation, condition).
curl -X POST "https://api.sooquna.com/admin/api/2026-10/collections" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "kind": "manual", "title": "Eid edit", "body_html": "<p>Pieces for Eid gatherings.</p>", "published": true, "product_ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"]}'const res = await fetch("https://api.sooquna.com/admin/api/2026-10/collections", { method: "POST", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, "Content-Type": "application/json", }, body: JSON.stringify({ "kind": "manual", "title": "Eid edit", "body_html": "<p>Pieces for Eid gatherings.</p>", "published": true, "product_ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"] }),});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.post( "https://api.sooquna.com/admin/api/2026-10/collections", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], }, json={ "kind": "manual", "title": "Eid edit", "body_html": "<p>Pieces for Eid gatherings.</p>", "published": True, "product_ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"], },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/collections');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), 'Content-Type: application/json', ], CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => json_encode([ 'kind' => 'manual', 'title' => 'Eid edit', 'body_html' => '<p>Pieces for Eid gatherings.</p>', 'published' => true, 'product_ids' => ['0193a1b2-c3d4-7e5f-8a6b-000000000005'], ], JSON_UNESCAPED_UNICODE),]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os" "strings")
func main() { body := `{ "kind": "manual", "title": "Eid edit", "body_html": "<p>Pieces for Eid gatherings.</p>", "published": true, "product_ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"]}` req, err := http.NewRequest("POST", "https://api.sooquna.com/admin/api/2026-10/collections", strings.NewReader(body)) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) req.Header.Set("Content-Type", "application/json") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Post, "https://api.sooquna.com/admin/api/2026-10/collections");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));req.Content = new StringContent("""{ "kind": "manual", "title": "Eid edit", "body_html": "<p>Pieces for Eid gatherings.</p>", "published": true, "product_ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"]}""", Encoding.UTF8, "application/json");var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Response 201
{ "body_html": "<p>Pieces for Eid gatherings.</p>", "disjunctive": false, "handle": "eid-edit", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000004", "image_asset_id": null, "kind": "manual", "products_count": 1, "published": true, "published_at": "2026-10-18T09:30:00Z", "rules": [], "seo_description": "", "seo_title": "", "sort_order": "manual", "template_suffix": "", "title": "Eid edit", "updated_at": "2026-10-18T09:30:00Z", "version": 1}List collections
Section titled “List collections”GET /collections · Scope: read_products
| Parameter | In | Description |
|---|---|---|
limit |
query | For example 10. |
curl -X GET "https://api.sooquna.com/admin/api/2026-10/collections?limit=10" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN"const res = await fetch("https://api.sooquna.com/admin/api/2026-10/collections?limit=10", { method: "GET", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, },});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.get( "https://api.sooquna.com/admin/api/2026-10/collections?limit=10", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/collections?limit=10');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), ], CURLOPT_RETURNTRANSFER => true,]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os")
func main() { req, err := http.NewRequest("GET", "https://api.sooquna.com/admin/api/2026-10/collections?limit=10", nil) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Get, "https://api.sooquna.com/admin/api/2026-10/collections?limit=10");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Response 200
{ "data": [ { "body_html": "<p>Pieces for Eid gatherings.</p>", "disjunctive": false, "handle": "eid-edit", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000004", "image_asset_id": null, "kind": "manual", "products_count": 1, "published": true, "published_at": "2026-10-18T09:30:00Z", "rules": [], "seo_description": "", "seo_title": "", "sort_order": "manual", "template_suffix": "", "title": "Eid edit", "updated_at": "2026-10-18T09:30:00Z", "version": 1 } ], "page_info": {"has_next_page": false}}Get a collection
Section titled “Get a collection”GET /collections/{id} · Scope: read_products
| Parameter | In | Description |
|---|---|---|
id |
path | The resource’s ID. |
curl -X GET "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN"const res = await fetch("https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004", { method: "GET", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, },});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.get( "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), ], CURLOPT_RETURNTRANSFER => true,]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os")
func main() { req, err := http.NewRequest("GET", "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004", nil) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Get, "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Response 200
{ "body_html": "<p>Pieces for Eid gatherings.</p>", "disjunctive": false, "handle": "eid-edit", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000004", "image_asset_id": null, "kind": "manual", "products_count": 1, "published": true, "published_at": "2026-10-18T09:30:00Z", "rules": [], "seo_description": "", "seo_title": "", "sort_order": "manual", "template_suffix": "", "title": "Eid edit", "updated_at": "2026-10-18T09:30:00Z", "version": 1}Update a collection
Section titled “Update a collection”PUT /collections/{id} · Scope: write_products
| Parameter | In | Description |
|---|---|---|
id |
path | The resource’s ID. |
curl -X PUT "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "kind": "manual", "title": "Eid edit", "sort_order": "price_asc", "version": 1}'const res = await fetch("https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004", { method: "PUT", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, "Content-Type": "application/json", }, body: JSON.stringify({ "kind": "manual", "title": "Eid edit", "sort_order": "price_asc", "version": 1 }),});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.put( "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], }, json={ "kind": "manual", "title": "Eid edit", "sort_order": "price_asc", "version": 1, },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), 'Content-Type: application/json', ], CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => json_encode([ 'kind' => 'manual', 'title' => 'Eid edit', 'sort_order' => 'price_asc', 'version' => 1, ], JSON_UNESCAPED_UNICODE),]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os" "strings")
func main() { body := `{ "kind": "manual", "title": "Eid edit", "sort_order": "price_asc", "version": 1}` req, err := http.NewRequest("PUT", "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004", strings.NewReader(body)) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) req.Header.Set("Content-Type", "application/json") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Put, "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));req.Content = new StringContent("""{ "kind": "manual", "title": "Eid edit", "sort_order": "price_asc", "version": 1}""", Encoding.UTF8, "application/json");var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Response 200
{ "body_html": "", "disjunctive": false, "handle": "eid-edit", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000004", "image_asset_id": null, "kind": "manual", "products_count": 1, "published": true, "published_at": "2026-10-18T09:30:00Z", "rules": [], "seo_description": "", "seo_title": "", "sort_order": "price_asc", "template_suffix": "", "title": "Eid edit", "updated_at": "2026-10-18T09:30:00Z", "version": 2}List a collection’s products
Section titled “List a collection’s products”GET /collections/{id}/products · Scope: read_products
| Parameter | In | Description |
|---|---|---|
id |
path | The resource’s ID. |
limit |
query | For example 24. |
curl -X GET "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products?limit=24" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN"const res = await fetch("https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products?limit=24", { method: "GET", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, },});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.get( "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products?limit=24", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products?limit=24');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), ], CURLOPT_RETURNTRANSFER => true,]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os")
func main() { req, err := http.NewRequest("GET", "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products?limit=24", nil) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Get, "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products?limit=24");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Response 200
{ "data": [ { "handle": "embroidered-linen-abaya", "id": "0193a1b2-c3d4-7e5f-8a6b-000000000005", "position": 1, "status": "active", "title": "Embroidered linen abaya" } ], "has_more": false}Add products to a manual collection
Section titled “Add products to a manual collection”POST /collections/{id}/products · Scope: write_products
| Parameter | In | Description |
|---|---|---|
id |
path | The resource’s ID. |
curl -X POST "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN" \ -H "Content-Type: application/json" \ -d '{"ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"]}'const res = await fetch("https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products", { method: "POST", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, "Content-Type": "application/json", }, body: JSON.stringify({"ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"]}),});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.post( "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], }, json={"ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"]},)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), 'Content-Type: application/json', ], CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => json_encode(['ids' => ['0193a1b2-c3d4-7e5f-8a6b-000000000005']], JSON_UNESCAPED_UNICODE),]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os" "strings")
func main() { body := `{"ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"]}` req, err := http.NewRequest("POST", "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products", strings.NewReader(body)) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) req.Header.Set("Content-Type", "application/json") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Post, "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));req.Content = new StringContent("""{"ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"]}""", Encoding.UTF8, "application/json");var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Response 204
{}Reorder a manual collection’s products
Section titled “Reorder a manual collection’s products”PUT /collections/{id}/products/order · Scope: write_products
| Parameter | In | Description |
|---|---|---|
id |
path | The resource’s ID. |
curl -X PUT "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products/order" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN" \ -H "Content-Type: application/json" \ -d '{"ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"]}'const res = await fetch("https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products/order", { method: "PUT", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, "Content-Type": "application/json", }, body: JSON.stringify({"ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"]}),});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.put( "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products/order", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], }, json={"ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"]},)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products/order');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), 'Content-Type: application/json', ], CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => json_encode(['ids' => ['0193a1b2-c3d4-7e5f-8a6b-000000000005']], JSON_UNESCAPED_UNICODE),]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os" "strings")
func main() { body := `{"ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"]}` req, err := http.NewRequest("PUT", "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products/order", strings.NewReader(body)) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) req.Header.Set("Content-Type", "application/json") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Put, "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products/order");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));req.Content = new StringContent("""{"ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"]}""", Encoding.UTF8, "application/json");var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Response 204
{}Remove products from a manual collection
Section titled “Remove products from a manual collection”POST /collections/{id}/products/remove · Scope: write_products
| Parameter | In | Description |
|---|---|---|
id |
path | The resource’s ID. |
curl -X POST "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products/remove" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN" \ -H "Content-Type: application/json" \ -d '{"ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"]}'const res = await fetch("https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products/remove", { method: "POST", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, "Content-Type": "application/json", }, body: JSON.stringify({"ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"]}),});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.post( "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products/remove", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], }, json={"ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"]},)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products/remove');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), 'Content-Type: application/json', ], CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => json_encode(['ids' => ['0193a1b2-c3d4-7e5f-8a6b-000000000005']], JSON_UNESCAPED_UNICODE),]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os" "strings")
func main() { body := `{"ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"]}` req, err := http.NewRequest("POST", "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products/remove", strings.NewReader(body)) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) req.Header.Set("Content-Type", "application/json") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Post, "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004/products/remove");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));req.Content = new StringContent("""{"ids": ["0193a1b2-c3d4-7e5f-8a6b-000000000005"]}""", Encoding.UTF8, "application/json");var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Response 204
{}Delete a collection
Section titled “Delete a collection”DELETE /collections/{id} · Scope: write_products
| Parameter | In | Description |
|---|---|---|
id |
path | The resource’s ID. |
curl -X DELETE "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN"const res = await fetch("https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004", { method: "DELETE", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, },});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.delete( "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'DELETE', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), ], CURLOPT_RETURNTRANSFER => true,]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os")
func main() { req, err := http.NewRequest("DELETE", "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004", nil) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Delete, "https://api.sooquna.com/admin/api/2026-10/collections/0193a1b2-c3d4-7e5f-8a6b-000000000004");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Response 204
{}Search the product category taxonomy
Section titled “Search the product category taxonomy”GET /taxonomy · Scope: read_products
| Parameter | In | Description |
|---|---|---|
q |
query | For example abaya. |
locale |
query | For example en. |
curl -X GET "https://api.sooquna.com/admin/api/2026-10/taxonomy?q=abaya&locale=en" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN"const res = await fetch("https://api.sooquna.com/admin/api/2026-10/taxonomy?q=abaya&locale=en", { method: "GET", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, },});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.get( "https://api.sooquna.com/admin/api/2026-10/taxonomy?q=abaya&locale=en", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/taxonomy?q=abaya&locale=en');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), ], CURLOPT_RETURNTRANSFER => true,]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os")
func main() { req, err := http.NewRequest("GET", "https://api.sooquna.com/admin/api/2026-10/taxonomy?q=abaya&locale=en", nil) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Get, "https://api.sooquna.com/admin/api/2026-10/taxonomy?q=abaya&locale=en");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Response 200
{"data": []}Get a product category
Section titled “Get a product category”GET /taxonomy/{id} · Scope: read_products
| Parameter | In | Description |
|---|---|---|
id |
path | The resource’s ID. |
locale |
query | For example ar. |
curl -X GET "https://api.sooquna.com/admin/api/2026-10/taxonomy/0193a1b2-4af1-78d7-87af-bf6bbb10bd5a?locale=ar" \ -H "X-Sooquna-Access-Token: $SOOQUNA_TOKEN"const res = await fetch("https://api.sooquna.com/admin/api/2026-10/taxonomy/0193a1b2-4af1-78d7-87af-bf6bbb10bd5a?locale=ar", { method: "GET", headers: { "X-Sooquna-Access-Token": process.env.SOOQUNA_TOKEN, },});if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);const data = await res.json();console.log(data);import osimport requests
res = requests.get( "https://api.sooquna.com/admin/api/2026-10/taxonomy/0193a1b2-4af1-78d7-87af-bf6bbb10bd5a?locale=ar", headers={ "X-Sooquna-Access-Token": os.environ["SOOQUNA_TOKEN"], },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://api.sooquna.com/admin/api/2026-10/taxonomy/0193a1b2-4af1-78d7-87af-bf6bbb10bd5a?locale=ar');curl_setopt_array($ch, [ CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => [ 'X-Sooquna-Access-Token: ' . getenv('SOOQUNA_TOKEN'), ], CURLOPT_RETURNTRANSFER => true,]);$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);if ($status >= 300) { throw new RuntimeException("$status: $response");}$data = json_decode($response, true);print_r($data);package main
import ( "fmt" "io" "net/http" "os")
func main() { req, err := http.NewRequest("GET", "https://api.sooquna.com/admin/api/2026-10/taxonomy/0193a1b2-4af1-78d7-87af-bf6bbb10bd5a?locale=ar", nil) if err != nil { panic(err) } req.Header.Set("X-Sooquna-Access-Token", os.Getenv("SOOQUNA_TOKEN")) res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() if res.StatusCode >= 300 { data, _ := io.ReadAll(res.Body) panic(fmt.Sprintf("%d: %s", res.StatusCode, data)) } data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();var req = new HttpRequestMessage(HttpMethod.Get, "https://api.sooquna.com/admin/api/2026-10/taxonomy/0193a1b2-4af1-78d7-87af-bf6bbb10bd5a?locale=ar");req.Headers.Add("X-Sooquna-Access-Token", Environment.GetEnvironmentVariable("SOOQUNA_TOKEN"));var res = await client.SendAsync(req);if (!res.IsSuccessStatusCode) throw new Exception($"{(int)res.StatusCode}: {await res.Content.ReadAsStringAsync()}");Console.WriteLine(await res.Content.ReadAsStringAsync());Was this page helpful?

