Create product
curl --request POST \
--url https://live.nocnocstore.com/api/v2/products \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"sku": "<string>",
"international_ids": {},
"available_quantity": 123,
"price": 123,
"condition": "<string>",
"title": "<string>",
"description": "<string>",
"package_dimensions": {},
"product_dimensions": {},
"images": [
{}
],
"currency_code": "<string>",
"description_language": "<string>"
}
'import requests
url = "https://live.nocnocstore.com/api/v2/products"
payload = {
"sku": "<string>",
"international_ids": {},
"available_quantity": 123,
"price": 123,
"condition": "<string>",
"title": "<string>",
"description": "<string>",
"package_dimensions": {},
"product_dimensions": {},
"images": [{}],
"currency_code": "<string>",
"description_language": "<string>"
}
headers = {
"X-Api-Key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Api-Key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
sku: '<string>',
international_ids: {},
available_quantity: 123,
price: 123,
condition: '<string>',
title: '<string>',
description: '<string>',
package_dimensions: {},
product_dimensions: {},
images: [{}],
currency_code: '<string>',
description_language: '<string>'
})
};
fetch('https://live.nocnocstore.com/api/v2/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://live.nocnocstore.com/api/v2/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([
'sku' => '<string>',
'international_ids' => [
],
'available_quantity' => 123,
'price' => 123,
'condition' => '<string>',
'title' => '<string>',
'description' => '<string>',
'package_dimensions' => [
],
'product_dimensions' => [
],
'images' => [
[
]
],
'currency_code' => '<string>',
'description_language' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <x-api-key>"
],
]);
$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.nocnocstore.com/api/v2/products"
payload := strings.NewReader("{\n \"sku\": \"<string>\",\n \"international_ids\": {},\n \"available_quantity\": 123,\n \"price\": 123,\n \"condition\": \"<string>\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"package_dimensions\": {},\n \"product_dimensions\": {},\n \"images\": [\n {}\n ],\n \"currency_code\": \"<string>\",\n \"description_language\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<x-api-key>")
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.nocnocstore.com/api/v2/products")
.header("X-Api-Key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"sku\": \"<string>\",\n \"international_ids\": {},\n \"available_quantity\": 123,\n \"price\": 123,\n \"condition\": \"<string>\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"package_dimensions\": {},\n \"product_dimensions\": {},\n \"images\": [\n {}\n ],\n \"currency_code\": \"<string>\",\n \"description_language\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://live.nocnocstore.com/api/v2/products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"sku\": \"<string>\",\n \"international_ids\": {},\n \"available_quantity\": 123,\n \"price\": 123,\n \"condition\": \"<string>\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"package_dimensions\": {},\n \"product_dimensions\": {},\n \"images\": [\n {}\n ],\n \"currency_code\": \"<string>\",\n \"description_language\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"sku": "SKU-001",
"international_ids": { "GTIN": ["4901234567890"] },
"available_quantity": 20,
"price": 23,
"package_dimensions": {
"size": { "unit": "cm", "width": 28, "height": 15, "length": 46 },
"weight": { "value": 3, "unit": "kg" }
},
"product_dimensions": {
"size": { "unit": "cm", "width": 26, "height": 13, "length": 42 },
"weight": { "value": 2, "unit": "kg" }
},
"images": ["https://example.com/image.jpg"],
"condition": "NEW",
"title": "Product Title",
"description": "Product description",
"status": "PENDING"
}
{
"error": "Validation failed",
"fields": {
"internationalIds": "At least one international identifier type is required."
}
}
{
"code": 401,
"message": "Unauthorized"
}
{
"message": "Internal Server Error"
}
Products
Create product
Creates a new product and adds it to your catalog. Requires full product data.
POST
/
api
/
v2
/
products
Create product
curl --request POST \
--url https://live.nocnocstore.com/api/v2/products \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"sku": "<string>",
"international_ids": {},
"available_quantity": 123,
"price": 123,
"condition": "<string>",
"title": "<string>",
"description": "<string>",
"package_dimensions": {},
"product_dimensions": {},
"images": [
{}
],
"currency_code": "<string>",
"description_language": "<string>"
}
'import requests
url = "https://live.nocnocstore.com/api/v2/products"
payload = {
"sku": "<string>",
"international_ids": {},
"available_quantity": 123,
"price": 123,
"condition": "<string>",
"title": "<string>",
"description": "<string>",
"package_dimensions": {},
"product_dimensions": {},
"images": [{}],
"currency_code": "<string>",
"description_language": "<string>"
}
headers = {
"X-Api-Key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Api-Key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
sku: '<string>',
international_ids: {},
available_quantity: 123,
price: 123,
condition: '<string>',
title: '<string>',
description: '<string>',
package_dimensions: {},
product_dimensions: {},
images: [{}],
currency_code: '<string>',
description_language: '<string>'
})
};
fetch('https://live.nocnocstore.com/api/v2/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://live.nocnocstore.com/api/v2/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([
'sku' => '<string>',
'international_ids' => [
],
'available_quantity' => 123,
'price' => 123,
'condition' => '<string>',
'title' => '<string>',
'description' => '<string>',
'package_dimensions' => [
],
'product_dimensions' => [
],
'images' => [
[
]
],
'currency_code' => '<string>',
'description_language' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <x-api-key>"
],
]);
$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.nocnocstore.com/api/v2/products"
payload := strings.NewReader("{\n \"sku\": \"<string>\",\n \"international_ids\": {},\n \"available_quantity\": 123,\n \"price\": 123,\n \"condition\": \"<string>\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"package_dimensions\": {},\n \"product_dimensions\": {},\n \"images\": [\n {}\n ],\n \"currency_code\": \"<string>\",\n \"description_language\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<x-api-key>")
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.nocnocstore.com/api/v2/products")
.header("X-Api-Key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"sku\": \"<string>\",\n \"international_ids\": {},\n \"available_quantity\": 123,\n \"price\": 123,\n \"condition\": \"<string>\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"package_dimensions\": {},\n \"product_dimensions\": {},\n \"images\": [\n {}\n ],\n \"currency_code\": \"<string>\",\n \"description_language\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://live.nocnocstore.com/api/v2/products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"sku\": \"<string>\",\n \"international_ids\": {},\n \"available_quantity\": 123,\n \"price\": 123,\n \"condition\": \"<string>\",\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"package_dimensions\": {},\n \"product_dimensions\": {},\n \"images\": [\n {}\n ],\n \"currency_code\": \"<string>\",\n \"description_language\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"sku": "SKU-001",
"international_ids": { "GTIN": ["4901234567890"] },
"available_quantity": 20,
"price": 23,
"package_dimensions": {
"size": { "unit": "cm", "width": 28, "height": 15, "length": 46 },
"weight": { "value": 3, "unit": "kg" }
},
"product_dimensions": {
"size": { "unit": "cm", "width": 26, "height": 13, "length": 42 },
"weight": { "value": 2, "unit": "kg" }
},
"images": ["https://example.com/image.jpg"],
"condition": "NEW",
"title": "Product Title",
"description": "Product description",
"status": "PENDING"
}
{
"error": "Validation failed",
"fields": {
"internationalIds": "At least one international identifier type is required."
}
}
{
"code": 401,
"message": "Unauthorized"
}
{
"message": "Internal Server Error"
}
Requests go to the live environment — all actions are real.
Starting August 25, 2026, this page describes how product creation works. Three things change
from the previous contract:
international_idsis now required. A product sent without a universal identifier (EAN, UPC, GTIN or ASIN) is rejected.conditionis now required, and onlyNEW,REFURBISHED_AandOPEN_BOXare accepted.- The response no longer returns
seller_product_id. It confirms the product was accepted, not that it finished being created.
Authorization
string
required
Your seller API key. Provided by your nocnoc account manager.
Body parameters
string
required
Alphanumeric unique code for the product. Between 1 and 45 characters, and it must start with a
letter or a number.Spaces are removed from the value before it is stored, so
SKU 001 is stored as SKU001. Send it
without spaces: every other endpoint addresses the product by the stored value, so a SKU sent with
spaces will not be found afterwards.object
required
Universal identifiers for the product. At least one type with at least one value is required.Supported types:
gtin, ean and upc (numeric, 12 to 14 digits), and asin (alphanumeric,
exactly 10 characters). Type names are case-insensitive, and spaces inside a value are removed
before it is validated and stored. You can send more than one type in the same request. Example:
{ "gtin": ["4901234567890"], "asin": ["B00QAIV7V2"] }.gtin, ean and upc are the same identifier downstream — sending a value under two of those
types adds no information. Of the ASINs you send, only the first one is used to build the product.An identifier can only be used once per condition across your catalog. Reusing the same identifier
with the same condition on a different SKU is rejected. Reusing it with a different condition is
accepted by this endpoint, but the product is not created afterwards — see
Checks that run after you get the response.integer
required
Stock quantity. Must be 0 or greater, and 9999 at most.
number
required
Price of the product, always in USD. Between
0.01 and 9998.99, with up to 2 decimal places.string
required
Product condition. One of:
NEW, REFURBISHED_A, OPEN_BOX. Case-insensitive.REFURBISHED_A_PLUS is listed as valid in our validation messages, but it cannot be published —
do not use it.string
required
Product title to be published. Between 1 and 255 characters. Leading and trailing spaces are
trimmed.
string
required
Product description to be published. Cannot be empty. Leading and trailing spaces are trimmed.
object
Dimensions of the package. Contains
size (object with unit, length, width, height) and
weight (object with unit, value). Size units: cm, inch, inches, mm. Weight units:
kg, lb, gram, kilogram, pound. Every value must be greater than 0.object
Dimensions of the product itself. Same structure as
package_dimensions.Both objects are optional because we complete them from the Amazon listing matched by the
identifier you send: Amazon’s values win, and whatever it does not carry is filled in from your
request. Send them when you can anyway — if we cannot match your product, or the match has no
dimensions, there is no shipping weight and the product is not created. See
Checks that run after you get the response.
array
Array of image objects, each with a
source_url field. Maximum 10.The response returns this field in a different shape: a flat array of URL strings, not the objects
you sent.string
Currency code (ISO). Only
USD is supported. Defaults to USD when omitted.string
Language of the description. Only
en is supported. Defaults to en when omitted.Fields that are not listed above are ignored. The product data we publish is taken from the nocnoc
catalog entry matched by the identifier you send.
Returns
201 Created with the product data you submitted, plus a status field.
status: "PENDING" means the product passed validation and was accepted — creation then continues on
our side, so it does not mean the product is already published. Poll
Get product with your SKU to follow its status.
The response does not include a product id. Nothing in this API takes one as input: reads, stock and
price updates are all addressed by your own SKU.
Values come back normalized rather than exactly as you sent them: identifier type names are
uppercased and their values sorted, condition is uppercased, and images is a flat list of URLs
instead of the objects you sent. currency_code and description_language are not echoed back.
Example request
curl -X POST https://live.nocnocstore.com/api/v2/products \
-H "X-Api-Key: YOUR_SELLER_KEY" \
-H "Content-Type: application/json" \
-d '{
"sku": "SKU-001",
"international_ids": { "gtin": ["4901234567890"] },
"available_quantity": 20,
"price": 23,
"currency_code": "USD",
"condition": "NEW",
"title": "Product Title",
"description": "Product description",
"description_language": "en",
"package_dimensions": {
"size": { "unit": "cm", "length": 46, "width": 28, "height": 15 },
"weight": { "unit": "kg", "value": 3 }
},
"product_dimensions": {
"size": { "unit": "cm", "length": 42, "width": 26, "height": 13 },
"weight": { "unit": "kg", "value": 2 }
},
"images": [{ "source_url": "https://example.com/image.jpg" }]
}'
{
"sku": "SKU-001",
"international_ids": { "GTIN": ["4901234567890"] },
"available_quantity": 20,
"price": 23,
"package_dimensions": {
"size": { "unit": "cm", "width": 28, "height": 15, "length": 46 },
"weight": { "value": 3, "unit": "kg" }
},
"product_dimensions": {
"size": { "unit": "cm", "width": 26, "height": 13, "length": 42 },
"weight": { "value": 2, "unit": "kg" }
},
"images": ["https://example.com/image.jpg"],
"condition": "NEW",
"title": "Product Title",
"description": "Product description",
"status": "PENDING"
}
{
"error": "Validation failed",
"fields": {
"internationalIds": "At least one international identifier type is required."
}
}
{
"code": 401,
"message": "Unauthorized"
}
{
"message": "Internal Server Error"
}
Errors
Validation errors come back with status400 in one of two shapes, and neither creates the product —
fix what is reported and retry the same request.
Field checks — a required field is missing, or its type, length or range is wrong:
{
"error": "Validation failed",
"fields": {
"internationalIds": "At least one international identifier type is required."
}
}
{
"code": 400,
"message": "Invalid Request Payload.",
"errors": [
"GTIN identifier '123' must be numeric and between 12 and 14 digits.",
"Invalid condition: USED. Valid values: NEW, REFURBISHED_A_PLUS, REFURBISHED_A, OPEN_BOX"
]
}
{
"code": 400,
"message": "Invalid Request Payload.",
"errors": ["A seller_catalog with sku 'SKU-001' already exists for this seller."]
}
message is always Invalid Request Payload.; the detail is in errors, with
one entry per problem found. Format problems are reported first: if any of them is present you will
not see the duplicate-identifier check in the same response, so fix the format and send the request
again to find out whether the identifier is free:
{
"code": 400,
"message": "Invalid Request Payload.",
"errors": [
"Identifier GTIN '4901234567890' is already registered for this seller with condition NEW."
]
}
Checks that run after you get the response
A201 with status: "PENDING" means the request passed the checks above — not that the product was
created. Some rules are only applied in the step that follows, and when one of them fails the product
is silently not created: no error reaches your integration, and the SKU never shows up in
Get product.
These are the rules in that group:
- no shipping weight can be worked out:
package_dimensions.size,product_dimensions.sizeorpackage_dimensions.weightmissing from your request and not recoverable from the Amazon match either available_quantityabove 9999pricewith more than 2 decimal places- more than 10 images
currency_codeother thanUSD, ordescription_languageother thanen- a SKU that does not start with a letter or a number
- a GTIN, EAN, UPC or ASIN already used by another of your products. This check ignores
condition, so an identifier you reuse with a different condition passes the checks above and still ends up not being created
502
A502 means we could not confirm whether the product was created:
{
"message": "Internal Server Error"
}
400 with
A seller_catalog with sku '...' already exists for this seller.; otherwise it answers 201 again,
echoing the entry we had stored, so package_dimensions, product_dimensions and images come back
as null. That does not mean the data was lost.