curl --request POST \
--url https://live.copilot.fabric.inc/api-product/v1/product/bulk/upsert \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-site-context: <x-site-context>' \
--data '
[
{
"sku": "sku_abc",
"type": "ITEM",
"nodeName": "PRIMARY->electronics",
"parentSku": "sku123",
"attributeValues": [
{
"name": "Mobile",
"value": "AMD X570 mobo"
}
],
"inheritedAttributes": [
{
"name": "color",
"action": "SET"
}
],
"bundleItems": [
{
"sku": "sku123",
"quantity": 6
}
]
}
]
'import requests
url = "https://live.copilot.fabric.inc/api-product/v1/product/bulk/upsert"
payload = [
{
"sku": "sku_abc",
"type": "ITEM",
"nodeName": "PRIMARY->electronics",
"parentSku": "sku123",
"attributeValues": [
{
"name": "Mobile",
"value": "AMD X570 mobo"
}
],
"inheritedAttributes": [
{
"name": "color",
"action": "SET"
}
],
"bundleItems": [
{
"sku": "sku123",
"quantity": 6
}
]
}
]
headers = {
"x-site-context": "<x-site-context>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-site-context': '<x-site-context>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify([
{
sku: 'sku_abc',
type: 'ITEM',
nodeName: 'PRIMARY->electronics',
parentSku: 'sku123',
attributeValues: [{name: 'Mobile', value: 'AMD X570 mobo'}],
inheritedAttributes: [{name: 'color', action: 'SET'}],
bundleItems: [{sku: 'sku123', quantity: 6}]
}
])
};
fetch('https://live.copilot.fabric.inc/api-product/v1/product/bulk/upsert', 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://live.copilot.fabric.inc/api-product/v1/product/bulk/upsert",
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([
[
'sku' => 'sku_abc',
'type' => 'ITEM',
'nodeName' => 'PRIMARY->electronics',
'parentSku' => 'sku123',
'attributeValues' => [
[
'name' => 'Mobile',
'value' => 'AMD X570 mobo'
]
],
'inheritedAttributes' => [
[
'name' => 'color',
'action' => 'SET'
]
],
'bundleItems' => [
[
'sku' => 'sku123',
'quantity' => 6
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"x-site-context: <x-site-context>"
],
]);
$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://live.copilot.fabric.inc/api-product/v1/product/bulk/upsert"
payload := strings.NewReader("[\n {\n \"sku\": \"sku_abc\",\n \"type\": \"ITEM\",\n \"nodeName\": \"PRIMARY->electronics\",\n \"parentSku\": \"sku123\",\n \"attributeValues\": [\n {\n \"name\": \"Mobile\",\n \"value\": \"AMD X570 mobo\"\n }\n ],\n \"inheritedAttributes\": [\n {\n \"name\": \"color\",\n \"action\": \"SET\"\n }\n ],\n \"bundleItems\": [\n {\n \"sku\": \"sku123\",\n \"quantity\": 6\n }\n ]\n }\n]")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-site-context", "<x-site-context>")
req.Header.Add("Authorization", "Bearer <token>")
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://live.copilot.fabric.inc/api-product/v1/product/bulk/upsert")
.header("x-site-context", "<x-site-context>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"sku\": \"sku_abc\",\n \"type\": \"ITEM\",\n \"nodeName\": \"PRIMARY->electronics\",\n \"parentSku\": \"sku123\",\n \"attributeValues\": [\n {\n \"name\": \"Mobile\",\n \"value\": \"AMD X570 mobo\"\n }\n ],\n \"inheritedAttributes\": [\n {\n \"name\": \"color\",\n \"action\": \"SET\"\n }\n ],\n \"bundleItems\": [\n {\n \"sku\": \"sku123\",\n \"quantity\": 6\n }\n ]\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://live.copilot.fabric.inc/api-product/v1/product/bulk/upsert")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-site-context"] = '<x-site-context>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"sku\": \"sku_abc\",\n \"type\": \"ITEM\",\n \"nodeName\": \"PRIMARY->electronics\",\n \"parentSku\": \"sku123\",\n \"attributeValues\": [\n {\n \"name\": \"Mobile\",\n \"value\": \"AMD X570 mobo\"\n }\n ],\n \"inheritedAttributes\": [\n {\n \"name\": \"color\",\n \"action\": \"SET\"\n }\n ],\n \"bundleItems\": [\n {\n \"sku\": \"sku123\",\n \"quantity\": 6\n }\n ]\n }\n]"
response = http.request(request)
puts response.read_body{
"success": [
{
"sku": "sku1",
"itemId": "611686da50fb7e0c5df78c2e",
"itemIdSeq": 12,
"message": "SKU created successfully.",
"errorAttributes": [
{
"name": "Inactive",
"message": "Attribute value is invalid."
}
],
"errorBundles": [
{
"name": "<string>",
"message": "<string>"
}
]
}
],
"failed": [
{
"sku": "sku1",
"message": "Failed because of validation"
}
],
"itemIds": [
"611686da50fb7e0c5df78c2e",
"711686da50fb7e0c5df78c22"
]
}{
"code": 400,
"message": "Client error"
}{
"code": "STATUS_ERROR",
"message": [
{
"index": 123,
"item": {
"success": [
{
"sku": "sku1",
"itemId": "611686da50fb7e0c5df78c2e",
"itemIdSeq": 12,
"message": "SKU created successfully.",
"errorAttributes": [
{
"name": "Inactive",
"message": "Attribute value is invalid."
}
],
"errorBundles": [
{
"name": "<string>",
"message": "<string>"
}
]
}
],
"failed": [
{
"sku": "sku1",
"message": "Failed because of validation"
}
],
"itemIds": [
"611686da50fb7e0c5df78c2e",
"711686da50fb7e0c5df78c22"
]
}
}
]
}{
"code": 500,
"message": "An internal error occurred. If the issue persists please contact support@fabric.inc."
}Upsert items and bundles
With this endpoint, you can create or update items or bundles along with their attributes.
Note:
1) If the SKU already exists, then the given item or bundle is updated. Otherwise, a new item or bundle is created with that SKU.
2) You can add or update up to 50 items or bundles.
3) By specifying the attribute value as NULL, a reserved keyword, you can remove the existing attribute value.
curl --request POST \
--url https://live.copilot.fabric.inc/api-product/v1/product/bulk/upsert \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-site-context: <x-site-context>' \
--data '
[
{
"sku": "sku_abc",
"type": "ITEM",
"nodeName": "PRIMARY->electronics",
"parentSku": "sku123",
"attributeValues": [
{
"name": "Mobile",
"value": "AMD X570 mobo"
}
],
"inheritedAttributes": [
{
"name": "color",
"action": "SET"
}
],
"bundleItems": [
{
"sku": "sku123",
"quantity": 6
}
]
}
]
'import requests
url = "https://live.copilot.fabric.inc/api-product/v1/product/bulk/upsert"
payload = [
{
"sku": "sku_abc",
"type": "ITEM",
"nodeName": "PRIMARY->electronics",
"parentSku": "sku123",
"attributeValues": [
{
"name": "Mobile",
"value": "AMD X570 mobo"
}
],
"inheritedAttributes": [
{
"name": "color",
"action": "SET"
}
],
"bundleItems": [
{
"sku": "sku123",
"quantity": 6
}
]
}
]
headers = {
"x-site-context": "<x-site-context>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-site-context': '<x-site-context>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify([
{
sku: 'sku_abc',
type: 'ITEM',
nodeName: 'PRIMARY->electronics',
parentSku: 'sku123',
attributeValues: [{name: 'Mobile', value: 'AMD X570 mobo'}],
inheritedAttributes: [{name: 'color', action: 'SET'}],
bundleItems: [{sku: 'sku123', quantity: 6}]
}
])
};
fetch('https://live.copilot.fabric.inc/api-product/v1/product/bulk/upsert', 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://live.copilot.fabric.inc/api-product/v1/product/bulk/upsert",
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([
[
'sku' => 'sku_abc',
'type' => 'ITEM',
'nodeName' => 'PRIMARY->electronics',
'parentSku' => 'sku123',
'attributeValues' => [
[
'name' => 'Mobile',
'value' => 'AMD X570 mobo'
]
],
'inheritedAttributes' => [
[
'name' => 'color',
'action' => 'SET'
]
],
'bundleItems' => [
[
'sku' => 'sku123',
'quantity' => 6
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"x-site-context: <x-site-context>"
],
]);
$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://live.copilot.fabric.inc/api-product/v1/product/bulk/upsert"
payload := strings.NewReader("[\n {\n \"sku\": \"sku_abc\",\n \"type\": \"ITEM\",\n \"nodeName\": \"PRIMARY->electronics\",\n \"parentSku\": \"sku123\",\n \"attributeValues\": [\n {\n \"name\": \"Mobile\",\n \"value\": \"AMD X570 mobo\"\n }\n ],\n \"inheritedAttributes\": [\n {\n \"name\": \"color\",\n \"action\": \"SET\"\n }\n ],\n \"bundleItems\": [\n {\n \"sku\": \"sku123\",\n \"quantity\": 6\n }\n ]\n }\n]")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-site-context", "<x-site-context>")
req.Header.Add("Authorization", "Bearer <token>")
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://live.copilot.fabric.inc/api-product/v1/product/bulk/upsert")
.header("x-site-context", "<x-site-context>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"sku\": \"sku_abc\",\n \"type\": \"ITEM\",\n \"nodeName\": \"PRIMARY->electronics\",\n \"parentSku\": \"sku123\",\n \"attributeValues\": [\n {\n \"name\": \"Mobile\",\n \"value\": \"AMD X570 mobo\"\n }\n ],\n \"inheritedAttributes\": [\n {\n \"name\": \"color\",\n \"action\": \"SET\"\n }\n ],\n \"bundleItems\": [\n {\n \"sku\": \"sku123\",\n \"quantity\": 6\n }\n ]\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://live.copilot.fabric.inc/api-product/v1/product/bulk/upsert")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-site-context"] = '<x-site-context>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "[\n {\n \"sku\": \"sku_abc\",\n \"type\": \"ITEM\",\n \"nodeName\": \"PRIMARY->electronics\",\n \"parentSku\": \"sku123\",\n \"attributeValues\": [\n {\n \"name\": \"Mobile\",\n \"value\": \"AMD X570 mobo\"\n }\n ],\n \"inheritedAttributes\": [\n {\n \"name\": \"color\",\n \"action\": \"SET\"\n }\n ],\n \"bundleItems\": [\n {\n \"sku\": \"sku123\",\n \"quantity\": 6\n }\n ]\n }\n]"
response = http.request(request)
puts response.read_body{
"success": [
{
"sku": "sku1",
"itemId": "611686da50fb7e0c5df78c2e",
"itemIdSeq": 12,
"message": "SKU created successfully.",
"errorAttributes": [
{
"name": "Inactive",
"message": "Attribute value is invalid."
}
],
"errorBundles": [
{
"name": "<string>",
"message": "<string>"
}
]
}
],
"failed": [
{
"sku": "sku1",
"message": "Failed because of validation"
}
],
"itemIds": [
"611686da50fb7e0c5df78c2e",
"711686da50fb7e0c5df78c22"
]
}{
"code": 400,
"message": "Client error"
}{
"code": "STATUS_ERROR",
"message": [
{
"index": 123,
"item": {
"success": [
{
"sku": "sku1",
"itemId": "611686da50fb7e0c5df78c2e",
"itemIdSeq": 12,
"message": "SKU created successfully.",
"errorAttributes": [
{
"name": "Inactive",
"message": "Attribute value is invalid."
}
],
"errorBundles": [
{
"name": "<string>",
"message": "<string>"
}
]
}
],
"failed": [
{
"sku": "sku1",
"message": "Failed because of validation"
}
],
"itemIds": [
"611686da50fb7e0c5df78c2e",
"711686da50fb7e0c5df78c22"
]
}
}
]
}{
"code": 500,
"message": "An internal error occurred. If the issue persists please contact support@fabric.inc."
}Authorizations
S2S access token (JWT) from fabric Identity service (during Login)
Headers
The x-site-context header is a JSON object that contains information about the source you wish to pull from. The mandatory account is the 24 character identifier found in Copilot. The channel (Sales channel ID), stage (environment name), and date attributes can be used to further narrow the scope of your data source.
"{\"date\": \"2023-01-01T00:00:00.000Z\", \"channel\": 12, \"account\": \"1234abcd5678efgh9ijklmno\",\"stage\":\"production\"}"
Body
50Stock Keeping Unit (SKU) of item
"sku_abc"
Item type
ITEM, BUNDLE "ITEM"
Category name (along with parent category names) for which item is being created.
"PRIMARY->electronics"
Stock Keeping Unit (SKU) of the parent item.
Set the value as detach or null to disassociate the item from parent item.
"sku123"
Attribute details
- Option 1
- Option 2
Show child attributes
Show child attributes
Category item attributes to be inherited from parent item to children items
Show child attributes
Show child attributes
Items to be added to a bundle. Includes SKU and item quantity.
Show child attributes
Show child attributes
Was this page helpful?
