Print API

API
Documentation.

One POST creates a print job. Everything below is the whole integration — no NDA, no sales call first. Create an account and this same page renders with your own credentials and SKUs, and the examples run as written.

Endpoint

Where to send an order

A REST API over HTTPS with HTTP Basic auth. Nothing exotic — if your platform can post JSON, it can place a print order.

Base URL
https://api.ipressprinting.com.au
Authentication
HTTP Basic — consumer key as username, secret as password
Submit an order
POST /api/v1/order
Poll for status
GET /api/v1/orders
Submit an order

The whole integration, in one request

Artwork is supplied as URLs we fetch at production time. A sandbox key validates the order in full without producing anything.

curl
curl -X POST https://api.ipressprinting.com.au/api/v1/order \
  -u 'ck_YOUR_CONSUMER_KEY:cs_YOUR_CONSUMER_SECRET' \
  -H 'Content-Type: application/json' \
  -d '{ "userid": "YOUR_USER_ID", "orderreference": "YOUR-ORDER-1001", "currencycode": "AUD", "shipping": { "methodcode": "STANDARD", "methodname": "Standard Delivery", "info": "Standard shipping: 2–5 business days", "companyname": "", "firstname": "Jane", "lastname": "Citizen", "telephonenumber": "+61 400 000 000", "emailaddress": "jane@example.com", "address1": "14 Elizabeth Street", "address2": "", "city": "Melbourne", "state": "Victoria", "regioncode": "VIC", "postcode": "3000", "countryname": "Australia", "countrycode": "AU" }, "items": [ { "productcode": "IP-CA-PORT-40X20", "quantity": 1, "components": [ "CANVAS-FFRAME.AU-CA-NOFRAME", "CANVAS-HANGING.CANVAS-STRING" ], "artwork": { "cover": "https://your-cdn.example.com/orders/10001/cover.pdf", "pages": "https://your-cdn.example.com/orders/10001/pages.pdf" } } ] }'
order.json
{
  "userid": "YOUR_USER_ID",
  "orderreference": "YOUR-ORDER-1001",
  "currencycode": "AUD",
  "shipping": {
    "methodcode": "STANDARD",
    "methodname": "Standard Delivery",
    "info": "Standard shipping: 2–5 business days",
    "companyname": "",
    "firstname": "Jane",
    "lastname": "Citizen",
    "telephonenumber": "+61 400 000 000",
    "emailaddress": "jane@example.com",
    "address1": "14 Elizabeth Street",
    "address2": "",
    "city": "Melbourne",
    "state": "Victoria",
    "regioncode": "VIC",
    "postcode": "3000",
    "countryname": "Australia",
    "countrycode": "AU"
  },
  "items": [
    {
      "productcode": "IP-CA-PORT-40X20",
      "quantity": 1,
      "components": [
        "CANVAS-FFRAME.AU-CA-NOFRAME",
        "CANVAS-HANGING.CANVAS-STRING"
      ],
      "artwork": {
        "cover": "https://your-cdn.example.com/orders/10001/cover.pdf",
        "pages": "https://your-cdn.example.com/orders/10001/pages.pdf"
      }
    }
  ]
}
Order fields

What goes in the payload

FieldTypeRequiredNotes
useridstringyesYour numeric user ID, issued with your credentials.
orderreferencestringyesYour own reference. Must be unique — this is what makes retries safe.
currencycodestringnoISO 4217. Defaults to AUD.
shipping.methodcodestringyesThe delivery method you want — STANDARD or EXPRESS. See "Shipping & delivery methods" above.
shipping.methodnamestringnoHuman-readable label for the method, e.g. "Standard Delivery". Shown on the docket.
shipping.firstnamestringyesRecipient's first name.
shipping.lastnamestringyesRecipient's last name.
shipping.companynamestringnoRecipient company, if any.
shipping.telephonenumberstringnoRecipient phone.
shipping.emailaddressstringnoRecipient email.
shipping.address1stringyesStreet address.
shipping.address2stringnoSecond address line.
shipping.citystringyes
shipping.statestringyesState or region, full name (e.g. Victoria).
shipping.regioncodestringnoState/region short code (e.g. VIC).
shipping.postcodestringyes
shipping.countrynamestringnoCountry full name (e.g. Australia).
shipping.countrycodestringyesISO 3166-1 alpha-2 (e.g. AU).
items[].productcodestringyesA product code from the catalogue.
items[].quantityintegeryesMinimum 1.
items[].pagecountintegernoBook products only. Must sit inside the range and move in the step the catalogue gives for that SKU.
items[].componentsarrayyesFully qualified component codes — SECTION.OPTION. The catalogue lists the valid values for each SKU.
items[].artwork.coverurlyesPublicly reachable PDF. We fetch it at production time.
items[].artwork.pagesurlyesPublicly reachable PDF.
items[].unitsellnumbernoYour retail price, for your packing slip only. Never used for billing.
Product codes

Finding what to order

There are over seven thousand SKUs, so they live in a searchable catalogue rather than a list on this page.

Signed in, the catalogue shows each product’s price on your own price list, its page rules, and every component code it accepts — and builds a valid order payload for you. The dropdowns only offer values the API will take, so an invalid component is not something you can produce by hand.

What we print
Canvas53Framed Prints30Photobook96Poster78Softcover8
Status and tracking

Knowing when it shipped

Poll with a datelastmodified filter and process what has changed since your last call. Tracking references come back on the same response.

curl
curl 'https://api.ipressprinting.com.au/api/v1/orders?userid=YOUR_USER_ID&datelastmodified=2026-09-01T00:00:00Z' \
  -u 'ck_YOUR_CONSUMER_KEY:cs_YOUR_CONSUMER_SECRET'
Errors

What can come back

StatusCodeMeaningWhat to do
400invalid_payloadThe JSON did not parse, or a required field is missing.Check the field list above. A trailing comma or a missing one after "description" is the usual cause.
401unauthorizedThe consumer key and secret were rejected.Confirm you are sending HTTP Basic auth, and that you are using the credentials for the right environment.
403account_on_holdThe account is on hold — usually an unpaid invoice.Settle the outstanding balance in the portal; new orders release automatically.
404unknown_skuThe product code is not on your price list.Look it up in the catalogue — that list is generated for your own price list.
422invalid_componentA component code is not valid for that product.Open the product in the catalogue — it lists every component code that SKU accepts, and the order builder there only offers valid ones.
429rate_limitedToo many requests.Back off and retry with an exponential delay. Batch orders rather than firing them in parallel.
500internal_errorSomething went wrong at our end.Retry with the same orderreference — duplicate references are rejected, so a retry cannot double-print.
Getting started

What happens when you sign up

Sandbox credentials are issued as soon as your card is verified, so you can build against the real API before anyone at our end has looked at your account.

  1. 01
    Create an account
    Email and password. Nothing else asked for yet.
  2. 02
    Company details and agreement
    Trading name, ABN, and click-through terms.
  3. 03
    Add a card
    Saved with Stripe. We never see the number.
  4. 04
    Sandbox keys, immediately
    Build and test against orders that never reach production.
  5. 05
    Approval, then live keys
    One human step at our end. Live credentials and your own price list appear in the portal.