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.
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
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 -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" } } ] }'{
"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"
}
}
]
}What goes in the payload
| Field | Type | Required | Notes |
|---|---|---|---|
| userid | string | yes | Your numeric user ID, issued with your credentials. |
| orderreference | string | yes | Your own reference. Must be unique — this is what makes retries safe. |
| currencycode | string | no | ISO 4217. Defaults to AUD. |
| shipping.methodcode | string | yes | The delivery method you want — STANDARD or EXPRESS. See "Shipping & delivery methods" above. |
| shipping.methodname | string | no | Human-readable label for the method, e.g. "Standard Delivery". Shown on the docket. |
| shipping.firstname | string | yes | Recipient's first name. |
| shipping.lastname | string | yes | Recipient's last name. |
| shipping.companyname | string | no | Recipient company, if any. |
| shipping.telephonenumber | string | no | Recipient phone. |
| shipping.emailaddress | string | no | Recipient email. |
| shipping.address1 | string | yes | Street address. |
| shipping.address2 | string | no | Second address line. |
| shipping.city | string | yes | |
| shipping.state | string | yes | State or region, full name (e.g. Victoria). |
| shipping.regioncode | string | no | State/region short code (e.g. VIC). |
| shipping.postcode | string | yes | |
| shipping.countryname | string | no | Country full name (e.g. Australia). |
| shipping.countrycode | string | yes | ISO 3166-1 alpha-2 (e.g. AU). |
| items[].productcode | string | yes | A product code from the catalogue. |
| items[].quantity | integer | yes | Minimum 1. |
| items[].pagecount | integer | no | Book products only. Must sit inside the range and move in the step the catalogue gives for that SKU. |
| items[].components | array | yes | Fully qualified component codes — SECTION.OPTION. The catalogue lists the valid values for each SKU. |
| items[].artwork.cover | url | yes | Publicly reachable PDF. We fetch it at production time. |
| items[].artwork.pages | url | yes | Publicly reachable PDF. |
| items[].unitsell | number | no | Your retail price, for your packing slip only. Never used for billing. |
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.
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 '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'What can come back
| Status | Code | Meaning | What to do |
|---|---|---|---|
| 400 | invalid_payload | The 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. |
| 401 | unauthorized | The consumer key and secret were rejected. | Confirm you are sending HTTP Basic auth, and that you are using the credentials for the right environment. |
| 403 | account_on_hold | The account is on hold — usually an unpaid invoice. | Settle the outstanding balance in the portal; new orders release automatically. |
| 404 | unknown_sku | The product code is not on your price list. | Look it up in the catalogue — that list is generated for your own price list. |
| 422 | invalid_component | A 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. |
| 429 | rate_limited | Too many requests. | Back off and retry with an exponential delay. Batch orders rather than firing them in parallel. |
| 500 | internal_error | Something went wrong at our end. | Retry with the same orderreference — duplicate references are rejected, so a retry cannot double-print. |
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.
- 01Create an accountEmail and password. Nothing else asked for yet.
- 02Company details and agreementTrading name, ABN, and click-through terms.
- 03Add a cardSaved with Stripe. We never see the number.
- 04Sandbox keys, immediatelyBuild and test against orders that never reach production.
- 05Approval, then live keysOne human step at our end. Live credentials and your own price list appear in the portal.