Ship Toolkit API
호스팅된 라벨 및 PDF 엔드포인트는 HTTPS를 통해 JSON을 받고 생성된 PDF 파일을 직접 반환합니다. API 키는 소스 코드에 넣지 말고 bearer 토큰으로 보내세요.
빠른 시작
기본 URLhttps://shiptoolkit.com
메서드POST 호스팅 생성 API용
인증Authorization: Bearer <api-key>
본문Content-Type: application/json
멱등성Idempotency-Key: <unique value>
성공application/pdf
호스팅된 라벨 및 PDF API에는 API 키가 필요합니다. 액세스를 요청하려면 다음으로 문의하세요:
shiptoolkit@element-express.com.
성공한 PDF 응답에는 Content-Disposition, X-Page-Count,
X-Content-SHA256 및 다음 중 하나가 포함됩니다: X-Label-Type 또는 X-PDF-Operation. 오류 응답은 다음 필드가 있는 JSON입니다: error .
{
"standardLabelSize": [
"2.00x1.00",
"2.25x1.25",
"2.50x1.00",
"3.00x1.00",
"3.00x1.50",
"3.00x2.00",
"4.00x2.00",
"50x30mm",
"60x30mm",
"60x40mm"
],
"cartonMarkLabelSize": ["6x4", "4x4", "4x3", "4x2"]
}
Python 도우미
import base64
import json
import os
import uuid
import urllib.request
from pathlib import Path
BASE_URL = "https://shiptoolkit.com"
API_KEY = os.environ["SHIPTOOLKIT_API_KEY"]
def post_pdf(path, payload, output_file):
request = urllib.request.Request(
BASE_URL + path,
data=json.dumps(payload).encode("utf-8"),
method="POST",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
"Idempotency-Key": str(uuid.uuid4()),
"User-Agent": "ShipToolkit-API-Example/1.0",
},
)
with urllib.request.urlopen(request, timeout=60) as response:
pdf = response.read()
if not pdf.startswith(b"%PDF-"):
raise RuntimeError("Ship Toolkit returned a non-PDF response.")
Path(output_file).write_bytes(pdf)
def pdf_base64(filename):
return base64.b64encode(Path(filename).read_bytes()).decode("ascii")
Java 도우미
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;
import java.util.UUID;
class ShipToolkitApi {
static final String BASE_URL = "https://shiptoolkit.com";
static final String API_KEY = System.getenv("SHIPTOOLKIT_API_KEY");
static final HttpClient CLIENT = HttpClient.newHttpClient();
static void postPdf(String path, String json, Path outputFile)
throws IOException, InterruptedException {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(BASE_URL + path))
.header("Authorization", "Bearer " + API_KEY)
.header("Content-Type", "application/json")
.header("Idempotency-Key", UUID.randomUUID().toString())
.header("User-Agent", "ShipToolkit-API-Example/1.0")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse<byte[]> response = CLIENT.send(
request,
HttpResponse.BodyHandlers.ofByteArray()
);
if (response.statusCode() != 200) {
throw new IOException("Ship Toolkit API failed: " + response.statusCode());
}
Files.write(outputFile, response.body());
}
static String pdfBase64(Path file) throws IOException {
return Base64.getEncoder().encodeToString(Files.readAllBytes(file));
}
}
라벨 API
이 엔드포인트는 PDF 라벨 파일을 반환하며 bearer API 키가 필요합니다.
POST /v1/labels/amazon-fnsku
10자 FNSKU로 Amazon 상품 라벨을 만듭니다.
| 필드 | 유형 | 필수 | 기본값 | 제약 조건 |
sku | string | true | - | pattern: ^[A-Z0-9]{10}$ |
model | string | true | - | maxLength: 240 |
title | string | true | - | maxLength: 500 |
madeIn | string | true | - | maxLength: 80 |
labelSize | enum | true | - | standardLabelSize |
oldSku | string | false | "" | maxLength: 128 |
productCondition | enum | false | "other" | ["new", "other"] |
Python
payload = {
"sku": "X001ABC123",
"model": "ABC-123",
"title": "Sample product",
"madeIn": "China",
"productCondition": "new",
"labelSize": "2.25x1.25",
"oldSku": "OLD-123",
}
post_pdf("/v1/labels/amazon-fnsku", payload, "amazon-fnsku.pdf")
Java
String json = """
{
"sku": "X001ABC123",
"model": "ABC-123",
"title": "Sample product",
"madeIn": "China",
"productCondition": "new",
"labelSize": "2.25x1.25",
"oldSku": "OLD-123"
}
""";
ShipToolkitApi.postPdf(
"/v1/labels/amazon-fnsku",
json,
Path.of("amazon-fnsku.pdf")
);
POST /v1/labels/amazon-fba-ups
Add text overlays to Amazon FBA and UPS labels, then return 4 x 6 inch output pages with optional scaling and duplicate copies.
| 필드 | 유형 | 필수 | 기본값 | 제약 조건 |
pdfBase64 | string | true | - | maxBytes: 7MB |
filename | string | false | "amazon-fba-ups-labels.pdf" | maxLength: 160 |
fbaText | string | false | "" | maxLength: 500 |
upsText | string | false | "" | maxLength: 500 |
scalePercent | number | false | 95 | min: 1, max: 100 |
twoFbaCopies | boolean | false | false | - |
twoUpsCopies | boolean | false | false | requires twoFbaCopies |
Python
payload = {
"pdfBase64": pdf_base64("fba-ups-source.pdf"),
"filename": "fba-ups-source.pdf",
"fbaText": "BOX 1",
"upsText": "CARTON A",
"scalePercent": 95,
"twoFbaCopies": False,
"twoUpsCopies": False,
}
post_pdf("/v1/labels/amazon-fba-ups", payload, "fba-ups-labels.pdf")
Java
String source = ShipToolkitApi.pdfBase64(Path.of("fba-ups-source.pdf"));
String json = """
{
"pdfBase64": "%s",
"filename": "fba-ups-source.pdf",
"fbaText": "BOX 1",
"upsText": "CARTON A",
"scalePercent": 95
}
""".formatted(source);
ShipToolkitApi.postPdf(
"/v1/labels/amazon-fba-ups",
json,
Path.of("fba-ups-labels.pdf")
);
Source pages may be native 4 x 6, 4.25 x 6, or US Letter pages with two labels. US Letter pages use the built-in two-label crop layout.
POST /v1/labels/walmart-sku
14자리 Walmart SKU로 Walmart fulfillment 상품 라벨을 만듭니다.
| 필드 | 유형 | 필수 | 기본값 | 제약 조건 |
sku | string | true | - | pattern: ^\d{14}$ |
model | string | true | - | maxLength: 240 |
title | string | true | - | maxLength: 500 |
madeIn | string | true | - | maxLength: 80 |
labelSize | enum | true | - | standardLabelSize |
productCondition | enum | false | "other" | ["new", "other"] |
Python
payload = {
"sku": "12345678901234",
"model": "ShipToolkit-001",
"title": "Walmart fulfillment label",
"madeIn": "China",
"productCondition": "new",
"labelSize": "2.25x1.25",
}
post_pdf("/v1/labels/walmart-sku", payload, "walmart-sku.pdf")
Java
String json = """
{
"sku": "12345678901234",
"model": "ShipToolkit-001",
"title": "Walmart fulfillment label",
"madeIn": "China",
"productCondition": "new",
"labelSize": "2.25x1.25"
}
""";
ShipToolkitApi.postPdf(
"/v1/labels/walmart-sku",
json,
Path.of("walmart-sku.pdf")
);
POST /v1/labels/outbound-box
박스 바코드와 품목 요약이 포함된 간결한 출고 박스 라벨을 만듭니다.
| 필드 | 유형 | 필수 | 기본값 | 제약 조건 |
boxId | string | true | - | maxLength: 80 |
organization | string | true | - | maxLength: 160 |
items | array<object> | true | - | maxItems: 200 |
items[].sku | string | false | items[].model | maxLength: 128 |
items[].quantity | string|number | false | items[].qty | maxLength: 20 |
dimension | string | false | "" | maxLength: 120 |
weight | string | false | "" | maxLength: 120 |
labelSize | enum | false | "2.25x1.25" | standardLabelSize |
createBarcode | boolean | false | true | - |
barcodeValue | string | false | boxId | maxLength: 80 |
Python
payload = {
"boxId": "BOX-1001",
"organization": "Example Seller",
"dimension": "20 x 10 x 8 in",
"weight": "15 lbs",
"labelSize": "3.00x1.50",
"createBarcode": true,
"items": [
{"sku": "X001ABC123", "quantity": 4},
{"sku": "X001ABC456", "quantity": 2},
],
}
post_pdf("/v1/labels/outbound-box", payload, "outbound-box.pdf")
Java
String json = """
{
"boxId": "BOX-1001",
"organization": "Example Seller",
"dimension": "20 x 10 x 8 in",
"weight": "15 lbs",
"labelSize": "3.00x1.50",
"createBarcode": true,
"items": [
{"sku": "X001ABC123", "quantity": 4},
{"sku": "X001ABC456", "quantity": 2}
]
}
""";
ShipToolkitApi.postPdf(
"/v1/labels/outbound-box",
json,
Path.of("outbound-box.pdf")
);
POST /v1/labels/carton-mark
각 카톤마다 한 페이지씩 카톤 마크 라벨을 만듭니다.
| 필드 | 유형 | 필수 | 기본값 | 제약 조건 |
consignee | string | true | - | maxLength: 120 |
shipper | string | true | - | maxLength: 120 |
destinationAddress | string | true | - | maxLength: 500 |
orderNo | string | true | - | maxLength: 80 |
cartonTotal | integer | true | - | min: 1 |
quantity | string|number | true | - | maxLength: 80 |
productDescription | string | true | - | maxLength: 500 |
labelSize | enum | false | "6x4" | cartonMarkLabelSize |
barcodeValue | string | false | orderNo | maxLength: 120 |
cartonStart | integer | false | 1 | min: 1 |
Python
payload = {
"consignee": "Receiving Team",
"shipper": "Example Seller",
"destinationAddress": "123 Warehouse Way, Newark, DE 19713",
"orderNo": "PO-20260717-001",
"cartonTotal": 3,
"quantity": "50 PCS",
"productDescription": "Portable night light",
"labelSize": "6x4",
}
post_pdf("/v1/labels/carton-mark", payload, "carton-mark.pdf")
Java
String json = """
{
"consignee": "Receiving Team",
"shipper": "Example Seller",
"destinationAddress": "123 Warehouse Way, Newark, DE 19713",
"orderNo": "PO-20260717-001",
"cartonTotal": 3,
"quantity": "50 PCS",
"productDescription": "Portable night light",
"labelSize": "6x4"
}
""";
ShipToolkitApi.postPdf(
"/v1/labels/carton-mark",
json,
Path.of("carton-mark.pdf")
);
POST /v1/labels/transparency
FNSKU, 모델, 날짜, 대상 라벨 크기로 Amazon Transparency 라벨 PDF를 맞춤 설정합니다.
| 필드 | 유형 | 필수 | 기본값 | 제약 조건 |
pdfBase64 | string | true | - | maxBytes: 7MB |
fnsku | string | true | - | maxLength: 80 |
labelSize | enum | true | - | standardLabelSize |
model | string | false | "" | maxLength: 240 |
date | string | false | now | maxLength: 40 |
Python
payload = {
"pdfBase64": pdf_base64("transparency-source.pdf"),
"fnsku": "X001ABC123",
"model": "MODEL-1",
"date": "2026-07-17",
"labelSize": "2.25x1.25",
}
post_pdf("/v1/labels/transparency", payload, "transparency.pdf")
Java
String source = ShipToolkitApi.pdfBase64(Path.of("transparency-source.pdf"));
String json = """
{
"pdfBase64": "%s",
"fnsku": "X001ABC123",
"model": "MODEL-1",
"date": "2026-07-17",
"labelSize": "2.25x1.25"
}
""".formatted(source);
ShipToolkitApi.postPdf(
"/v1/labels/transparency",
json,
Path.of("transparency.pdf")
);
PDF API
이 엔드포인트는 변환된 PDF 파일을 반환하며 bearer API 키가 필요합니다.
POST /v1/pdf/resize
원본 내용을 자르지 않고 모든 페이지를 사전 설정 또는 사용자 지정 페이지 크기로 조정합니다.
| 필드 | 유형 | 필수 | 기본값 | 제약 조건 |
pdfBase64 | string | true | - | maxBytes: 7MB |
filename | string | false | "document.pdf" | maxLength: 160 |
size | enum | false | "letter" | "letter"|"legal"|"a4"|"4x6"|"custom" |
orientation | enum | false | "match" | "match"|"portrait"|"landscape" |
customWidth | number | false | - | required when size="custom" |
customHeight | number | false | - | required when size="custom" |
customUnit | enum | false | "in" | "in"|"mm" |
Python
payload = {
"pdfBase64": pdf_base64("source.pdf"),
"filename": "source.pdf",
"size": "custom",
"customWidth": 2.25,
"customHeight": 1.25,
"customUnit": "in",
}
post_pdf("/v1/pdf/resize", payload, "resized.pdf")
Java
String source = ShipToolkitApi.pdfBase64(Path.of("source.pdf"));
String json = """
{
"pdfBase64": "%s",
"filename": "source.pdf",
"size": "custom",
"customWidth": 2.25,
"customHeight": 1.25,
"customUnit": "in"
}
""".formatted(source);
ShipToolkitApi.postPdf("/v1/pdf/resize", json, Path.of("resized.pdf"));
POST /v1/pdf/scale
각 페이지 크기는 유지한 채 페이지 내용을 중심 기준으로 배율 조정합니다.
| 필드 | 유형 | 필수 | 기본값 | 제약 조건 |
pdfBase64 | string | true | - | maxBytes: 7MB |
filename | string | false | "document.pdf" | maxLength: 160 |
scalePercent | number | false | 100 | min: 1, max: 400 |
Python
payload = {
"pdfBase64": pdf_base64("source.pdf"),
"filename": "source.pdf",
"scalePercent": 82,
}
post_pdf("/v1/pdf/scale", payload, "scaled.pdf")
Java
String source = ShipToolkitApi.pdfBase64(Path.of("source.pdf"));
String json = """
{
"pdfBase64": "%s",
"filename": "source.pdf",
"scalePercent": 82
}
""".formatted(source);
ShipToolkitApi.postPdf("/v1/pdf/scale", json, Path.of("scaled.pdf"));