curl --request POST \
--url https://api.arcuserp.com/v1/products \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "Riser Kit",
"product_type": "variant_parent",
"description": "Modular riser kit with dome or flat options",
"variants": [
{
"title": "Dome Riser Kit",
"sku": "RISER-DOME",
"product_type": "kit",
"components": [
{
"component_product_id": "prod_stone_uuid",
"quantity": 2
},
{
"component_product_id": "prod_dome_lid_uuid",
"quantity": 1
}
],
"pricing": [
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 1,
"list_price": 49.99
},
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 5,
"list_price": 44.99
},
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 10,
"list_price": 39.99
}
],
"vendors": [
{
"vendor_id": "acct_acme_uuid",
"vendor_sku": "RD-001",
"default_unit_cost": 18
}
]
},
{
"title": "Flat Riser Kit",
"sku": "RISER-FLAT",
"product_type": "kit",
"components": [
{
"component_product_id": "prod_stone_uuid",
"quantity": 2
},
{
"component_product_id": "prod_flat_lid_uuid",
"quantity": 1
}
],
"pricing": [
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 1,
"list_price": 44.99
},
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 5,
"list_price": 39.99
},
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 10,
"list_price": 34.99
}
]
}
],
"vendors": [
{
"vendor_id": "acct_acme_uuid",
"vendor_sku": "RISER-PARENT",
"default_unit_cost": 15,
"purchase_policies": [
{
"qty_break": 1,
"purchase_price": 15,
"is_default": true
},
{
"qty_break": 100,
"purchase_price": 13.5
}
]
}
]
}
'import requests
url = "https://api.arcuserp.com/v1/products"
payload = {
"title": "Riser Kit",
"product_type": "variant_parent",
"description": "Modular riser kit with dome or flat options",
"variants": [
{
"title": "Dome Riser Kit",
"sku": "RISER-DOME",
"product_type": "kit",
"components": [
{
"component_product_id": "prod_stone_uuid",
"quantity": 2
},
{
"component_product_id": "prod_dome_lid_uuid",
"quantity": 1
}
],
"pricing": [
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 1,
"list_price": 49.99
},
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 5,
"list_price": 44.99
},
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 10,
"list_price": 39.99
}
],
"vendors": [
{
"vendor_id": "acct_acme_uuid",
"vendor_sku": "RD-001",
"default_unit_cost": 18
}
]
},
{
"title": "Flat Riser Kit",
"sku": "RISER-FLAT",
"product_type": "kit",
"components": [
{
"component_product_id": "prod_stone_uuid",
"quantity": 2
},
{
"component_product_id": "prod_flat_lid_uuid",
"quantity": 1
}
],
"pricing": [
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 1,
"list_price": 44.99
},
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 5,
"list_price": 39.99
},
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 10,
"list_price": 34.99
}
]
}
],
"vendors": [
{
"vendor_id": "acct_acme_uuid",
"vendor_sku": "RISER-PARENT",
"default_unit_cost": 15,
"purchase_policies": [
{
"qty_break": 1,
"purchase_price": 15,
"is_default": True
},
{
"qty_break": 100,
"purchase_price": 13.5
}
]
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: 'Riser Kit',
product_type: 'variant_parent',
description: 'Modular riser kit with dome or flat options',
variants: [
{
title: 'Dome Riser Kit',
sku: 'RISER-DOME',
product_type: 'kit',
components: [
{component_product_id: 'prod_stone_uuid', quantity: 2},
{component_product_id: 'prod_dome_lid_uuid', quantity: 1}
],
pricing: [
{pricing_level_id: 'pl_default_uuid', min_quantity: 1, list_price: 49.99},
{pricing_level_id: 'pl_default_uuid', min_quantity: 5, list_price: 44.99},
{pricing_level_id: 'pl_default_uuid', min_quantity: 10, list_price: 39.99}
],
vendors: [{vendor_id: 'acct_acme_uuid', vendor_sku: 'RD-001', default_unit_cost: 18}]
},
{
title: 'Flat Riser Kit',
sku: 'RISER-FLAT',
product_type: 'kit',
components: [
{component_product_id: 'prod_stone_uuid', quantity: 2},
{component_product_id: 'prod_flat_lid_uuid', quantity: 1}
],
pricing: [
{pricing_level_id: 'pl_default_uuid', min_quantity: 1, list_price: 44.99},
{pricing_level_id: 'pl_default_uuid', min_quantity: 5, list_price: 39.99},
{pricing_level_id: 'pl_default_uuid', min_quantity: 10, list_price: 34.99}
]
}
],
vendors: [
{
vendor_id: 'acct_acme_uuid',
vendor_sku: 'RISER-PARENT',
default_unit_cost: 15,
purchase_policies: [
{qty_break: 1, purchase_price: 15, is_default: true},
{qty_break: 100, purchase_price: 13.5}
]
}
]
})
};
fetch('https://api.arcuserp.com/v1/products', 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://api.arcuserp.com/v1/products",
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([
'title' => 'Riser Kit',
'product_type' => 'variant_parent',
'description' => 'Modular riser kit with dome or flat options',
'variants' => [
[
'title' => 'Dome Riser Kit',
'sku' => 'RISER-DOME',
'product_type' => 'kit',
'components' => [
[
'component_product_id' => 'prod_stone_uuid',
'quantity' => 2
],
[
'component_product_id' => 'prod_dome_lid_uuid',
'quantity' => 1
]
],
'pricing' => [
[
'pricing_level_id' => 'pl_default_uuid',
'min_quantity' => 1,
'list_price' => 49.99
],
[
'pricing_level_id' => 'pl_default_uuid',
'min_quantity' => 5,
'list_price' => 44.99
],
[
'pricing_level_id' => 'pl_default_uuid',
'min_quantity' => 10,
'list_price' => 39.99
]
],
'vendors' => [
[
'vendor_id' => 'acct_acme_uuid',
'vendor_sku' => 'RD-001',
'default_unit_cost' => 18
]
]
],
[
'title' => 'Flat Riser Kit',
'sku' => 'RISER-FLAT',
'product_type' => 'kit',
'components' => [
[
'component_product_id' => 'prod_stone_uuid',
'quantity' => 2
],
[
'component_product_id' => 'prod_flat_lid_uuid',
'quantity' => 1
]
],
'pricing' => [
[
'pricing_level_id' => 'pl_default_uuid',
'min_quantity' => 1,
'list_price' => 44.99
],
[
'pricing_level_id' => 'pl_default_uuid',
'min_quantity' => 5,
'list_price' => 39.99
],
[
'pricing_level_id' => 'pl_default_uuid',
'min_quantity' => 10,
'list_price' => 34.99
]
]
]
],
'vendors' => [
[
'vendor_id' => 'acct_acme_uuid',
'vendor_sku' => 'RISER-PARENT',
'default_unit_cost' => 15,
'purchase_policies' => [
[
'qty_break' => 1,
'purchase_price' => 15,
'is_default' => true
],
[
'qty_break' => 100,
'purchase_price' => 13.5
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://api.arcuserp.com/v1/products"
payload := strings.NewReader("{\n \"title\": \"Riser Kit\",\n \"product_type\": \"variant_parent\",\n \"description\": \"Modular riser kit with dome or flat options\",\n \"variants\": [\n {\n \"title\": \"Dome Riser Kit\",\n \"sku\": \"RISER-DOME\",\n \"product_type\": \"kit\",\n \"components\": [\n {\n \"component_product_id\": \"prod_stone_uuid\",\n \"quantity\": 2\n },\n {\n \"component_product_id\": \"prod_dome_lid_uuid\",\n \"quantity\": 1\n }\n ],\n \"pricing\": [\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 1,\n \"list_price\": 49.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 5,\n \"list_price\": 44.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 10,\n \"list_price\": 39.99\n }\n ],\n \"vendors\": [\n {\n \"vendor_id\": \"acct_acme_uuid\",\n \"vendor_sku\": \"RD-001\",\n \"default_unit_cost\": 18\n }\n ]\n },\n {\n \"title\": \"Flat Riser Kit\",\n \"sku\": \"RISER-FLAT\",\n \"product_type\": \"kit\",\n \"components\": [\n {\n \"component_product_id\": \"prod_stone_uuid\",\n \"quantity\": 2\n },\n {\n \"component_product_id\": \"prod_flat_lid_uuid\",\n \"quantity\": 1\n }\n ],\n \"pricing\": [\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 1,\n \"list_price\": 44.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 5,\n \"list_price\": 39.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 10,\n \"list_price\": 34.99\n }\n ]\n }\n ],\n \"vendors\": [\n {\n \"vendor_id\": \"acct_acme_uuid\",\n \"vendor_sku\": \"RISER-PARENT\",\n \"default_unit_cost\": 15,\n \"purchase_policies\": [\n {\n \"qty_break\": 1,\n \"purchase_price\": 15,\n \"is_default\": true\n },\n {\n \"qty_break\": 100,\n \"purchase_price\": 13.5\n }\n ]\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
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://api.arcuserp.com/v1/products")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"Riser Kit\",\n \"product_type\": \"variant_parent\",\n \"description\": \"Modular riser kit with dome or flat options\",\n \"variants\": [\n {\n \"title\": \"Dome Riser Kit\",\n \"sku\": \"RISER-DOME\",\n \"product_type\": \"kit\",\n \"components\": [\n {\n \"component_product_id\": \"prod_stone_uuid\",\n \"quantity\": 2\n },\n {\n \"component_product_id\": \"prod_dome_lid_uuid\",\n \"quantity\": 1\n }\n ],\n \"pricing\": [\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 1,\n \"list_price\": 49.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 5,\n \"list_price\": 44.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 10,\n \"list_price\": 39.99\n }\n ],\n \"vendors\": [\n {\n \"vendor_id\": \"acct_acme_uuid\",\n \"vendor_sku\": \"RD-001\",\n \"default_unit_cost\": 18\n }\n ]\n },\n {\n \"title\": \"Flat Riser Kit\",\n \"sku\": \"RISER-FLAT\",\n \"product_type\": \"kit\",\n \"components\": [\n {\n \"component_product_id\": \"prod_stone_uuid\",\n \"quantity\": 2\n },\n {\n \"component_product_id\": \"prod_flat_lid_uuid\",\n \"quantity\": 1\n }\n ],\n \"pricing\": [\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 1,\n \"list_price\": 44.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 5,\n \"list_price\": 39.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 10,\n \"list_price\": 34.99\n }\n ]\n }\n ],\n \"vendors\": [\n {\n \"vendor_id\": \"acct_acme_uuid\",\n \"vendor_sku\": \"RISER-PARENT\",\n \"default_unit_cost\": 15,\n \"purchase_policies\": [\n {\n \"qty_break\": 1,\n \"purchase_price\": 15,\n \"is_default\": true\n },\n {\n \"qty_break\": 100,\n \"purchase_price\": 13.5\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"Riser Kit\",\n \"product_type\": \"variant_parent\",\n \"description\": \"Modular riser kit with dome or flat options\",\n \"variants\": [\n {\n \"title\": \"Dome Riser Kit\",\n \"sku\": \"RISER-DOME\",\n \"product_type\": \"kit\",\n \"components\": [\n {\n \"component_product_id\": \"prod_stone_uuid\",\n \"quantity\": 2\n },\n {\n \"component_product_id\": \"prod_dome_lid_uuid\",\n \"quantity\": 1\n }\n ],\n \"pricing\": [\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 1,\n \"list_price\": 49.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 5,\n \"list_price\": 44.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 10,\n \"list_price\": 39.99\n }\n ],\n \"vendors\": [\n {\n \"vendor_id\": \"acct_acme_uuid\",\n \"vendor_sku\": \"RD-001\",\n \"default_unit_cost\": 18\n }\n ]\n },\n {\n \"title\": \"Flat Riser Kit\",\n \"sku\": \"RISER-FLAT\",\n \"product_type\": \"kit\",\n \"components\": [\n {\n \"component_product_id\": \"prod_stone_uuid\",\n \"quantity\": 2\n },\n {\n \"component_product_id\": \"prod_flat_lid_uuid\",\n \"quantity\": 1\n }\n ],\n \"pricing\": [\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 1,\n \"list_price\": 44.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 5,\n \"list_price\": 39.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 10,\n \"list_price\": 34.99\n }\n ]\n }\n ],\n \"vendors\": [\n {\n \"vendor_id\": \"acct_acme_uuid\",\n \"vendor_sku\": \"RISER-PARENT\",\n \"default_unit_cost\": 15,\n \"purchase_policies\": [\n {\n \"qty_break\": 1,\n \"purchase_price\": 15,\n \"is_default\": true\n },\n {\n \"qty_break\": 100,\n \"purchase_price\": 13.5\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"object": "product",
"entity_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"description": "<string>",
"sku": "<string>",
"part_number": "<string>",
"barcode": "<string>",
"category_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"vendor_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"list_price": 123,
"cost": 123,
"is_active": true,
"is_serialized": true,
"charge_tax": true,
"track_inventory": true,
"weight": 123,
"weight_uom": "<string>",
"length": 123,
"width": 123,
"height": 123,
"length_uom": "<string>",
"quantity_uom": "<string>",
"product_tax_code": "<string>",
"reorder_point": 123,
"reorder_qty": 123,
"safety_stock": 123,
"packaging_classification": "over_box",
"has_variants": true,
"metadata": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}Create a product
Atomic-create endpoint — accepts the complete nested resource graph in one transactional POST. If any child fails to write, the entire request rolls back. The response includes every child hydrated inline (variants, pricing, components, vendors) so no follow-up GET is required.
The product_type discriminator controls which nested children are accepted:
physical/service: acceptspricing[]andvendors[]kit/box: acceptscomponents[],pricing[], andvendors[]variant_parent: acceptsvariants[](each variant may include its owncomponents[],pricing[],vendors[]), plus top-levelpricing[]andvendors[]
Pricing tiers: each pricing[] element uses min_quantity (the public-API key; internally
mapped to qty_break) to define the minimum order quantity that activates the tier. Use a unique
min_quantity within the same pricing_level_id scope to express qty-break discounts.
Vendor cost tiers: each vendors[] element may carry a purchase_policies[] array of
vendor cost tiers (product_purchase_policies) — the per-quantity price that vendor charges.
These are wired atomically alongside the vendor relationship.
Guide: https://arcuserp.mintlify.app/guides/creating-products-kits-variants
curl --request POST \
--url https://api.arcuserp.com/v1/products \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "Riser Kit",
"product_type": "variant_parent",
"description": "Modular riser kit with dome or flat options",
"variants": [
{
"title": "Dome Riser Kit",
"sku": "RISER-DOME",
"product_type": "kit",
"components": [
{
"component_product_id": "prod_stone_uuid",
"quantity": 2
},
{
"component_product_id": "prod_dome_lid_uuid",
"quantity": 1
}
],
"pricing": [
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 1,
"list_price": 49.99
},
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 5,
"list_price": 44.99
},
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 10,
"list_price": 39.99
}
],
"vendors": [
{
"vendor_id": "acct_acme_uuid",
"vendor_sku": "RD-001",
"default_unit_cost": 18
}
]
},
{
"title": "Flat Riser Kit",
"sku": "RISER-FLAT",
"product_type": "kit",
"components": [
{
"component_product_id": "prod_stone_uuid",
"quantity": 2
},
{
"component_product_id": "prod_flat_lid_uuid",
"quantity": 1
}
],
"pricing": [
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 1,
"list_price": 44.99
},
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 5,
"list_price": 39.99
},
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 10,
"list_price": 34.99
}
]
}
],
"vendors": [
{
"vendor_id": "acct_acme_uuid",
"vendor_sku": "RISER-PARENT",
"default_unit_cost": 15,
"purchase_policies": [
{
"qty_break": 1,
"purchase_price": 15,
"is_default": true
},
{
"qty_break": 100,
"purchase_price": 13.5
}
]
}
]
}
'import requests
url = "https://api.arcuserp.com/v1/products"
payload = {
"title": "Riser Kit",
"product_type": "variant_parent",
"description": "Modular riser kit with dome or flat options",
"variants": [
{
"title": "Dome Riser Kit",
"sku": "RISER-DOME",
"product_type": "kit",
"components": [
{
"component_product_id": "prod_stone_uuid",
"quantity": 2
},
{
"component_product_id": "prod_dome_lid_uuid",
"quantity": 1
}
],
"pricing": [
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 1,
"list_price": 49.99
},
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 5,
"list_price": 44.99
},
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 10,
"list_price": 39.99
}
],
"vendors": [
{
"vendor_id": "acct_acme_uuid",
"vendor_sku": "RD-001",
"default_unit_cost": 18
}
]
},
{
"title": "Flat Riser Kit",
"sku": "RISER-FLAT",
"product_type": "kit",
"components": [
{
"component_product_id": "prod_stone_uuid",
"quantity": 2
},
{
"component_product_id": "prod_flat_lid_uuid",
"quantity": 1
}
],
"pricing": [
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 1,
"list_price": 44.99
},
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 5,
"list_price": 39.99
},
{
"pricing_level_id": "pl_default_uuid",
"min_quantity": 10,
"list_price": 34.99
}
]
}
],
"vendors": [
{
"vendor_id": "acct_acme_uuid",
"vendor_sku": "RISER-PARENT",
"default_unit_cost": 15,
"purchase_policies": [
{
"qty_break": 1,
"purchase_price": 15,
"is_default": True
},
{
"qty_break": 100,
"purchase_price": 13.5
}
]
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: 'Riser Kit',
product_type: 'variant_parent',
description: 'Modular riser kit with dome or flat options',
variants: [
{
title: 'Dome Riser Kit',
sku: 'RISER-DOME',
product_type: 'kit',
components: [
{component_product_id: 'prod_stone_uuid', quantity: 2},
{component_product_id: 'prod_dome_lid_uuid', quantity: 1}
],
pricing: [
{pricing_level_id: 'pl_default_uuid', min_quantity: 1, list_price: 49.99},
{pricing_level_id: 'pl_default_uuid', min_quantity: 5, list_price: 44.99},
{pricing_level_id: 'pl_default_uuid', min_quantity: 10, list_price: 39.99}
],
vendors: [{vendor_id: 'acct_acme_uuid', vendor_sku: 'RD-001', default_unit_cost: 18}]
},
{
title: 'Flat Riser Kit',
sku: 'RISER-FLAT',
product_type: 'kit',
components: [
{component_product_id: 'prod_stone_uuid', quantity: 2},
{component_product_id: 'prod_flat_lid_uuid', quantity: 1}
],
pricing: [
{pricing_level_id: 'pl_default_uuid', min_quantity: 1, list_price: 44.99},
{pricing_level_id: 'pl_default_uuid', min_quantity: 5, list_price: 39.99},
{pricing_level_id: 'pl_default_uuid', min_quantity: 10, list_price: 34.99}
]
}
],
vendors: [
{
vendor_id: 'acct_acme_uuid',
vendor_sku: 'RISER-PARENT',
default_unit_cost: 15,
purchase_policies: [
{qty_break: 1, purchase_price: 15, is_default: true},
{qty_break: 100, purchase_price: 13.5}
]
}
]
})
};
fetch('https://api.arcuserp.com/v1/products', 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://api.arcuserp.com/v1/products",
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([
'title' => 'Riser Kit',
'product_type' => 'variant_parent',
'description' => 'Modular riser kit with dome or flat options',
'variants' => [
[
'title' => 'Dome Riser Kit',
'sku' => 'RISER-DOME',
'product_type' => 'kit',
'components' => [
[
'component_product_id' => 'prod_stone_uuid',
'quantity' => 2
],
[
'component_product_id' => 'prod_dome_lid_uuid',
'quantity' => 1
]
],
'pricing' => [
[
'pricing_level_id' => 'pl_default_uuid',
'min_quantity' => 1,
'list_price' => 49.99
],
[
'pricing_level_id' => 'pl_default_uuid',
'min_quantity' => 5,
'list_price' => 44.99
],
[
'pricing_level_id' => 'pl_default_uuid',
'min_quantity' => 10,
'list_price' => 39.99
]
],
'vendors' => [
[
'vendor_id' => 'acct_acme_uuid',
'vendor_sku' => 'RD-001',
'default_unit_cost' => 18
]
]
],
[
'title' => 'Flat Riser Kit',
'sku' => 'RISER-FLAT',
'product_type' => 'kit',
'components' => [
[
'component_product_id' => 'prod_stone_uuid',
'quantity' => 2
],
[
'component_product_id' => 'prod_flat_lid_uuid',
'quantity' => 1
]
],
'pricing' => [
[
'pricing_level_id' => 'pl_default_uuid',
'min_quantity' => 1,
'list_price' => 44.99
],
[
'pricing_level_id' => 'pl_default_uuid',
'min_quantity' => 5,
'list_price' => 39.99
],
[
'pricing_level_id' => 'pl_default_uuid',
'min_quantity' => 10,
'list_price' => 34.99
]
]
]
],
'vendors' => [
[
'vendor_id' => 'acct_acme_uuid',
'vendor_sku' => 'RISER-PARENT',
'default_unit_cost' => 15,
'purchase_policies' => [
[
'qty_break' => 1,
'purchase_price' => 15,
'is_default' => true
],
[
'qty_break' => 100,
'purchase_price' => 13.5
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://api.arcuserp.com/v1/products"
payload := strings.NewReader("{\n \"title\": \"Riser Kit\",\n \"product_type\": \"variant_parent\",\n \"description\": \"Modular riser kit with dome or flat options\",\n \"variants\": [\n {\n \"title\": \"Dome Riser Kit\",\n \"sku\": \"RISER-DOME\",\n \"product_type\": \"kit\",\n \"components\": [\n {\n \"component_product_id\": \"prod_stone_uuid\",\n \"quantity\": 2\n },\n {\n \"component_product_id\": \"prod_dome_lid_uuid\",\n \"quantity\": 1\n }\n ],\n \"pricing\": [\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 1,\n \"list_price\": 49.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 5,\n \"list_price\": 44.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 10,\n \"list_price\": 39.99\n }\n ],\n \"vendors\": [\n {\n \"vendor_id\": \"acct_acme_uuid\",\n \"vendor_sku\": \"RD-001\",\n \"default_unit_cost\": 18\n }\n ]\n },\n {\n \"title\": \"Flat Riser Kit\",\n \"sku\": \"RISER-FLAT\",\n \"product_type\": \"kit\",\n \"components\": [\n {\n \"component_product_id\": \"prod_stone_uuid\",\n \"quantity\": 2\n },\n {\n \"component_product_id\": \"prod_flat_lid_uuid\",\n \"quantity\": 1\n }\n ],\n \"pricing\": [\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 1,\n \"list_price\": 44.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 5,\n \"list_price\": 39.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 10,\n \"list_price\": 34.99\n }\n ]\n }\n ],\n \"vendors\": [\n {\n \"vendor_id\": \"acct_acme_uuid\",\n \"vendor_sku\": \"RISER-PARENT\",\n \"default_unit_cost\": 15,\n \"purchase_policies\": [\n {\n \"qty_break\": 1,\n \"purchase_price\": 15,\n \"is_default\": true\n },\n {\n \"qty_break\": 100,\n \"purchase_price\": 13.5\n }\n ]\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
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://api.arcuserp.com/v1/products")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"Riser Kit\",\n \"product_type\": \"variant_parent\",\n \"description\": \"Modular riser kit with dome or flat options\",\n \"variants\": [\n {\n \"title\": \"Dome Riser Kit\",\n \"sku\": \"RISER-DOME\",\n \"product_type\": \"kit\",\n \"components\": [\n {\n \"component_product_id\": \"prod_stone_uuid\",\n \"quantity\": 2\n },\n {\n \"component_product_id\": \"prod_dome_lid_uuid\",\n \"quantity\": 1\n }\n ],\n \"pricing\": [\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 1,\n \"list_price\": 49.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 5,\n \"list_price\": 44.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 10,\n \"list_price\": 39.99\n }\n ],\n \"vendors\": [\n {\n \"vendor_id\": \"acct_acme_uuid\",\n \"vendor_sku\": \"RD-001\",\n \"default_unit_cost\": 18\n }\n ]\n },\n {\n \"title\": \"Flat Riser Kit\",\n \"sku\": \"RISER-FLAT\",\n \"product_type\": \"kit\",\n \"components\": [\n {\n \"component_product_id\": \"prod_stone_uuid\",\n \"quantity\": 2\n },\n {\n \"component_product_id\": \"prod_flat_lid_uuid\",\n \"quantity\": 1\n }\n ],\n \"pricing\": [\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 1,\n \"list_price\": 44.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 5,\n \"list_price\": 39.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 10,\n \"list_price\": 34.99\n }\n ]\n }\n ],\n \"vendors\": [\n {\n \"vendor_id\": \"acct_acme_uuid\",\n \"vendor_sku\": \"RISER-PARENT\",\n \"default_unit_cost\": 15,\n \"purchase_policies\": [\n {\n \"qty_break\": 1,\n \"purchase_price\": 15,\n \"is_default\": true\n },\n {\n \"qty_break\": 100,\n \"purchase_price\": 13.5\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"Riser Kit\",\n \"product_type\": \"variant_parent\",\n \"description\": \"Modular riser kit with dome or flat options\",\n \"variants\": [\n {\n \"title\": \"Dome Riser Kit\",\n \"sku\": \"RISER-DOME\",\n \"product_type\": \"kit\",\n \"components\": [\n {\n \"component_product_id\": \"prod_stone_uuid\",\n \"quantity\": 2\n },\n {\n \"component_product_id\": \"prod_dome_lid_uuid\",\n \"quantity\": 1\n }\n ],\n \"pricing\": [\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 1,\n \"list_price\": 49.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 5,\n \"list_price\": 44.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 10,\n \"list_price\": 39.99\n }\n ],\n \"vendors\": [\n {\n \"vendor_id\": \"acct_acme_uuid\",\n \"vendor_sku\": \"RD-001\",\n \"default_unit_cost\": 18\n }\n ]\n },\n {\n \"title\": \"Flat Riser Kit\",\n \"sku\": \"RISER-FLAT\",\n \"product_type\": \"kit\",\n \"components\": [\n {\n \"component_product_id\": \"prod_stone_uuid\",\n \"quantity\": 2\n },\n {\n \"component_product_id\": \"prod_flat_lid_uuid\",\n \"quantity\": 1\n }\n ],\n \"pricing\": [\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 1,\n \"list_price\": 44.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 5,\n \"list_price\": 39.99\n },\n {\n \"pricing_level_id\": \"pl_default_uuid\",\n \"min_quantity\": 10,\n \"list_price\": 34.99\n }\n ]\n }\n ],\n \"vendors\": [\n {\n \"vendor_id\": \"acct_acme_uuid\",\n \"vendor_sku\": \"RISER-PARENT\",\n \"default_unit_cost\": 15,\n \"purchase_policies\": [\n {\n \"qty_break\": 1,\n \"purchase_price\": 15,\n \"is_default\": true\n },\n {\n \"qty_break\": 100,\n \"purchase_price\": 13.5\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"object": "product",
"entity_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"description": "<string>",
"sku": "<string>",
"part_number": "<string>",
"barcode": "<string>",
"category_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"vendor_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"list_price": 123,
"cost": 123,
"is_active": true,
"is_serialized": true,
"charge_tax": true,
"track_inventory": true,
"weight": 123,
"weight_uom": "<string>",
"length": 123,
"width": 123,
"height": 123,
"length_uom": "<string>",
"quantity_uom": "<string>",
"product_tax_code": "<string>",
"reorder_point": 123,
"reorder_qty": 123,
"safety_stock": 123,
"packaging_classification": "over_box",
"has_variants": true,
"metadata": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}Authorizations
API key issued per entity via Settings > Developers > API Keys.
Each key carries scopes (e.g. orders:read, products:write).
Bearer token format: Authorization: Bearer ark_live_ent_Test keys use ark_test_ent_. Both are issued per entity
via Settings > Developers > API Keys.
Headers
Client-generated unique key for idempotent POST/PATCH/DELETE operations. Alias for the Idempotency parameter. Max 255 chars. On retry with the same key, the original response is returned without re-executing the operation. Keys expire after 24 hours.
255Body
"Riser Kit"
physical, kit, box, service, variant_parent "variant_parent"
"Modular riser kit with dome or flat options"
Amazon-FBA packaging classification. Defaults to over_box (standard PackPilot path). Set to sioc or sipp for single-item ship-ready packaging (label tapes on product, no over-box, no prep -- cannot co-pack). Set to prep_free when an over-box is still required but the prep step is skipped (no bubble wrap / bagging / labels-on-product). PackPilot reads this on every pack-order call. See the Product schema for full enum semantics.
over_box, sioc, sipp, prep_free "over_box"
Kit/box component assemblies (product_type=kit or box only). Each element references a component product and the quantity required to build one unit of this kit.
Show child attributes
Show child attributes
Inline variants (product_type=variant_parent only). Each variant can itself carry
kit components[], qty-break pricing[], and vendors[] that are wired
atomically in the same transaction.
Show child attributes
Show child attributes
Sell-side pricing policies for the parent product (any product_type). Each element
defines one qty-break tier on a pricing level. Use min_quantity to set the
minimum order quantity that activates this tier (maps to qty_break internally).
All money fields are returned as JS numbers (float).
Show child attributes
Show child attributes
Vendor relationships on the parent product (any product_type)
Show child attributes
Show child attributes
Response
Product created
Arcus ERP product (physical/kit/box/service/variant_parent).
Show child attributes
Show child attributes
Was this page helpful?

