curl --request POST \
--url https://app.polygon-one.com/api/articles \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"internalArticleNr": "<string>",
"hsCode": "<string>",
"shortDescription": "<string>",
"externalArticleNr": "<string>",
"ean": "<string>",
"supplierId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"supplierName": "<string>",
"supplierEmail": "jsmith@example.com",
"acknowledgeWarnings": true
}
'import requests
url = "https://app.polygon-one.com/api/articles"
payload = {
"name": "<string>",
"internalArticleNr": "<string>",
"hsCode": "<string>",
"shortDescription": "<string>",
"externalArticleNr": "<string>",
"ean": "<string>",
"supplierId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"supplierName": "<string>",
"supplierEmail": "jsmith@example.com",
"acknowledgeWarnings": True
}
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({
name: '<string>',
internalArticleNr: '<string>',
hsCode: '<string>',
shortDescription: '<string>',
externalArticleNr: '<string>',
ean: '<string>',
supplierId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
supplierName: '<string>',
supplierEmail: 'jsmith@example.com',
acknowledgeWarnings: true
})
};
fetch('https://app.polygon-one.com/api/articles', 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://app.polygon-one.com/api/articles",
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([
'name' => '<string>',
'internalArticleNr' => '<string>',
'hsCode' => '<string>',
'shortDescription' => '<string>',
'externalArticleNr' => '<string>',
'ean' => '<string>',
'supplierId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'supplierName' => '<string>',
'supplierEmail' => 'jsmith@example.com',
'acknowledgeWarnings' => true
]),
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://app.polygon-one.com/api/articles"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"internalArticleNr\": \"<string>\",\n \"hsCode\": \"<string>\",\n \"shortDescription\": \"<string>\",\n \"externalArticleNr\": \"<string>\",\n \"ean\": \"<string>\",\n \"supplierId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"supplierName\": \"<string>\",\n \"supplierEmail\": \"jsmith@example.com\",\n \"acknowledgeWarnings\": true\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://app.polygon-one.com/api/articles")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"internalArticleNr\": \"<string>\",\n \"hsCode\": \"<string>\",\n \"shortDescription\": \"<string>\",\n \"externalArticleNr\": \"<string>\",\n \"ean\": \"<string>\",\n \"supplierId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"supplierName\": \"<string>\",\n \"supplierEmail\": \"jsmith@example.com\",\n \"acknowledgeWarnings\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.polygon-one.com/api/articles")
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 \"name\": \"<string>\",\n \"internalArticleNr\": \"<string>\",\n \"hsCode\": \"<string>\",\n \"shortDescription\": \"<string>\",\n \"externalArticleNr\": \"<string>\",\n \"ean\": \"<string>\",\n \"supplierId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"supplierName\": \"<string>\",\n \"supplierEmail\": \"jsmith@example.com\",\n \"acknowledgeWarnings\": true\n}"
response = http.request(request)
puts response.read_body{
"article": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"internalArticleNr": "<string>",
"externalArticleNr": "<string>",
"hsCode": "<string>",
"ean": "<string>",
"shortDescription": "<string>",
"eudrRelevant": true,
"articleType": "purchase",
"commodityGroup": "cattle",
"suppliers": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"email": "<string>",
"contactName": "<string>",
"country": "<string>",
"externalSupplierId": "<string>",
"address": {
"street": "<string>",
"postalCode": "<string>",
"city": "<string>",
"additional": "<string>",
"validated": true,
"latitude": 123,
"longitude": 123
},
"status": "data_incomplete",
"isCompanySelf": true,
"articles": "<array>"
}
],
"complianceResults": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"supplierArticleId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"overallStatus": "compliant",
"geoStatus": "compliant",
"legalStatus": "compliant",
"generatedReportUrl": "<string>",
"generatedAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
],
"countryOfProduction": "<string>"
}
}{
"jobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "queued",
"statusUrl": "/api/import-jobs/6f7a…"
}{
"error": "<string>",
"details": "<unknown>"
}{
"error": "<string>",
"details": "<unknown>"
}{
"error": "<string>",
"details": "<unknown>"
}{
"error": "batchTooLarge",
"maxBatchSize": 5000
}{
"error": "<string>",
"details": "<unknown>"
}Create Article
Create a single article (synchronous), or bulk-import articles (asynchronous). For purchase articles, a supplier must be specified (via supplierId or supplierName). Sale articles are automatically linked to your company. Batch rows upsert idempotently on internalArticleNr. Batch form (array, or {"rows": […]} envelope, max 5000 rows) is asynchronous: it stages an import job and returns 202 with a jobId — poll GET /api/import-jobs/{jobId} for progress and the final result. A single object stays synchronous (201). See the Batch Import guide.
curl --request POST \
--url https://app.polygon-one.com/api/articles \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"internalArticleNr": "<string>",
"hsCode": "<string>",
"shortDescription": "<string>",
"externalArticleNr": "<string>",
"ean": "<string>",
"supplierId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"supplierName": "<string>",
"supplierEmail": "jsmith@example.com",
"acknowledgeWarnings": true
}
'import requests
url = "https://app.polygon-one.com/api/articles"
payload = {
"name": "<string>",
"internalArticleNr": "<string>",
"hsCode": "<string>",
"shortDescription": "<string>",
"externalArticleNr": "<string>",
"ean": "<string>",
"supplierId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"supplierName": "<string>",
"supplierEmail": "jsmith@example.com",
"acknowledgeWarnings": True
}
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({
name: '<string>',
internalArticleNr: '<string>',
hsCode: '<string>',
shortDescription: '<string>',
externalArticleNr: '<string>',
ean: '<string>',
supplierId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
supplierName: '<string>',
supplierEmail: 'jsmith@example.com',
acknowledgeWarnings: true
})
};
fetch('https://app.polygon-one.com/api/articles', 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://app.polygon-one.com/api/articles",
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([
'name' => '<string>',
'internalArticleNr' => '<string>',
'hsCode' => '<string>',
'shortDescription' => '<string>',
'externalArticleNr' => '<string>',
'ean' => '<string>',
'supplierId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'supplierName' => '<string>',
'supplierEmail' => 'jsmith@example.com',
'acknowledgeWarnings' => true
]),
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://app.polygon-one.com/api/articles"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"internalArticleNr\": \"<string>\",\n \"hsCode\": \"<string>\",\n \"shortDescription\": \"<string>\",\n \"externalArticleNr\": \"<string>\",\n \"ean\": \"<string>\",\n \"supplierId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"supplierName\": \"<string>\",\n \"supplierEmail\": \"jsmith@example.com\",\n \"acknowledgeWarnings\": true\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://app.polygon-one.com/api/articles")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"internalArticleNr\": \"<string>\",\n \"hsCode\": \"<string>\",\n \"shortDescription\": \"<string>\",\n \"externalArticleNr\": \"<string>\",\n \"ean\": \"<string>\",\n \"supplierId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"supplierName\": \"<string>\",\n \"supplierEmail\": \"jsmith@example.com\",\n \"acknowledgeWarnings\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.polygon-one.com/api/articles")
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 \"name\": \"<string>\",\n \"internalArticleNr\": \"<string>\",\n \"hsCode\": \"<string>\",\n \"shortDescription\": \"<string>\",\n \"externalArticleNr\": \"<string>\",\n \"ean\": \"<string>\",\n \"supplierId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"supplierName\": \"<string>\",\n \"supplierEmail\": \"jsmith@example.com\",\n \"acknowledgeWarnings\": true\n}"
response = http.request(request)
puts response.read_body{
"article": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"internalArticleNr": "<string>",
"externalArticleNr": "<string>",
"hsCode": "<string>",
"ean": "<string>",
"shortDescription": "<string>",
"eudrRelevant": true,
"articleType": "purchase",
"commodityGroup": "cattle",
"suppliers": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"email": "<string>",
"contactName": "<string>",
"country": "<string>",
"externalSupplierId": "<string>",
"address": {
"street": "<string>",
"postalCode": "<string>",
"city": "<string>",
"additional": "<string>",
"validated": true,
"latitude": 123,
"longitude": 123
},
"status": "data_incomplete",
"isCompanySelf": true,
"articles": "<array>"
}
],
"complianceResults": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"supplierArticleId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"overallStatus": "compliant",
"geoStatus": "compliant",
"legalStatus": "compliant",
"generatedReportUrl": "<string>",
"generatedAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
],
"countryOfProduction": "<string>"
}
}{
"jobId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "queued",
"statusUrl": "/api/import-jobs/6f7a…"
}{
"error": "<string>",
"details": "<unknown>"
}{
"error": "<string>",
"details": "<unknown>"
}{
"error": "<string>",
"details": "<unknown>"
}{
"error": "batchTooLarge",
"maxBatchSize": 5000
}{
"error": "<string>",
"details": "<unknown>"
}Authorizations
API key generated in Settings > API Keys. Include as Authorization: Bearer <key>.
Body
- Option 1 · object
- Option 2 · object[]
- Option 3 · object
Article name
Internal article number (must be unique per company)
HS code — EUDR relevance and commodity group are determined automatically
Defaults to purchase. Sale articles are automatically linked to your company as supplier.
purchase, sale Link to an existing supplier. Required for purchase articles if supplierName is not provided.
Supplier name. Used to find or create a supplier if supplierId is not provided. Required for purchase articles if supplierId is not provided.
Optional supplier contact email. Used when creating a new supplier via supplierName.
Set to true to override soft duplicate warnings. If omitted/false and the article triggers a soft warning (duplicate name, duplicate EAN, or HS-code ↔ description mismatch), the request returns 409 with a machine-readable warnings array instead of creating the article. A hard duplicate of internalArticleNr always returns 409 and cannot be overridden.
Response
Article created successfully (single)
Show child attributes
Show child attributes