curl --request POST \
--url https://app.polygon-one.com/api/plots \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Fazenda Boa Vista – Parzelle 3",
"country": "BR",
"commodityGroup": "coffee",
"size": 2.4,
"producerName": "Fazenda Boa Vista Ltda.",
"productionDateFrom": "2026-01-01",
"productionDateTo": "2026-06-30",
"geojson": {
"type": "Polygon",
"coordinates": [
[
[
-47.0601,
-21.1802
],
[
-47.0589,
-21.1802
],
[
-47.0589,
-21.1815
],
[
-47.0601,
-21.1815
],
[
-47.0601,
-21.1802
]
]
]
}
}
'import requests
url = "https://app.polygon-one.com/api/plots"
payload = {
"name": "Fazenda Boa Vista – Parzelle 3",
"country": "BR",
"commodityGroup": "coffee",
"size": 2.4,
"producerName": "Fazenda Boa Vista Ltda.",
"productionDateFrom": "2026-01-01",
"productionDateTo": "2026-06-30",
"geojson": {
"type": "Polygon",
"coordinates": [[[-47.0601, -21.1802], [-47.0589, -21.1802], [-47.0589, -21.1815], [-47.0601, -21.1815], [-47.0601, -21.1802]]]
}
}
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: 'Fazenda Boa Vista – Parzelle 3',
country: 'BR',
commodityGroup: 'coffee',
size: 2.4,
producerName: 'Fazenda Boa Vista Ltda.',
productionDateFrom: '2026-01-01',
productionDateTo: '2026-06-30',
geojson: {
type: 'Polygon',
coordinates: [
[
[-47.0601, -21.1802],
[-47.0589, -21.1802],
[-47.0589, -21.1815],
[-47.0601, -21.1815],
[-47.0601, -21.1802]
]
]
}
})
};
fetch('https://app.polygon-one.com/api/plots', 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/plots",
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' => 'Fazenda Boa Vista – Parzelle 3',
'country' => 'BR',
'commodityGroup' => 'coffee',
'size' => 2.4,
'producerName' => 'Fazenda Boa Vista Ltda.',
'productionDateFrom' => '2026-01-01',
'productionDateTo' => '2026-06-30',
'geojson' => [
'type' => 'Polygon',
'coordinates' => [
[
[
-47.0601,
-21.1802
],
[
-47.0589,
-21.1802
],
[
-47.0589,
-21.1815
],
[
-47.0601,
-21.1815
],
[
-47.0601,
-21.1802
]
]
]
]
]),
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/plots"
payload := strings.NewReader("{\n \"name\": \"Fazenda Boa Vista – Parzelle 3\",\n \"country\": \"BR\",\n \"commodityGroup\": \"coffee\",\n \"size\": 2.4,\n \"producerName\": \"Fazenda Boa Vista Ltda.\",\n \"productionDateFrom\": \"2026-01-01\",\n \"productionDateTo\": \"2026-06-30\",\n \"geojson\": {\n \"type\": \"Polygon\",\n \"coordinates\": [\n [\n [\n -47.0601,\n -21.1802\n ],\n [\n -47.0589,\n -21.1802\n ],\n [\n -47.0589,\n -21.1815\n ],\n [\n -47.0601,\n -21.1815\n ],\n [\n -47.0601,\n -21.1802\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://app.polygon-one.com/api/plots")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Fazenda Boa Vista – Parzelle 3\",\n \"country\": \"BR\",\n \"commodityGroup\": \"coffee\",\n \"size\": 2.4,\n \"producerName\": \"Fazenda Boa Vista Ltda.\",\n \"productionDateFrom\": \"2026-01-01\",\n \"productionDateTo\": \"2026-06-30\",\n \"geojson\": {\n \"type\": \"Polygon\",\n \"coordinates\": [\n [\n [\n -47.0601,\n -21.1802\n ],\n [\n -47.0589,\n -21.1802\n ],\n [\n -47.0589,\n -21.1815\n ],\n [\n -47.0601,\n -21.1815\n ],\n [\n -47.0601,\n -21.1802\n ]\n ]\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.polygon-one.com/api/plots")
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\": \"Fazenda Boa Vista – Parzelle 3\",\n \"country\": \"BR\",\n \"commodityGroup\": \"coffee\",\n \"size\": 2.4,\n \"producerName\": \"Fazenda Boa Vista Ltda.\",\n \"productionDateFrom\": \"2026-01-01\",\n \"productionDateTo\": \"2026-06-30\",\n \"geojson\": {\n \"type\": \"Polygon\",\n \"coordinates\": [\n [\n [\n -47.0601,\n -21.1802\n ],\n [\n -47.0589,\n -21.1802\n ],\n [\n -47.0589,\n -21.1815\n ],\n [\n -47.0601,\n -21.1815\n ],\n [\n -47.0601,\n -21.1802\n ]\n ]\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"created": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"companyId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"createdByUserId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"country": "<string>",
"size": 123,
"requiresAreaPlausibilityReview": true,
"species": [
{
"commonName": "<string>",
"scientificName": "<string>"
}
],
"commodityGroup": "cattle",
"producerName": "<string>",
"productionDateFrom": "2023-11-07T05:31:56Z",
"productionDateTo": "2023-11-07T05:31:56Z",
"analysisStatus": "pending",
"deforestationRiskResult": 0,
"forestPercentage": 123,
"isDegraded": true,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"geojson": {},
"supplierArticleIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"importSourceFormat": "<string>",
"importPrecisionClass": "<string>",
"importPrecisionDigits": 123,
"importPrecisionAcceptedAt": "2023-11-07T05:31:56Z",
"importPrecisionAcceptedBy": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"importPrecisionAcceptedByName": "<string>",
"importOriginalCentroidLng": 123,
"importOriginalCentroidLat": 123
},
"deduplicated": true,
"updated": true
}{
"error": "<string>",
"details": "<unknown>"
}{
"error": "<string>",
"details": "<unknown>"
}{
"error": "<string>",
"details": "<unknown>"
}{
"error": "<string>",
"details": "<unknown>"
}Parzelle erstellen
Create a plot. Requires plots:write. A new plot starts with analysisStatus: pending; the deforestation analysis runs asynchronously — read the result later with GET /api/plots/{id}.
Server-owned fields are ignored. The request cannot set an analysis status, analysis or risk result, timestamps or image data.
Idempotent retry. If your company already has a plot with the same name and country (case and whitespace ignored), the same geometry and exactly the same set of supplierArticleIds, no second plot is created and no second analysis is run: the answer is again 201, with deduplicated: true and the stored plot in created. Non-empty producerName, productionDateFrom, productionDateTo and species from the request are applied to the stored plot where they differ (updated: true); empty or omitted values never clear a stored value. Name, country, geometry, links, size and commodity group of the stored plot stay unchanged. A fresh create answers { "created": …, "deduplicated": false }.
Linking. Pass supplierArticleIds on creation, or create the plot first and link it with PATCH /api/plots/{id}. Supplier-article ids are in supplierArticles[].id of GET /api/suppliers and GET /api/suppliers/{id}.
curl --request POST \
--url https://app.polygon-one.com/api/plots \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Fazenda Boa Vista – Parzelle 3",
"country": "BR",
"commodityGroup": "coffee",
"size": 2.4,
"producerName": "Fazenda Boa Vista Ltda.",
"productionDateFrom": "2026-01-01",
"productionDateTo": "2026-06-30",
"geojson": {
"type": "Polygon",
"coordinates": [
[
[
-47.0601,
-21.1802
],
[
-47.0589,
-21.1802
],
[
-47.0589,
-21.1815
],
[
-47.0601,
-21.1815
],
[
-47.0601,
-21.1802
]
]
]
}
}
'import requests
url = "https://app.polygon-one.com/api/plots"
payload = {
"name": "Fazenda Boa Vista – Parzelle 3",
"country": "BR",
"commodityGroup": "coffee",
"size": 2.4,
"producerName": "Fazenda Boa Vista Ltda.",
"productionDateFrom": "2026-01-01",
"productionDateTo": "2026-06-30",
"geojson": {
"type": "Polygon",
"coordinates": [[[-47.0601, -21.1802], [-47.0589, -21.1802], [-47.0589, -21.1815], [-47.0601, -21.1815], [-47.0601, -21.1802]]]
}
}
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: 'Fazenda Boa Vista – Parzelle 3',
country: 'BR',
commodityGroup: 'coffee',
size: 2.4,
producerName: 'Fazenda Boa Vista Ltda.',
productionDateFrom: '2026-01-01',
productionDateTo: '2026-06-30',
geojson: {
type: 'Polygon',
coordinates: [
[
[-47.0601, -21.1802],
[-47.0589, -21.1802],
[-47.0589, -21.1815],
[-47.0601, -21.1815],
[-47.0601, -21.1802]
]
]
}
})
};
fetch('https://app.polygon-one.com/api/plots', 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/plots",
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' => 'Fazenda Boa Vista – Parzelle 3',
'country' => 'BR',
'commodityGroup' => 'coffee',
'size' => 2.4,
'producerName' => 'Fazenda Boa Vista Ltda.',
'productionDateFrom' => '2026-01-01',
'productionDateTo' => '2026-06-30',
'geojson' => [
'type' => 'Polygon',
'coordinates' => [
[
[
-47.0601,
-21.1802
],
[
-47.0589,
-21.1802
],
[
-47.0589,
-21.1815
],
[
-47.0601,
-21.1815
],
[
-47.0601,
-21.1802
]
]
]
]
]),
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/plots"
payload := strings.NewReader("{\n \"name\": \"Fazenda Boa Vista – Parzelle 3\",\n \"country\": \"BR\",\n \"commodityGroup\": \"coffee\",\n \"size\": 2.4,\n \"producerName\": \"Fazenda Boa Vista Ltda.\",\n \"productionDateFrom\": \"2026-01-01\",\n \"productionDateTo\": \"2026-06-30\",\n \"geojson\": {\n \"type\": \"Polygon\",\n \"coordinates\": [\n [\n [\n -47.0601,\n -21.1802\n ],\n [\n -47.0589,\n -21.1802\n ],\n [\n -47.0589,\n -21.1815\n ],\n [\n -47.0601,\n -21.1815\n ],\n [\n -47.0601,\n -21.1802\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://app.polygon-one.com/api/plots")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Fazenda Boa Vista – Parzelle 3\",\n \"country\": \"BR\",\n \"commodityGroup\": \"coffee\",\n \"size\": 2.4,\n \"producerName\": \"Fazenda Boa Vista Ltda.\",\n \"productionDateFrom\": \"2026-01-01\",\n \"productionDateTo\": \"2026-06-30\",\n \"geojson\": {\n \"type\": \"Polygon\",\n \"coordinates\": [\n [\n [\n -47.0601,\n -21.1802\n ],\n [\n -47.0589,\n -21.1802\n ],\n [\n -47.0589,\n -21.1815\n ],\n [\n -47.0601,\n -21.1815\n ],\n [\n -47.0601,\n -21.1802\n ]\n ]\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.polygon-one.com/api/plots")
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\": \"Fazenda Boa Vista – Parzelle 3\",\n \"country\": \"BR\",\n \"commodityGroup\": \"coffee\",\n \"size\": 2.4,\n \"producerName\": \"Fazenda Boa Vista Ltda.\",\n \"productionDateFrom\": \"2026-01-01\",\n \"productionDateTo\": \"2026-06-30\",\n \"geojson\": {\n \"type\": \"Polygon\",\n \"coordinates\": [\n [\n [\n -47.0601,\n -21.1802\n ],\n [\n -47.0589,\n -21.1802\n ],\n [\n -47.0589,\n -21.1815\n ],\n [\n -47.0601,\n -21.1815\n ],\n [\n -47.0601,\n -21.1802\n ]\n ]\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"created": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"companyId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"createdByUserId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"country": "<string>",
"size": 123,
"requiresAreaPlausibilityReview": true,
"species": [
{
"commonName": "<string>",
"scientificName": "<string>"
}
],
"commodityGroup": "cattle",
"producerName": "<string>",
"productionDateFrom": "2023-11-07T05:31:56Z",
"productionDateTo": "2023-11-07T05:31:56Z",
"analysisStatus": "pending",
"deforestationRiskResult": 0,
"forestPercentage": 123,
"isDegraded": true,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"geojson": {},
"supplierArticleIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"importSourceFormat": "<string>",
"importPrecisionClass": "<string>",
"importPrecisionDigits": 123,
"importPrecisionAcceptedAt": "2023-11-07T05:31:56Z",
"importPrecisionAcceptedBy": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"importPrecisionAcceptedByName": "<string>",
"importOriginalCentroidLng": 123,
"importOriginalCentroidLat": 123
},
"deduplicated": true,
"updated": true
}{
"error": "<string>",
"details": "<unknown>"
}{
"error": "<string>",
"details": "<unknown>"
}{
"error": "<string>",
"details": "<unknown>"
}{
"error": "<string>",
"details": "<unknown>"
}Autorisierungen
API key generated in Settings > API Keys. Include as Authorization: Bearer <key>.
Body
Fields read from the request body. Anything else — including server-owned fields such as id, analysisStatus, analysisResult, deforestationRiskResult, forestPercentage, isDegraded, imageWidth, imageHeight, pixelCoords, createdAt and updatedAt — is ignored.
Plot name. Part of the duplicate check (case and surrounding/multiple whitespace are ignored).
Country of production, ISO 3166-1 alpha-2 (e.g. BR). Part of the duplicate check.
Plot geometry as GeoJSON: a Feature or a bare Geometry (Polygon, MultiPolygon, Point, …) in WGS84 longitude/latitude. Coordinates outside longitude ±180 / latitude ±90 are rejected with 400, as is a geometry above the intake limits. A point is only accepted up to 4 ha (20,000 ha for cattle) when size is given; above that EUDR requires a polygon. Part of the duplicate check.
Area in hectares. Must be a finite number ≥ 0, otherwise 400.
x >= 0EUDR-regulated commodity groups. non_relevant = article is not covered by EUDR.
cattle, cocoa, coffee, oil_palm, rubber, soya, wood, non_relevant Tree species. Each entry needs both a common and a scientific name, otherwise 400. Required (at least one scientific name) when commodityGroup is wood.
500Show child attributes
Show child attributes
Legacy single-species shorthand, used only when species is empty. Prefer species.
Name of the producer.
Start of the production period (YYYY-MM-DD).
End of the production period (YYYY-MM-DD).
Supplier articles to link the plot to on creation (optional; duplicates are collapsed). Every id must belong to your company, otherwise 403. Part of the duplicate check: the same plot with a different set of links is a new plot. If commodityGroup is missing or non_relevant, it is derived from the linked articles.
5000Antwort
Plot created, or an identical plot already existed (see deduplicated)
A single plot as returned to an API key. The full analysis payload (analysisResult) and the image-space fields (pixelCoords, imageWidth, imageHeight) are not part of the API response.
Show child attributes
Show child attributes
false: a new plot was created and its analysis queued. true: an identical plot already existed; created is the stored plot and no second plot or analysis run was created.
Only when deduplicated is true: whether non-empty producerName, productionDateFrom, productionDateTo or species from the request were applied to the stored plot.