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 null once 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_at stamp 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 →