REST API reference
JSON over HTTPS, priced by the same engine as the website. Public endpoints need no key; account endpoints use a bearer token from Account → API access.
Conventions
- Base URL:
https://www.impressm.com.au. All requests and responses are JSON. - Prices are AUD excluding GST unless the field says otherwise; cent fields end in
Cents. - Every response carries
ok. Failures return{ "ok": false, "error": "…" }with the offending field named in the message. - Rate limits: over-limit calls get
429with aRetry-Afterheader (seconds). Reads allow generous bursts; writes that create real records are tighter.
Catalogue pricing (public)
GET/api/products/{handle}/pricing
Full quantity-break pricing for one product: the blank-garment unit price per quantity tier, every decoration method’s price breaks and setup fee, and ready-to-quote totals per quantity (one print position, one colour). Handles come from product URLs (/products/{handle}) or the sitemap.
curl https://www.impressm.com.au/api/products/trendswear-original-mens-t-shirt/pricing{
"product": { "handle": "trendswear-original-mens-t-shirt", "title": "…", "url": "…" },
"currency": "AUD",
"garmentUnitPriceByQuantity": { "25": 14.5, "50": 12.9, "100": 11.2 },
"minimumQuantity": 25,
"decorationMethods": [
{
"name": "Screen Print",
"setupFee": 75,
"priceBreaks": [{ "minQty": 25, "unitPrice": 3.2 }],
"totalByQuantity": [{ "quantity": 25, "unitPrice": 17.7, "setupFee": 75, "total": 517.5 }]
}
],
"shippingPerLine": 25,
"assumptions": ["…"]
}Quote creation (public)
POST/api/quote-request
Creates a formal, shareable quote priced server-side. The response includes a quote URL the customer can view and accept online plus a branded PDF link. Set sendEmail to email both to the customer. Up to 20 lines per quote.
{
"email": "customer@example.com",
"name": "Sam Taylor",
"company": "Example Co",
"sendEmail": true,
"lines": [
{
"handle": "trendswear-original-mens-t-shirt",
"quantity": 50,
"colour": "Navy",
"methods": [{ "method": "Screen Print", "positions": ["Front"], "colours": 1 }]
}
]
}{
"ok": true,
"quote": {
"number": "#D123",
"url": "https://www.impressm.com.au/quote/123-a1b2c3d4e5f6a7b8",
"pdfUrl": "https://www.impressm.com.au/quote/123-a1b2c3d4e5f6a7b8/pdf",
"expiresAt": "2026-08-06",
"totals": { "subtotalExGst": 812.5, "gst": 81.25, "totalIncGst": 893.75 }
}
}Authentication (account endpoints)
Everything under /api/customer/ needs a customer API token. Tokens are currently issued on request — email support@impressm.com.au from your account email, then send yours on every request:
Authorization: Bearer imp_your_token_hereTokens are shown once at creation and can be revoked any time. Missing or invalid tokens get a 401 whose error explains how to fix it.
Orders
GET/api/customer/orders
The same canonical order history as the account area: every order with its status, lifecycle stage, totals, tracking and retail line detail. Lines bought as part of a pack carry the pack name and a shared packId.
{
"ok": true,
"count": 2,
"orders": [
{
"number": "#D118",
"id": "1189",
"status": "open",
"stage": 3,
"stageLabel": "Production",
"total": 2350.0,
"currency": "AUD",
"trackers": [],
"lines": [
{
"title": "Classic Hoodie",
"quantity": 50,
"unitPrice": 47.0,
"colour": "Black",
"sizeMix": "S×10, M×20, L×20",
"pack": "Build-a-Pack",
"packId": "0e1f…"
}
]
}
]
}Inventory & packs
GET/api/customer/inventory
Items Impressm stores in the warehouse for you: live counts, low-stock flags, your pack definitions (with how many complete packs current stock can build) and the pre-paid shipping budget.
{
"ok": true,
"items": [
{ "id": "8c2e…", "name": "Staff Tee (Navy)", "quantity": 240, "lowStock": false },
{ "id": "51aa…", "name": "Drink Bottle", "quantity": 180, "lowStock": false }
],
"packs": [
{
"id": "77b1…",
"name": "Onboarding Pack",
"items": [
{ "itemId": "8c2e…", "name": "Staff Tee (Navy)", "quantityPerPack": 1 },
{ "itemId": "51aa…", "name": "Drink Bottle", "quantityPerPack": 2 }
],
"available": 90
}
],
"budget": { "balanceCents": 42000, "balance": "$420.00", "currency": "AUD" }
}Define a pack
POST/api/customer/packs
A pack is a named kit of your stored items. Once defined, shipments can request whole packs and Impressm expands them into component quantities against live stock. If you bought five items together as a pack, define them here once and from then on you can ask for “1 pack per new starter”.
{
"name": "Onboarding Pack",
"items": [
{ "itemId": "8c2e…", "quantity": 1 },
{ "itemId": "51aa…", "quantity": 2 }
]
}GET /api/customer/packs lists your packs with live availability.
Shipments
A shipment sends stored items and/or whole packs to one or many Australian addresses. Every destination receives the same lines; submit separate shipments for different contents per destination. Shipping is priced live across our courier network and the cheapest option per destination is used.
Quote first
POST/api/customer/shipments/quote
{
"lines": [
{ "packId": "77b1…", "packs": 1 },
{ "itemId": "51aa…", "quantity": 1 }
],
"destinations": [
{
"name": "Sam Taylor",
"address1": "1 Example St",
"suburb": "Richmond",
"state": "VIC",
"postcode": "3121"
},
{
"name": "Alex Ng",
"address1": "20 Sample Ave",
"suburb": "Newstead",
"state": "QLD",
"postcode": "4006"
}
]
}{
"ok": true,
"quote": {
"requested": ["1 × Onboarding Pack", "1 × Drink Bottle"],
"items": [
{ "itemId": "8c2e…", "name": "Staff Tee (Navy)", "quantityPerDestination": 1 },
{ "itemId": "51aa…", "name": "Drink Bottle", "quantityPerDestination": 3 }
],
"destinations": [
{ "name": "Sam Taylor", "courierName": "Couriers Please", "priceCents": 1240, "etaLabel": "Est. 2 business days" },
{ "name": "Alex Ng", "courierName": "Australia Post", "priceCents": 1590, "etaLabel": "Est. 3 business days" }
],
"totalCents": 2830,
"total": "$28.30",
"budget": { "balanceCents": 42000, "coversTotal": true }
}
}Nothing is created by a quote. Note the pack expanded into its components: 1 pack + 1 extra bottle per destination becomes 1 tee and 3 bottles per destination.
Create the shipment
POST/api/customer/shipments
Same body as the quote, plus an optional payment field: "budget" (paid instantly from your pre-paid shipping budget; stock is deducted immediately) or "invoice" (a shipping invoice is emailed and dispatch starts once it is paid). Omit it to use the budget when it covers the total.
{
"ok": true,
"shipment": {
"id": "b4d0…",
"status": "paid",
"paymentMethod": "budget",
"total": "$28.30",
"requested": ["1 × Onboarding Pack", "1 × Drink Bottle"],
"destinationCount": 2,
"message": "Shipment requested and paid from your shipping budget. …"
}
}Track shipments
GET/api/customer/shipments
Lists every shipment with a rolled-up status (awaiting payment, requested, packing, shipping, delivered) and per-destination courier tracking as it becomes available.
{
"ok": true,
"shipments": [
{
"id": "b4d0…",
"status": "shipping",
"statusLabel": "Shipping",
"items": [{ "name": "Staff Tee (Navy)", "quantityPerDestination": 1 }],
"total": "$28.30",
"destinations": [
{
"name": "Sam Taylor",
"status": "shipping",
"carrier": "Couriers Please",
"trackingNumber": "CPA…",
"trackingUrl": "https://…"
}
]
}
]
}Prefer tools over HTTP?
Every endpoint on this page is also exposed as a tool on the Impressm MCP server, so AI assistants can use them without writing HTTP calls. See the MCP server docs.