curl --request POST \
--url https://live.copilot.fabric.inc/api-product/v1/product/attribute/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-site-context: <x-site-context>' \
--data '
[
{
"action": "UPDATE",
"id": "621c1122ff2e4507c199b75d",
"name": "Weight",
"locales": [
{
"locale": [
"fr-ca",
"es-us"
],
"name": "le poids"
}
],
"description": "Example description.",
"mapping": "title",
"serialStart": 1,
"format": "YYYY-MM-DD",
"formula": "`${item.weightValue} ${item.weightUnit}`",
"validation": {
"required": true,
"inheritable": true,
"inverse": true,
"unique": true,
"exact": "<string>",
"attributeTypes": [
"Serial",
"Integer"
],
"contains": "Demo",
"startWith": 1,
"incrementBy": 1,
"range": {
"min": "<string>",
"max": "<string>"
},
"formula": "value < 10 || value > 20",
"oneOf": [
"<string>"
]
}
}
]
'import requests
url = "https://live.copilot.fabric.inc/api-product/v1/product/attribute/bulk"
payload = [
{
"action": "UPDATE",
"id": "621c1122ff2e4507c199b75d",
"name": "Weight",
"locales": [
{
"locale": ["fr-ca", "es-us"],
"name": "le poids"
}
],
"description": "Example description.",
"mapping": "title",
"serialStart": 1,
"format": "YYYY-MM-DD",
"formula": "`${item.weightValue} ${item.weightUnit}`",
"validation": {
"required": True,
"inheritable": True,
"inverse": True,
"unique": True,
"exact": "<string>",
"attributeTypes": ["Serial", "Integer"],
"contains": "Demo",
"startWith": 1,
"incrementBy": 1,
"range": {
"min": "<string>",
"max": "<string>"
},
"formula": "value < 10 || value > 20",
"oneOf": ["<string>"]
}
}
]
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([
{
action: 'UPDATE',
id: '621c1122ff2e4507c199b75d',
name: 'Weight',
locales: [{locale: ['fr-ca', 'es-us'], name: 'le poids'}],
description: 'Example description.',
mapping: 'title',
serialStart: 1,
format: 'YYYY-MM-DD',
formula: '`${item.weightValue} ${item.weightUnit}`',
validation: {
required: true,
inheritable: true,
inverse: true,
unique: true,
exact: '<string>',
attributeTypes: ['Serial', 'Integer'],
contains: 'Demo',
startWith: 1,
incrementBy: 1,
range: {min: '<string>', max: '<string>'},
formula: 'value < 10 || value > 20',
oneOf: ['<string>']
}
}
])
};
fetch('https://live.copilot.fabric.inc/api-product/v1/product/attribute/bulk', 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/attribute/bulk",
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([
[
'action' => 'UPDATE',
'id' => '621c1122ff2e4507c199b75d',
'name' => 'Weight',
'locales' => [
[
'locale' => [
'fr-ca',
'es-us'
],
'name' => 'le poids'
]
],
'description' => 'Example description.',
'mapping' => 'title',
'serialStart' => 1,
'format' => 'YYYY-MM-DD',
'formula' => '`${item.weightValue} ${item.weightUnit}`',
'validation' => [
'required' => true,
'inheritable' => true,
'inverse' => true,
'unique' => true,
'exact' => '<string>',
'attributeTypes' => [
'Serial',
'Integer'
],
'contains' => 'Demo',
'startWith' => 1,
'incrementBy' => 1,
'range' => [
'min' => '<string>',
'max' => '<string>'
],
'formula' => 'value < 10 || value > 20',
'oneOf' => [
'<string>'
]
]
]
]),
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/attribute/bulk"
payload := strings.NewReader("[\n {\n \"action\": \"UPDATE\",\n \"id\": \"621c1122ff2e4507c199b75d\",\n \"name\": \"Weight\",\n \"locales\": [\n {\n \"locale\": [\n \"fr-ca\",\n \"es-us\"\n ],\n \"name\": \"le poids\"\n }\n ],\n \"description\": \"Example description.\",\n \"mapping\": \"title\",\n \"serialStart\": 1,\n \"format\": \"YYYY-MM-DD\",\n \"formula\": \"`${item.weightValue} ${item.weightUnit}`\",\n \"validation\": {\n \"required\": true,\n \"inheritable\": true,\n \"inverse\": true,\n \"unique\": true,\n \"exact\": \"<string>\",\n \"attributeTypes\": [\n \"Serial\",\n \"Integer\"\n ],\n \"contains\": \"Demo\",\n \"startWith\": 1,\n \"incrementBy\": 1,\n \"range\": {\n \"min\": \"<string>\",\n \"max\": \"<string>\"\n },\n \"formula\": \"value < 10 || value > 20\",\n \"oneOf\": [\n \"<string>\"\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/attribute/bulk")
.header("x-site-context", "<x-site-context>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"action\": \"UPDATE\",\n \"id\": \"621c1122ff2e4507c199b75d\",\n \"name\": \"Weight\",\n \"locales\": [\n {\n \"locale\": [\n \"fr-ca\",\n \"es-us\"\n ],\n \"name\": \"le poids\"\n }\n ],\n \"description\": \"Example description.\",\n \"mapping\": \"title\",\n \"serialStart\": 1,\n \"format\": \"YYYY-MM-DD\",\n \"formula\": \"`${item.weightValue} ${item.weightUnit}`\",\n \"validation\": {\n \"required\": true,\n \"inheritable\": true,\n \"inverse\": true,\n \"unique\": true,\n \"exact\": \"<string>\",\n \"attributeTypes\": [\n \"Serial\",\n \"Integer\"\n ],\n \"contains\": \"Demo\",\n \"startWith\": 1,\n \"incrementBy\": 1,\n \"range\": {\n \"min\": \"<string>\",\n \"max\": \"<string>\"\n },\n \"formula\": \"value < 10 || value > 20\",\n \"oneOf\": [\n \"<string>\"\n ]\n }\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://live.copilot.fabric.inc/api-product/v1/product/attribute/bulk")
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 \"action\": \"UPDATE\",\n \"id\": \"621c1122ff2e4507c199b75d\",\n \"name\": \"Weight\",\n \"locales\": [\n {\n \"locale\": [\n \"fr-ca\",\n \"es-us\"\n ],\n \"name\": \"le poids\"\n }\n ],\n \"description\": \"Example description.\",\n \"mapping\": \"title\",\n \"serialStart\": 1,\n \"format\": \"YYYY-MM-DD\",\n \"formula\": \"`${item.weightValue} ${item.weightUnit}`\",\n \"validation\": {\n \"required\": true,\n \"inheritable\": true,\n \"inverse\": true,\n \"unique\": true,\n \"exact\": \"<string>\",\n \"attributeTypes\": [\n \"Serial\",\n \"Integer\"\n ],\n \"contains\": \"Demo\",\n \"startWith\": 1,\n \"incrementBy\": 1,\n \"range\": {\n \"min\": \"<string>\",\n \"max\": \"<string>\"\n },\n \"formula\": \"value < 10 || value > 20\",\n \"oneOf\": [\n \"<string>\"\n ]\n }\n }\n]"
response = http.request(request)
puts response.read_body{
"attributes": {
"success": [
{
"id": "622932439c73c975335cb654",
"name": "name",
"message": "Attribute created successfully"
}
],
"failed": [
{
"name": "ITEM_ATTRIBUTE_VALUE_IS_INVALID",
"errors": [
[
"Attribute value is invalid",
"Attribute value not found"
]
]
}
]
}
}{
"code": 400,
"message": "Client error"
}{
"code": 500,
"message": "An internal error occurred. If the issue persists please contact support@fabric.inc."
}Create update and delete item attributes
Item attributes allow you to define specific characteristics for items. Common examples of attributes include size, color, and material. Well-defined attributes are important because they enable item discovery and make catalog management easier.
This endpoint creates and updates item attributes to be assigned later.
Note:
1) You can add and manage unlimited attributes for your items. Once they are created, they appear as a selectable option on product pages.
2) In addition, you can assign attributes to items on an individual level or in bulk.
curl --request POST \
--url https://live.copilot.fabric.inc/api-product/v1/product/attribute/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-site-context: <x-site-context>' \
--data '
[
{
"action": "UPDATE",
"id": "621c1122ff2e4507c199b75d",
"name": "Weight",
"locales": [
{
"locale": [
"fr-ca",
"es-us"
],
"name": "le poids"
}
],
"description": "Example description.",
"mapping": "title",
"serialStart": 1,
"format": "YYYY-MM-DD",
"formula": "`${item.weightValue} ${item.weightUnit}`",
"validation": {
"required": true,
"inheritable": true,
"inverse": true,
"unique": true,
"exact": "<string>",
"attributeTypes": [
"Serial",
"Integer"
],
"contains": "Demo",
"startWith": 1,
"incrementBy": 1,
"range": {
"min": "<string>",
"max": "<string>"
},
"formula": "value < 10 || value > 20",
"oneOf": [
"<string>"
]
}
}
]
'import requests
url = "https://live.copilot.fabric.inc/api-product/v1/product/attribute/bulk"
payload = [
{
"action": "UPDATE",
"id": "621c1122ff2e4507c199b75d",
"name": "Weight",
"locales": [
{
"locale": ["fr-ca", "es-us"],
"name": "le poids"
}
],
"description": "Example description.",
"mapping": "title",
"serialStart": 1,
"format": "YYYY-MM-DD",
"formula": "`${item.weightValue} ${item.weightUnit}`",
"validation": {
"required": True,
"inheritable": True,
"inverse": True,
"unique": True,
"exact": "<string>",
"attributeTypes": ["Serial", "Integer"],
"contains": "Demo",
"startWith": 1,
"incrementBy": 1,
"range": {
"min": "<string>",
"max": "<string>"
},
"formula": "value < 10 || value > 20",
"oneOf": ["<string>"]
}
}
]
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([
{
action: 'UPDATE',
id: '621c1122ff2e4507c199b75d',
name: 'Weight',
locales: [{locale: ['fr-ca', 'es-us'], name: 'le poids'}],
description: 'Example description.',
mapping: 'title',
serialStart: 1,
format: 'YYYY-MM-DD',
formula: '`${item.weightValue} ${item.weightUnit}`',
validation: {
required: true,
inheritable: true,
inverse: true,
unique: true,
exact: '<string>',
attributeTypes: ['Serial', 'Integer'],
contains: 'Demo',
startWith: 1,
incrementBy: 1,
range: {min: '<string>', max: '<string>'},
formula: 'value < 10 || value > 20',
oneOf: ['<string>']
}
}
])
};
fetch('https://live.copilot.fabric.inc/api-product/v1/product/attribute/bulk', 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/attribute/bulk",
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([
[
'action' => 'UPDATE',
'id' => '621c1122ff2e4507c199b75d',
'name' => 'Weight',
'locales' => [
[
'locale' => [
'fr-ca',
'es-us'
],
'name' => 'le poids'
]
],
'description' => 'Example description.',
'mapping' => 'title',
'serialStart' => 1,
'format' => 'YYYY-MM-DD',
'formula' => '`${item.weightValue} ${item.weightUnit}`',
'validation' => [
'required' => true,
'inheritable' => true,
'inverse' => true,
'unique' => true,
'exact' => '<string>',
'attributeTypes' => [
'Serial',
'Integer'
],
'contains' => 'Demo',
'startWith' => 1,
'incrementBy' => 1,
'range' => [
'min' => '<string>',
'max' => '<string>'
],
'formula' => 'value < 10 || value > 20',
'oneOf' => [
'<string>'
]
]
]
]),
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/attribute/bulk"
payload := strings.NewReader("[\n {\n \"action\": \"UPDATE\",\n \"id\": \"621c1122ff2e4507c199b75d\",\n \"name\": \"Weight\",\n \"locales\": [\n {\n \"locale\": [\n \"fr-ca\",\n \"es-us\"\n ],\n \"name\": \"le poids\"\n }\n ],\n \"description\": \"Example description.\",\n \"mapping\": \"title\",\n \"serialStart\": 1,\n \"format\": \"YYYY-MM-DD\",\n \"formula\": \"`${item.weightValue} ${item.weightUnit}`\",\n \"validation\": {\n \"required\": true,\n \"inheritable\": true,\n \"inverse\": true,\n \"unique\": true,\n \"exact\": \"<string>\",\n \"attributeTypes\": [\n \"Serial\",\n \"Integer\"\n ],\n \"contains\": \"Demo\",\n \"startWith\": 1,\n \"incrementBy\": 1,\n \"range\": {\n \"min\": \"<string>\",\n \"max\": \"<string>\"\n },\n \"formula\": \"value < 10 || value > 20\",\n \"oneOf\": [\n \"<string>\"\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/attribute/bulk")
.header("x-site-context", "<x-site-context>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"action\": \"UPDATE\",\n \"id\": \"621c1122ff2e4507c199b75d\",\n \"name\": \"Weight\",\n \"locales\": [\n {\n \"locale\": [\n \"fr-ca\",\n \"es-us\"\n ],\n \"name\": \"le poids\"\n }\n ],\n \"description\": \"Example description.\",\n \"mapping\": \"title\",\n \"serialStart\": 1,\n \"format\": \"YYYY-MM-DD\",\n \"formula\": \"`${item.weightValue} ${item.weightUnit}`\",\n \"validation\": {\n \"required\": true,\n \"inheritable\": true,\n \"inverse\": true,\n \"unique\": true,\n \"exact\": \"<string>\",\n \"attributeTypes\": [\n \"Serial\",\n \"Integer\"\n ],\n \"contains\": \"Demo\",\n \"startWith\": 1,\n \"incrementBy\": 1,\n \"range\": {\n \"min\": \"<string>\",\n \"max\": \"<string>\"\n },\n \"formula\": \"value < 10 || value > 20\",\n \"oneOf\": [\n \"<string>\"\n ]\n }\n }\n]")
.asString();require 'uri'
require 'net/http'
url = URI("https://live.copilot.fabric.inc/api-product/v1/product/attribute/bulk")
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 \"action\": \"UPDATE\",\n \"id\": \"621c1122ff2e4507c199b75d\",\n \"name\": \"Weight\",\n \"locales\": [\n {\n \"locale\": [\n \"fr-ca\",\n \"es-us\"\n ],\n \"name\": \"le poids\"\n }\n ],\n \"description\": \"Example description.\",\n \"mapping\": \"title\",\n \"serialStart\": 1,\n \"format\": \"YYYY-MM-DD\",\n \"formula\": \"`${item.weightValue} ${item.weightUnit}`\",\n \"validation\": {\n \"required\": true,\n \"inheritable\": true,\n \"inverse\": true,\n \"unique\": true,\n \"exact\": \"<string>\",\n \"attributeTypes\": [\n \"Serial\",\n \"Integer\"\n ],\n \"contains\": \"Demo\",\n \"startWith\": 1,\n \"incrementBy\": 1,\n \"range\": {\n \"min\": \"<string>\",\n \"max\": \"<string>\"\n },\n \"formula\": \"value < 10 || value > 20\",\n \"oneOf\": [\n \"<string>\"\n ]\n }\n }\n]"
response = http.request(request)
puts response.read_body{
"attributes": {
"success": [
{
"id": "622932439c73c975335cb654",
"name": "name",
"message": "Attribute created successfully"
}
],
"failed": [
{
"name": "ITEM_ATTRIBUTE_VALUE_IS_INVALID",
"errors": [
[
"Attribute value is invalid",
"Attribute value not found"
]
]
}
]
}
}{
"code": 400,
"message": "Client error"
}{
"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
Attribute mapping of item. This corresponds to the Attribute Mapping settings of Product Catalog: sku, title, image, active, isVariant.
Note: Most attributes do not have a mapping, in which case this will be null.
Warning: Exercise caution while adding or removing mappings of attributes, as it could lead to bad data.
"title"
JavaScript expression to dynamically compute the attribute's value. The type returned must match the attribute's type. If the attribute is weight, this formula helps calculate the weight.
Note: When this is provided, validation is ignored.
"${item.weightValue} ${item.weightUnit}"
Was this page helpful?
