Logistics template
Shipping Label
4×6 inch standard shipping label with barcode and tracking number.
Free on every planLanguage: en
slug: shipping-labelRendered with sample data
01
Quick start
Reference the template by its slug and pass your data. The same call works from any language; pick whichever fits your stack. Replace $KAMY_API_KEY with a key from the dashboard.
curl
curl https://kamy.dev/api/v1/render \
-H "Authorization: Bearer $KAMY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"templateSlug": "shipping-label",
"data": {
"carrier": "UPS Ground",
"serviceType": "2 Day",
"trackingNumber": "1Z 999 AA1 0123 4567 84",
"from": {
"name": "Acme Studio",
"street": "1234 Market Street",
"city": "San Francisco",
"state": "CA",
"zip": "94103",
"country": "USA"
},
"to": {
"name": "Jordan Avery",
"street": "500 Pine Avenue, Suite 200",
"city": "Seattle",
"state": "WA",
"zip": "98101",
"country": "USA"
},
"weight": 3.4,
"weightUnit": "lb",
"dimensions": "12 × 9 × 4 in",
"shipDate": "2026-04-22"
}
}'node.js
import { Kamy } from "@kamydev/sdk";
const kamy = new Kamy({ apiKey: process.env.KAMY_API_KEY! });
const { url } = await kamy.render({
templateSlug: "shipping-label",
data: {
"carrier": "UPS Ground",
"serviceType": "2 Day",
"trackingNumber": "1Z 999 AA1 0123 4567 84",
"from": {
"name": "Acme Studio",
"street": "1234 Market Street",
"city": "San Francisco",
"state": "CA",
"zip": "94103",
"country": "USA"
},
"to": {
"name": "Jordan Avery",
"street": "500 Pine Avenue, Suite 200",
"city": "Seattle",
"state": "WA",
"zip": "98101",
"country": "USA"
},
"weight": 3.4,
"weightUnit": "lb",
"dimensions": "12 × 9 × 4 in",
"shipDate": "2026-04-22"
},
});
console.log(url); // signed URL, valid for 1 hourpython
import os, requests
resp = requests.post(
"https://kamy.dev/api/v1/render",
headers={"Authorization": f"Bearer {os.environ['KAMY_API_KEY']}"},
json={
"templateSlug": "shipping-label",
"data": {
"carrier": "UPS Ground",
"serviceType": "2 Day",
"trackingNumber": "1Z 999 AA1 0123 4567 84",
"from": {
"name": "Acme Studio",
"street": "1234 Market Street",
"city": "San Francisco",
"state": "CA",
"zip": "94103",
"country": "USA"
},
"to": {
"name": "Jordan Avery",
"street": "500 Pine Avenue, Suite 200",
"city": "Seattle",
"state": "WA",
"zip": "98101",
"country": "USA"
},
"weight": 3.4,
"weightUnit": "lb",
"dimensions": "12 × 9 × 4 in",
"shipDate": "2026-04-22"
},
},
)
resp.raise_for_status()
print(resp.json()["url"])02
Sample payload
The full sample data the live preview above renders from. Use it as a starting point for your own integration — every field is optional except those marked required in the schema below.
json
{
"carrier": "UPS Ground",
"serviceType": "2 Day",
"trackingNumber": "1Z 999 AA1 0123 4567 84",
"from": {
"name": "Acme Studio",
"street": "1234 Market Street",
"city": "San Francisco",
"state": "CA",
"zip": "94103",
"country": "USA"
},
"to": {
"name": "Jordan Avery",
"street": "500 Pine Avenue, Suite 200",
"city": "Seattle",
"state": "WA",
"zip": "98101",
"country": "USA"
},
"weight": 3.4,
"weightUnit": "lb",
"dimensions": "12 × 9 × 4 in",
"shipDate": "2026-04-22"
}03
JSON Schema
The render endpoint validates your payload against this JSON Schema before queuing the render. Validation errors come back with HTTP 400 and a VALIDATION_FAILED code listing every offending path.
json
{
"type": "object",
"required": [
"from",
"to",
"trackingNumber"
],
"properties": {
"from": {
"type": "object",
"required": [
"name",
"address"
],
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"address": {
"type": "array",
"minItems": 1,
"items": {
"type": "string"
}
}
}
},
"to": {
"type": "object",
"required": [
"name",
"address"
],
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"address": {
"type": "array",
"minItems": 1,
"items": {
"type": "string"
}
}
}
},
"trackingNumber": {
"type": "string",
"minLength": 1
},
"service": {
"type": "string"
},
"weight": {
"type": "string"
},
"barcodeUrl": {
"type": "string",
"format": "uri"
}
}
}