Developer docs
The TegoPrint API
Create orders, read live ship promises, and get signed webhooks as work moves through our floor. Versioned by path; fields are only ever added.
Base URL https://tegoprint.com/api/v1
Auth Authorization: Bearer tego_…Authentication
Create a key in Settings → Developers. The full secret is shown once— only its SHA-256 hash is stored. Keys are org-scoped: every request reads and writes only your organization's data, and revocation is immediate.
curl https://tegoprint.com/api/v1/orders \
-H "Authorization: Bearer tego_YOUR_KEY"GET /catalog
The active blank catalog. Order items reference these variant SKUs.
{ "data": [ { "sku": "TEE-BC3001", "name": "Unisex Tee", "category": "tshirt",
"methods": ["dtf", "dtg"],
"variants": [ { "sku": "TEE-BC3001-BLK-M", "size": "M", "color": "Black",
"unit_cost_cents": 899, "weight_oz": 6 } ] } ] }GET /products
Your products — where you pick the product_id that carries artwork into an order. artwork_ready: true means orders placed with it open straight into production instead of waiting for artwork.
{ "data": [ {
"id": "…", "name": "Skyline Tee",
"blank": { "sku": "TEE-BC3001", "name": "Unisex Tee", "category": "tshirt" },
"retail_price_cents": 2499,
"artwork_ready": true,
"placements": [ { "key": "front", "name": "Front",
"design": { "id": "…", "name": "Skyline", "url": "…" } } ]
} ], "next_cursor": null }Orders
POST /orders creates an order; GET /orders and GET /orders/{id} read them (newest first, cursor-paginated with limit and cursor).
POST /api/v1/orders
{
"external_ref": "SHOP-1042", // idempotency key — safe to retry
"rush": true, // optional paid rush lane
"customer": { "name": "Jane Doe", "email": "jane@example.com" },
"shipping_address": { "street1": "100 Main St", "city": "Houston",
"state": "TX", "zip": "77057", "country": "US" },
"items": [ { "sku": "TEE-BC3001-BLK-M", "quantity": 2,
"product_id": "…" } ]
}
→ 201 Created
{ "data": { "id": "…", "status": "pending",
"ships_by": "2026-07-21", // live promise from the floor queue
"rush": true,
"packages": [], // fills as boxes ship
"tracking": null } }- Idempotent on external_ref — re-posting the same ref returns the existing order (200 +
"idempotent": true) instead of duplicating. - ships_byis computed from the real production queue (base turnaround for the order's slowest method + current load, business days) and goes
nullonce shipped. - rush: trueputs the order's jobs at the front of every queue and drops the queue adder from the promise; the flat fee debits your wallet.
- packages lists every box on multi-package shipments — tracking, label, weight, billed cost, and a
delivered_atstamp per box.
Webhooks
Register endpoint URLs in Settings → Developers for order.created, order.shipped, order.delivered, order.cancelled(none selected = all). Deliveries POST the serialized order and are signed with your endpoint's secret:
X-Tego-Event: order.shipped
X-Tego-Delivery: <delivery id>
X-Tego-Signature: t=<unix>,v1=<hex hmac-sha256(secret, `${t}.${body}`)>
// verify (Node)
const [t, v1] = sig.match(/t=(\d+),v1=([0-9a-f]+)/).slice(1);
const expected = crypto.createHmac("sha256", secret)
.update(`${t}.${rawBody}`).digest("hex");
crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected));Respond 2xx quickly. Failures retry with backoff (1m → 6h, 6 attempts); the delivery log lives in Settings → Developers.
Errors & limits
Errors are always { "error": { "code", "message" } } with a matching status — 401 bad key, 400 malformed, 404 missing, 422 semantic (e.g. unknown SKU), 429 rate limited.
Rate limit: 120 requests/minute per key, enforced globally. A 429 carries Retry-After and X-RateLimit-* headers — back off and retry after the window turns.
Ready to build?
Create a free account, mint a key in Settings → Developers, and your first order is one POST away.
Start free →