API Ship Toolkit

Les endpoints hébergés pour les étiquettes et les PDF acceptent du JSON via HTTPS et renvoient directement les fichiers PDF générés. Gardez les clés d'API hors du code source et envoyez-les comme jetons bearer.

Démarrage rapide

URL de basehttps://shiptoolkit.com
MéthodePOST pour les API de génération hébergées
AuthentificationAuthorization: Bearer <api-key>
CorpsContent-Type: application/json
IdempotenceIdempotency-Key: <unique value>
Succèsapplication/pdf

Les API hébergées d'étiquettes et de PDF nécessitent une clé d'API. Pour demander l'accès, contactez shiptoolkit@element-express.com.

Les réponses PDF réussies incluent Content-Disposition, X-Page-Count, X-Content-SHA256, ainsi que X-Label-Type ou X-PDF-Operation. Les réponses d'erreur sont du JSON avec un champ 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"]
}

Assistant 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")

Assistant 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 d'étiquettes

Ces endpoints renvoient des fichiers PDF d'étiquettes et nécessitent une clé d'API bearer.

POST /v1/labels/amazon-fnsku

Créez une étiquette produit Amazon à partir d'un FNSKU de 10 caractères.

ChampTypeObligatoirePar défautContraintes
skustringtrue-pattern: ^[A-Z0-9]{10}$
modelstringtrue-maxLength: 240
titlestringtrue-maxLength: 500
madeInstringtrue-maxLength: 80
labelSizeenumtrue-standardLabelSize
oldSkustringfalse""maxLength: 128
productConditionenumfalse"new"["new", "used", "empty"]

productCondition accepts new, used, or empty case-insensitively. It prints Neuf ou Utilisé before the model. Use empty to print no condition text.

Python

payload = {
    "sku": "X001ABC123",
    "model": "ABC-123",
    "title": "Sample product",
    "madeIn": "China",
    "productCondition": "used",
    "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": "used",
  "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.

ChampTypeObligatoirePar défautContraintes
pdfBase64stringtrue-maxBytes: 7MB
filenamestringfalse"amazon-fba-ups-labels.pdf"maxLength: 160
fbaTextstringfalse""maxLength: 500
upsTextstringfalse""maxLength: 500
scalePercentnumberfalse95min: 1, max: 100
twoFbaCopiesbooleanfalsefalse-
twoUpsCopiesbooleanfalsefalserequires 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")
);

Les pages source peuvent être des étiquettes natives 4 x 6, 4,25 x 6 ou des pages US Letter avec deux étiquettes. Les fenêtres de recadrage US Letter sont élargies, ajustées à nouveau dans des pages de sortie 4 x 6, puis le scalePercent demandé est appliqué depuis le centre de la page.

POST /v1/labels/walmart-gtin

Créez une étiquette produit Walmart GTIN à partir d'un SKU Walmart de 14 chiffres.

ChampTypeObligatoirePar défautContraintes
skustringtrue-pattern: ^\d{14}$
modelstringtrue-maxLength: 240
titlestringtrue-maxLength: 500
madeInstringtrue-maxLength: 80
labelSizeenumtrue-standardLabelSize
productConditionenumfalse"new"["new", "used", "empty"]

Python

payload = {
    "sku": "12345678901234",
    "model": "ShipToolkit-001",
    "title": "Walmart GTIN label",
    "madeIn": "China",
    "productCondition": "new",
    "labelSize": "2.25x1.25",
}
post_pdf("/v1/labels/walmart-gtin", payload, "walmart-gtin.pdf")

Java

String json = """
{
  "sku": "12345678901234",
  "model": "ShipToolkit-001",
  "title": "Walmart GTIN label",
  "madeIn": "China",
  "productCondition": "new",
  "labelSize": "2.25x1.25"
}
""";
ShipToolkitApi.postPdf(
    "/v1/labels/walmart-gtin",
    json,
    Path.of("walmart-gtin.pdf")
);

POST /v1/labels/outbound-box

Créez une étiquette compacte de colis sortant avec un code-barres de boîte et un résumé des articles.

ChampTypeObligatoirePar défautContraintes
boxIdstringtrue-maxLength: 80
organizationstringtrue-maxLength: 160
itemsarray<object>true-maxItems: 200
items[].skustringfalseitems[].model maxLength: 128
items[].quantitystring|numberfalseitems[].qtymaxLength: 20
dimensionstringfalse""maxLength: 120
weightstringfalse""maxLength: 120
labelSizeenumfalse"2.25x1.25"standardLabelSize
createBarcodebooleanfalsetrue-
barcodeValuestringfalseboxIdmaxLength: 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

Créez des étiquettes de marquage carton avec une page pour chaque carton.

ChampTypeObligatoirePar défautContraintes
consigneestringtrue-maxLength: 120
shipperstringtrue-maxLength: 120
destinationAddressstringtrue-maxLength: 500
orderNostringtrue-maxLength: 80
cartonTotalintegertrue-min: 1
quantitystring|numbertrue-maxLength: 80
productDescriptionstringtrue-maxLength: 500
labelSizeenumfalse"6x4"cartonMarkLabelSize
barcodeValuestringfalseorderNomaxLength: 120
cartonStartintegerfalse1min: 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

Personnalisez les PDF d'étiquettes Amazon Transparency avec FNSKU, modèle, date et taille d'étiquette cible.

ChampTypeObligatoirePar défautContraintes
pdfBase64stringtrue-maxBytes: 7MB
fnskustringtrue-maxLength: 80
labelSizeenumtrue-standardLabelSize
modelstringfalse""maxLength: 240
datestringfalsenowmaxLength: 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")
);

API PDF

Ces endpoints renvoient des fichiers PDF transformés et nécessitent une clé d'API bearer.

POST /v1/pdf/resize

Redimensionnez chaque page selon un format prédéfini ou personnalisé sans rogner le contenu source.

ChampTypeObligatoirePar défautContraintes
pdfBase64stringtrue-maxBytes: 7MB
filenamestringfalse"document.pdf"maxLength: 160
sizeenumfalse"letter""letter"|"legal"|"a4"|"a5"|"4x6"|"custom"
orientationenumfalse"match""match"|"portrait"|"landscape"
scaleModeenumfalse"preserve-original-size""preserve-original-size"|"fit-to-page"|"scale-down-only"
customWidthnumberfalse-required when size="custom"
customHeightnumberfalse-required when size="custom"
customUnitenumfalse"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

Mettez le contenu de la page à l'échelle autour du centre tout en conservant la taille de chaque page.

ChampTypeObligatoirePar défautContraintes
pdfBase64stringtrue-maxBytes: 7MB
filenamestringfalse"document.pdf"maxLength: 160
scalePercentnumberfalse100min: 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"));