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
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
50Was this page helpful?
