curl --request POST \
--url https://live.copilot.fabric.inc/api-category/v1/category/attribute/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-site-context: <x-site-context>' \
--data '
[
{
"action": "UPDATE",
"name": "weight",
"type": "INTEGER",
"id": "61ba11691a29d52cb2842541",
"description": "Item weight, in KG",
"textSubType": "HTML",
"serialStart": 1000,
"optionsType": "DATETIME",
"format": "YYYY-MM-DD",
"formula": "`${item.weightValue} ${item.weightUnit}`",
"validation": {
"required": true,
"inheritable": true,
"inverse": true,
"unique": true,
"exact": "<string>",
"attributeTypes": [
"Serial",
"Integer"
],
"contains": "<string>",
"range": {
"min": "<string>",
"max": "<string>"
},
"formula": "value < 10 || value > 20",
"oneOf": [
"<string>"
]
}
}
]
'import requests
url = "https://live.copilot.fabric.inc/api-category/v1/category/attribute/bulk"
payload = [
{
"action": "UPDATE",
"name": "weight",
"type": "INTEGER",
"id": "61ba11691a29d52cb2842541",
"description": "Item weight, in KG",
"textSubType": "HTML",
"serialStart": 1000,
"optionsType": "DATETIME",
"format": "YYYY-MM-DD",
"formula": "`${item.weightValue} ${item.weightUnit}`",
"validation": {
"required": True,
"inheritable": True,
"inverse": True,
"unique": True,
"exact": "<string>",
"attributeTypes": ["Serial", "Integer"],
"contains": "<string>",
"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',
name: 'weight',
type: 'INTEGER',
id: '61ba11691a29d52cb2842541',
description: 'Item weight, in KG',
textSubType: 'HTML',
serialStart: 1000,
optionsType: 'DATETIME',
format: 'YYYY-MM-DD',
formula: '`${item.weightValue} ${item.weightUnit}`',
validation: {
required: true,
inheritable: true,
inverse: true,
unique: true,
exact: '<string>',
attributeTypes: ['Serial', 'Integer'],
contains: '<string>',
range: {min: '<string>', max: '<string>'},
formula: 'value < 10 || value > 20',
oneOf: ['<string>']
}
}
])
};
fetch('https://live.copilot.fabric.inc/api-category/v1/category/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-category/v1/category/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',
'name' => 'weight',
'type' => 'INTEGER',
'id' => '61ba11691a29d52cb2842541',
'description' => 'Item weight, in KG',
'textSubType' => 'HTML',
'serialStart' => 1000,
'optionsType' => 'DATETIME',
'format' => 'YYYY-MM-DD',
'formula' => '`${item.weightValue} ${item.weightUnit}`',
'validation' => [
'required' => true,
'inheritable' => true,
'inverse' => true,
'unique' => true,
'exact' => '<string>',
'attributeTypes' => [
'Serial',
'Integer'
],
'contains' => '<string>',
'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-category/v1/category/attribute/bulk"
payload := strings.NewReader("[\n {\n \"action\": \"UPDATE\",\n \"name\": \"weight\",\n \"type\": \"INTEGER\",\n \"id\": \"61ba11691a29d52cb2842541\",\n \"description\": \"Item weight, in KG\",\n \"textSubType\": \"HTML\",\n \"serialStart\": 1000,\n \"optionsType\": \"DATETIME\",\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\": \"<string>\",\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-category/v1/category/attribute/bulk")
.header("x-site-context", "<x-site-context>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"action\": \"UPDATE\",\n \"name\": \"weight\",\n \"type\": \"INTEGER\",\n \"id\": \"61ba11691a29d52cb2842541\",\n \"description\": \"Item weight, in KG\",\n \"textSubType\": \"HTML\",\n \"serialStart\": 1000,\n \"optionsType\": \"DATETIME\",\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\": \"<string>\",\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-category/v1/category/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 \"name\": \"weight\",\n \"type\": \"INTEGER\",\n \"id\": \"61ba11691a29d52cb2842541\",\n \"description\": \"Item weight, in KG\",\n \"textSubType\": \"HTML\",\n \"serialStart\": 1000,\n \"optionsType\": \"DATETIME\",\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\": \"<string>\",\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 category attributes
Creates, updates and deletes category attributes. The primary purpose is to create and edit the attributes to be assigned to categories.
Note: They are generic category attributes and not specific to a category.
curl --request POST \
--url https://live.copilot.fabric.inc/api-category/v1/category/attribute/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-site-context: <x-site-context>' \
--data '
[
{
"action": "UPDATE",
"name": "weight",
"type": "INTEGER",
"id": "61ba11691a29d52cb2842541",
"description": "Item weight, in KG",
"textSubType": "HTML",
"serialStart": 1000,
"optionsType": "DATETIME",
"format": "YYYY-MM-DD",
"formula": "`${item.weightValue} ${item.weightUnit}`",
"validation": {
"required": true,
"inheritable": true,
"inverse": true,
"unique": true,
"exact": "<string>",
"attributeTypes": [
"Serial",
"Integer"
],
"contains": "<string>",
"range": {
"min": "<string>",
"max": "<string>"
},
"formula": "value < 10 || value > 20",
"oneOf": [
"<string>"
]
}
}
]
'import requests
url = "https://live.copilot.fabric.inc/api-category/v1/category/attribute/bulk"
payload = [
{
"action": "UPDATE",
"name": "weight",
"type": "INTEGER",
"id": "61ba11691a29d52cb2842541",
"description": "Item weight, in KG",
"textSubType": "HTML",
"serialStart": 1000,
"optionsType": "DATETIME",
"format": "YYYY-MM-DD",
"formula": "`${item.weightValue} ${item.weightUnit}`",
"validation": {
"required": True,
"inheritable": True,
"inverse": True,
"unique": True,
"exact": "<string>",
"attributeTypes": ["Serial", "Integer"],
"contains": "<string>",
"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',
name: 'weight',
type: 'INTEGER',
id: '61ba11691a29d52cb2842541',
description: 'Item weight, in KG',
textSubType: 'HTML',
serialStart: 1000,
optionsType: 'DATETIME',
format: 'YYYY-MM-DD',
formula: '`${item.weightValue} ${item.weightUnit}`',
validation: {
required: true,
inheritable: true,
inverse: true,
unique: true,
exact: '<string>',
attributeTypes: ['Serial', 'Integer'],
contains: '<string>',
range: {min: '<string>', max: '<string>'},
formula: 'value < 10 || value > 20',
oneOf: ['<string>']
}
}
])
};
fetch('https://live.copilot.fabric.inc/api-category/v1/category/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-category/v1/category/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',
'name' => 'weight',
'type' => 'INTEGER',
'id' => '61ba11691a29d52cb2842541',
'description' => 'Item weight, in KG',
'textSubType' => 'HTML',
'serialStart' => 1000,
'optionsType' => 'DATETIME',
'format' => 'YYYY-MM-DD',
'formula' => '`${item.weightValue} ${item.weightUnit}`',
'validation' => [
'required' => true,
'inheritable' => true,
'inverse' => true,
'unique' => true,
'exact' => '<string>',
'attributeTypes' => [
'Serial',
'Integer'
],
'contains' => '<string>',
'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-category/v1/category/attribute/bulk"
payload := strings.NewReader("[\n {\n \"action\": \"UPDATE\",\n \"name\": \"weight\",\n \"type\": \"INTEGER\",\n \"id\": \"61ba11691a29d52cb2842541\",\n \"description\": \"Item weight, in KG\",\n \"textSubType\": \"HTML\",\n \"serialStart\": 1000,\n \"optionsType\": \"DATETIME\",\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\": \"<string>\",\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-category/v1/category/attribute/bulk")
.header("x-site-context", "<x-site-context>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("[\n {\n \"action\": \"UPDATE\",\n \"name\": \"weight\",\n \"type\": \"INTEGER\",\n \"id\": \"61ba11691a29d52cb2842541\",\n \"description\": \"Item weight, in KG\",\n \"textSubType\": \"HTML\",\n \"serialStart\": 1000,\n \"optionsType\": \"DATETIME\",\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\": \"<string>\",\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-category/v1/category/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 \"name\": \"weight\",\n \"type\": \"INTEGER\",\n \"id\": \"61ba11691a29d52cb2842541\",\n \"description\": \"Item weight, in KG\",\n \"textSubType\": \"HTML\",\n \"serialStart\": 1000,\n \"optionsType\": \"DATETIME\",\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\": \"<string>\",\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
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
Action type.
Note:
1) Attribute ID is required only for UPDATE and DELETE actions (not for CREATE).
2) CREATE action replaces any existing category attribute with the same name.
CREATE, UPDATE, DELETE "UPDATE"
Attribute name
"weight"
Supported attribute types for the attribute
TEXT, BOOLEAN, SERIAL, DECIMAL, INTEGER, DATETIME, OPTIONS "INTEGER"
A 24-character system-generated attribute ID
"61ba11691a29d52cb2842541"
Accurate description of the attribute and what it represents
"Item weight, in KG"
Conditionally required for TEXT attribute type
SMALL_TEXT, TEXT_AREA, HTML "HTML"
Conditionally required to indicate the starting value of SERIAL attribute type. When enabled, the subsequent attribute values increment by 1.
1000
Conditionally required to indicate the selectable values for OPTIONS attribute type
TEXT, BOOLEAN, DECIMAL, INTEGER, DATETIME "DATETIME"
Attribute format. Currently used only for DATETIME attribute type.
"YYYY-MM-DD"
JavaScript expression to dynamically compute the attribute value. The data type returned by this expression must match the attribute's data type.
Note: When this is provided, validation is ignored.
"${item.weightValue} ${item.weightUnit}"
Show child attributes
Show child attributes
Response
OK
Show child attributes
Show child attributes
Was this page helpful?
