We'd love to chat - Call us on 02 7264 3288
Impressm

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 429 with a Retry-After header (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.

Request
curl https://www.impressm.com.au/api/products/trendswear-original-mens-t-shirt/pricing
Response (abridged)
{
  "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.

Request body
{
  "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 }]
    }
  ]
}
Response (201, abridged)
{
  "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:

Header
Authorization: Bearer imp_your_token_here

Tokens 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.

Response (abridged)
{
  "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.

Response (abridged)
{
  "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”.

Request body
{
  "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

Request body
{
  "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"
    }
  ]
}
Response (abridged)
{
  "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.

Response (201, abridged)
{
  "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.

Response (abridged)
{
  "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.