curl --request POST \
--url https://app.polygon-one.com/api/v1/orders/{id}/origin-confirmation \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"supplierArticleIds": [
"2e8f6a3c-9d17-4b52-8c4a-7f1e3d9b0a65"
]
}
'import requests
url = "https://app.polygon-one.com/api/v1/orders/{id}/origin-confirmation"
payload = { "supplierArticleIds": ["2e8f6a3c-9d17-4b52-8c4a-7f1e3d9b0a65"] }
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({supplierArticleIds: ['2e8f6a3c-9d17-4b52-8c4a-7f1e3d9b0a65']})
};
fetch('https://app.polygon-one.com/api/v1/orders/{id}/origin-confirmation', 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/v1/orders/{id}/origin-confirmation",
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([
'supplierArticleIds' => [
'2e8f6a3c-9d17-4b52-8c4a-7f1e3d9b0a65'
]
]),
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/v1/orders/{id}/origin-confirmation"
payload := strings.NewReader("{\n \"supplierArticleIds\": [\n \"2e8f6a3c-9d17-4b52-8c4a-7f1e3d9b0a65\"\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://app.polygon-one.com/api/v1/orders/{id}/origin-confirmation")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"supplierArticleIds\": [\n \"2e8f6a3c-9d17-4b52-8c4a-7f1e3d9b0a65\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.polygon-one.com/api/v1/orders/{id}/origin-confirmation")
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 \"supplierArticleIds\": [\n \"2e8f6a3c-9d17-4b52-8c4a-7f1e3d9b0a65\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": "queued",
"orderId": "1b7f3e9d-4a26-4c85-b9e1-5d0a8c3f7e42",
"supplierArticleCount": 1
}{
"error": "Validation failed",
"details": [
{
"origin": "string",
"code": "too_small",
"minimum": 1,
"inclusive": true,
"path": [
"address",
"street"
],
"message": "Address is required."
}
]
}{
"error": "Invalid or expired API key"
}{
"error": "Forbidden"
}{
"error": "Resource not found"
}{
"error": "Every supplier article must have at least one live plot",
"code": "origin_confirmation_plots_missing"
}{
"error": {
"code": "rate_limited",
"message": "…"
}
}{
"error": "Internal server error"
}Request Supplier Origin Confirmation
Call this after uploading all current buyer-provided plots for the selected lines of one order. The supplier is asked to attest the current origin data; previous-order data is not copied and buyer authorship is preserved. Every supplierArticleId must be a live, EUDR-relevant link for an article line of this exact order and its supplier, and every target must already have a live plot. Validation is all-or-nothing. Requires orders:write and the tenant’s per-order origin-confirmation automation to be enabled. Before queueing, the endpoint durably fences the selected targets against any previous-order copy. A successful 202 means queued; request publication and email delivery are asynchronous. An enqueue failure is a 500, never a misleading 202; the durable fence remains safe for an idempotent retry. Repeating the same finalization merges into the active supplier request and does not send another creation email.
curl --request POST \
--url https://app.polygon-one.com/api/v1/orders/{id}/origin-confirmation \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"supplierArticleIds": [
"2e8f6a3c-9d17-4b52-8c4a-7f1e3d9b0a65"
]
}
'import requests
url = "https://app.polygon-one.com/api/v1/orders/{id}/origin-confirmation"
payload = { "supplierArticleIds": ["2e8f6a3c-9d17-4b52-8c4a-7f1e3d9b0a65"] }
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({supplierArticleIds: ['2e8f6a3c-9d17-4b52-8c4a-7f1e3d9b0a65']})
};
fetch('https://app.polygon-one.com/api/v1/orders/{id}/origin-confirmation', 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/v1/orders/{id}/origin-confirmation",
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([
'supplierArticleIds' => [
'2e8f6a3c-9d17-4b52-8c4a-7f1e3d9b0a65'
]
]),
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/v1/orders/{id}/origin-confirmation"
payload := strings.NewReader("{\n \"supplierArticleIds\": [\n \"2e8f6a3c-9d17-4b52-8c4a-7f1e3d9b0a65\"\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://app.polygon-one.com/api/v1/orders/{id}/origin-confirmation")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"supplierArticleIds\": [\n \"2e8f6a3c-9d17-4b52-8c4a-7f1e3d9b0a65\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.polygon-one.com/api/v1/orders/{id}/origin-confirmation")
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 \"supplierArticleIds\": [\n \"2e8f6a3c-9d17-4b52-8c4a-7f1e3d9b0a65\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": "queued",
"orderId": "1b7f3e9d-4a26-4c85-b9e1-5d0a8c3f7e42",
"supplierArticleCount": 1
}{
"error": "Validation failed",
"details": [
{
"origin": "string",
"code": "too_small",
"minimum": 1,
"inclusive": true,
"path": [
"address",
"street"
],
"message": "Address is required."
}
]
}{
"error": "Invalid or expired API key"
}{
"error": "Forbidden"
}{
"error": "Resource not found"
}{
"error": "Every supplier article must have at least one live plot",
"code": "origin_confirmation_plots_missing"
}{
"error": {
"code": "rate_limited",
"message": "…"
}
}{
"error": "Internal server error"
}Authorizations
API key generated in Settings > API Keys. Include as Authorization: Bearer <key>.
Path Parameters
Body
Live supplier-article links on this exact order whose current buyer-provided origin data is complete.
Response
Origin confirmation queued
The confirmation request was accepted for asynchronous processing.
queued The exact order whose current origin data will be presented to the supplier.
Number of distinct supplier-article targets queued.