创建模板
将物品保存为模板(也会显示在应用中)。
字段和校验规则与 /v1/pack 中的物品相同。免费,不扣积分。
认证
请求体参数
application/jsonlabelstring必填显示标签。
shapestring物品形状。cylinder 和 drum 使用 radius + height,而非 length + width;pallet 和 drum 始终保持直立。
boxcylinderpalletbagdrum默认值 "box"lengthnumber · cm长度。除非 shape 为 cylinder 或 drum,否则必填。
widthnumber · cm宽度。除非 shape 为 cylinder 或 drum,否则必填。
heightnumber · cm必填高度(物品按定义摆放时的竖直边)。
radiusnumber · cm半径。shape 为 cylinder 或 drum 时必填。
weightnumber · kg必填单件物品的重量。
stackableboolean允许在其上方放置其他物品。
truemax_stack_weightnumber · kg单件物品上方可承受的最大重量。0 = 不限。
0rotationstringall = 六种朝向均可;upright = 只能绕竖直轴旋转(此面朝上);fixed = 不旋转。
alluprightfixed默认值 "all"hazardousboolean危险品:放在低处,并与其他危险品隔开。
falsepriorityinteger装载优先级。值越高越先装载,空间不足时优先保留。0 = 无。
0colorstring显示颜色,格式为 #rrggbb(仅用于查看器和 PDF)。
nesting_heightnumber · cm相同物品堆叠时相互嵌套的重叠高度(如可嵌套的周转箱、桶)。
0请求示例
curl -X POST "https://runner.cargoduo.com/v1/templates" \
-H "Authorization: Bearer $CARGODUO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"label": "Euro pallet",
"length": 120,
"width": 80,
"height": 140,
"weight": 450,
"stackable": false,
"color": "#3b82f6"
}'const res = await fetch("https://runner.cargoduo.com/v1/templates", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CARGODUO_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"label": "Euro pallet",
"length": 120,
"width": 80,
"height": 140,
"weight": 450,
"stackable": false,
"color": "#3b82f6"
}),
});
const data = await res.json();
console.log(res.status, data);import os
import requests
response = requests.post(
"https://runner.cargoduo.com/v1/templates",
headers={"Authorization": f"Bearer {os.environ['CARGODUO_API_KEY']}"},
json={
"label": "Euro pallet",
"length": 120,
"width": 80,
"height": 140,
"weight": 450,
"stackable": False,
"color": "#3b82f6",
},
)
print(response.status_code, response.json())package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
body := strings.NewReader(`{
"label": "Euro pallet",
"length": 120,
"width": 80,
"height": 140,
"weight": 450,
"stackable": false,
"color": "#3b82f6"
}`)
req, err := http.NewRequest("POST", "https://runner.cargoduo.com/v1/templates", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("CARGODUO_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.StatusCode, string(out))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
String body = """
{
"label": "Euro pallet",
"length": 120,
"width": 80,
"height": 140,
"weight": 450,
"stackable": false,
"color": "#3b82f6"
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://runner.cargoduo.com/v1/templates"))
.header("Authorization", "Bearer " + System.getenv("CARGODUO_API_KEY"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}using System.Net.Http.Headers;
using System.Text;
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("CARGODUO_API_KEY"));
var json = """
{
"label": "Euro pallet",
"length": 120,
"width": 80,
"height": 140,
"weight": 450,
"stackable": false,
"color": "#3b82f6"
}
""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://runner.cargoduo.com/v1/templates")
{
Content = new StringContent(json, Encoding.UTF8, "application/json"),
};
var response = await client.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");<?php
$payload = <<<'JSON'
{
"label": "Euro pallet",
"length": 120,
"width": 80,
"height": 140,
"weight": 450,
"stackable": false,
"color": "#3b82f6"
}
JSON;
$ch = curl_init('https://runner.cargoduo.com/v1/templates');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('CARGODUO_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => $payload,
]);
$response = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), ' ', $response, PHP_EOL;require "net/http"
require "uri"
uri = URI("https://runner.cargoduo.com/v1/templates")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer #{ENV.fetch("CARGODUO_API_KEY")}"
request["Content-Type"] = "application/json"
request.body = <<~'JSON'
{
"label": "Euro pallet",
"length": 120,
"width": 80,
"height": 140,
"weight": 450,
"stackable": false,
"color": "#3b82f6"
}
JSON
response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
http.request(request)
end
puts response.code, response.body响应示例
{
"id": "tpl_42",
"object": "template",
"label": "Euro pallet",
"shape": "box",
"length": 120,
"width": 80,
"height": 140,
"radius": 0,
"weight": 450,
"stackable": false,
"max_stack_weight": 0,
"rotation": "all",
"hazardous": false,
"priority": 0,
"color": "#3b82f6",
"nesting_height": 0,
"created_by": {
"id": "usr_7",
"name": "Elif Kaya"
},
"updated_by": {
"id": "usr_7",
"name": "Elif Kaya"
},
"created_at": "2026-09-28T14:05:52Z",
"updated_at": "2026-09-28T14:05:52Z"
}响应
201新建的模板。
名称类型必填说明idstringstring否模板 ID(tpl_…)。
objectstringstring否templatelabelstringstring否显示标签。
shapestringstring否物品形状。
cylinder和drum使用radius+height,而非length+width;pallet和drum始终保持直立。boxcylinderpalletbagdrumlengthnumber · cmnumber · cm否长度。除非
shape为cylinder或drum,否则必填。widthnumber · cmnumber · cm否宽度。除非
shape为cylinder或drum,否则必填。heightnumber · cmnumber · cm否高度(物品按定义摆放时的竖直边)。
radiusnumber · cmnumber · cm否半径。
shape为cylinder或drum时必填。weightnumber · kgnumber · kg否单件物品的重量。
stackablebooleanboolean否允许在其上方放置其他物品。
max_stack_weightnumber · kgnumber · kg否单件物品上方可承受的最大重量。0 = 不限。
rotationstringstring否all= 六种朝向均可;upright= 只能绕竖直轴旋转(此面朝上);fixed= 不旋转。alluprightfixedhazardousbooleanboolean否危险品:放在低处,并与其他危险品隔开。
priorityintegerinteger否装载优先级。值越高越先装载,空间不足时优先保留。0 = 无。
colorstringstring否显示颜色,格式为 #rrggbb(仅用于查看器和 PDF)。
nesting_heightnumber · cmnumber · cm否相同物品堆叠时相互嵌套的重叠高度(如可嵌套的周转箱、桶)。
created_byUserRef | nullUserRef | null否创建者(通过 API 调用时为创建该密钥的成员)。未知时为
null。idstringstring否成员 ID(usr_…)。可用 ?created_by= 筛选列表。
namestringstring否updated_byUserRef | nullUserRef | null否最后修改它的成员。
idstringstring否成员 ID(usr_…)。可用 ?created_by= 筛选列表。
namestringstring否created_atstringstring否RFC 3339 格式。
updated_atstringstring否RFC 3339 格式。
400Bad request
invalid_jsoninvalid_json请求体不是有效的 JSON,或某个字段类型错误。
全部错误码名称类型必填说明errorErrorBody必填ErrorBody是codestring必填string是机器可读的错误码(snake_case)。请根据它进行分支处理,切勿依据
message。messagestring必填string是英文说明。
request_idstring必填string是与 X-Request-Id 响应头相同。联系技术支持时请提供。
detailsErrorDetail[]ErrorDetail[]否逐字段列出的问题(
validation_failed)。pathstringstring否出错字段的 JSON 路径,例如 items[3].length。
codestringstring否required、invalid_value、out_of_range、duplicate_id、unknown_vehicle、unknown_template、type_not_allowed、unknown_group、does_not_fit、too_many_items、too_many_vehicles、unknown_field、invalid_json。messagestringstring否英文说明。
401Unauthorized
unauthorizedkey_revokedkey_expiredunauthorizedAPI 密钥缺失、格式错误或无法识别。key_revoked密钥已被撤销。key_expired密钥已过期。
全部错误码名称类型必填说明errorErrorBody必填ErrorBody是codestring必填string是机器可读的错误码(snake_case)。请根据它进行分支处理,切勿依据
message。messagestring必填string是英文说明。
request_idstring必填string是与 X-Request-Id 响应头相同。联系技术支持时请提供。
detailsErrorDetail[]ErrorDetail[]否逐字段列出的问题(
validation_failed)。pathstringstring否出错字段的 JSON 路径,例如 items[3].length。
codestringstring否required、invalid_value、out_of_range、duplicate_id、unknown_vehicle、unknown_template、type_not_allowed、unknown_group、does_not_fit、too_many_items、too_many_vehicles、unknown_field、invalid_json。messagestringstring否英文说明。
403Forbidden
ip_not_allowedsubscription_inactiveaccount_inactivescope_missingip_not_allowed调用方 IP 不在该密钥的 IP 白名单中。subscription_inactive组织没有包含 API 的有效订阅。account_inactive组织已被暂停使用,或其所有者的账户均未处于有效状态。scope_missing密钥缺少此接口所需的权限范围。
全部错误码名称类型必填说明errorErrorBody必填ErrorBody是codestring必填string是机器可读的错误码(snake_case)。请根据它进行分支处理,切勿依据
message。messagestring必填string是英文说明。
request_idstring必填string是与 X-Request-Id 响应头相同。联系技术支持时请提供。
detailsErrorDetail[]ErrorDetail[]否逐字段列出的问题(
validation_failed)。pathstringstring否出错字段的 JSON 路径,例如 items[3].length。
codestringstring否required、invalid_value、out_of_range、duplicate_id、unknown_vehicle、unknown_template、type_not_allowed、unknown_group、does_not_fit、too_many_items、too_many_vehicles、unknown_field、invalid_json。messagestringstring否英文说明。
413Payload too large
payload_too_largepayload_too_large请求体超过 10 MB。
全部错误码名称类型必填说明errorErrorBody必填ErrorBody是codestring必填string是机器可读的错误码(snake_case)。请根据它进行分支处理,切勿依据
message。messagestring必填string是英文说明。
request_idstring必填string是与 X-Request-Id 响应头相同。联系技术支持时请提供。
detailsErrorDetail[]ErrorDetail[]否逐字段列出的问题(
validation_failed)。pathstringstring否出错字段的 JSON 路径,例如 items[3].length。
codestringstring否required、invalid_value、out_of_range、duplicate_id、unknown_vehicle、unknown_template、type_not_allowed、unknown_group、does_not_fit、too_many_items、too_many_vehicles、unknown_field、invalid_json。messagestringstring否英文说明。
422Unprocessable entity
validation_failedvalidation_failed请求是格式正确的 JSON,但描述的任务无效。details[] 列出了所有问题。
全部错误码名称类型必填说明errorErrorBody必填ErrorBody是codestring必填string是机器可读的错误码(snake_case)。请根据它进行分支处理,切勿依据
message。messagestring必填string是英文说明。
request_idstring必填string是与 X-Request-Id 响应头相同。联系技术支持时请提供。
detailsErrorDetail[]ErrorDetail[]否逐字段列出的问题(
validation_failed)。pathstringstring否出错字段的 JSON 路径,例如 items[3].length。
codestringstring否required、invalid_value、out_of_range、duplicate_id、unknown_vehicle、unknown_template、type_not_allowed、unknown_group、does_not_fit、too_many_items、too_many_vehicles、unknown_field、invalid_json。messagestringstring否英文说明。
429Too many requests
rate_limitedrate_limited当前分钟、小时或天内的请求过多(按密钥或按组织计),或您的 IP 地址每分钟认证失败超过 60 次。
全部错误码名称类型必填说明errorErrorBody必填ErrorBody是codestring必填string是机器可读的错误码(snake_case)。请根据它进行分支处理,切勿依据
message。messagestring必填string是英文说明。
request_idstring必填string是与 X-Request-Id 响应头相同。联系技术支持时请提供。
detailsErrorDetail[]ErrorDetail[]否逐字段列出的问题(
validation_failed)。pathstringstring否出错字段的 JSON 路径,例如 items[3].length。
codestringstring否required、invalid_value、out_of_range、duplicate_id、unknown_vehicle、unknown_template、type_not_allowed、unknown_group、does_not_fit、too_many_items、too_many_vehicles、unknown_field、invalid_json。messagestringstring否英文说明。
500Internal server error
internal_errorinternal_error服务端发生内部错误。
全部错误码名称类型必填说明errorErrorBody必填ErrorBody是codestring必填string是机器可读的错误码(snake_case)。请根据它进行分支处理,切勿依据
message。messagestring必填string是英文说明。
request_idstring必填string是与 X-Request-Id 响应头相同。联系技术支持时请提供。
detailsErrorDetail[]ErrorDetail[]否逐字段列出的问题(
validation_failed)。pathstringstring否出错字段的 JSON 路径,例如 items[3].length。
codestringstring否required、invalid_value、out_of_range、duplicate_id、unknown_vehicle、unknown_template、type_not_allowed、unknown_group、does_not_fit、too_many_items、too_many_vehicles、unknown_field、invalid_json。messagestringstring否英文说明。
503Service unavailable
api_disabledapi_disabledAPI 暂时停用(维护中),或已对该组织关闭。
全部错误码名称类型必填说明errorErrorBody必填ErrorBody是codestring必填string是机器可读的错误码(snake_case)。请根据它进行分支处理,切勿依据
message。messagestring必填string是英文说明。
request_idstring必填string是与 X-Request-Id 响应头相同。联系技术支持时请提供。
detailsErrorDetail[]ErrorDetail[]否逐字段列出的问题(
validation_failed)。pathstringstring否出错字段的 JSON 路径,例如 items[3].length。
codestringstring否required、invalid_value、out_of_range、duplicate_id、unknown_vehicle、unknown_template、type_not_allowed、unknown_group、does_not_fit、too_many_items、too_many_vehicles、unknown_field、invalid_json。messagestringstring否英文说明。