How to connect Australia Post v2
Let's see how you can connect Australia Post to ShippyPro in just few steps.

Summary
1. Before you start
To connect the carrier, you need to first ask your Australia Post Sales Person for credentials such as Account Number, API key, API password.
2. Connection steps
Then you can insert the credentials in the Carriers page, clicking on the Australia Post logo.
If you can't figure how to do it try to take a look at the following example:
Configure the connection with your own product code by inserting the related Product Id. If you don’t know your Product Id contact you Australia Post account manager to know more about it.
Destinations
National: Australia
International: Yes
3. Additional options
Besides your credentials, you'll also see some further options, let's take a look at them!
Label Type gives you the possibility to choose the correct label format for your printer.
Signature Required allows you to enable the Signature Required option for all your shipments
Test Mode lets you make some test shipments.
The "Test Mode" option should be flagged only if you have test credentials, not production ones!
If you want, you can also enter a Custom Label to recognize the connection among all the others.
4. Troubleshooting & Errors
Internal Server Error
Check if your Australia Post connection is in Test Mode.
Your combination of suburb, state & postcode doesn't match. Please review and try again.
The Zip Code/City combination is not correct. Check the correct combination on the Australia Post website: https://auspost.com.au/postcode
Error while printing Carrier Labels for carton XXXXXXXXXXXXXX. Error: Total number of items in your basket can't exceed 10001. To add more, please manifest the items in your basket and start a new request, or delete some of your existing items.
Please contact your Australia Post account manager and verify what your current basket limit is — it may need to be increased.
5. Dangerous Goods (DG) Declaration Guide for Australia Post v2 Introduction
The following implementation requires some effort to be used, Australia Post has a complicated system to enable the Dangerous Goods option
Australia Post requires different dangerous goods information depending on the service tier being used. ShippyPro handles everything through a single carrier option called dangerous_goods_multiparcel, whose value is a JSON-encoded object.
Basic Structure
The JSON always follows this shape:
{ "tier": "startrack" | "parcel_post" | "express_post", "parcels": [ /* one slot per parcel in the shipment */ ] }
Key rules to follow:
- The number of elements in
parcelsmust match exactly the number of parcels in the shipment. Any mismatch will cause the request to be rejected. - Each element in
parcelsis itself an array. A parcel with no dangerous goods must be declared as[](empty array), not asnull. - For Express Post, at most one entry per parcel is allowed.
- For StarTrack, multiple entries per parcel are allowed; identical entries across different parcels are automatically deduplicated.
The Three Service Tiers
| Tier | What is sent to AusPost | Typical Product IDs |
|---|---|---|
startrack |
Shipment-level dangerous_goods[] block (deduplicated) + contains_dangerous_goods: true + packaging_type: "CTN" per parcel |
PRM, RPI |
parcel_post |
contains_dangerous_goods: true per parcel only. Cannot travel by air. |
7D55, 7E55, etc. |
express_post |
contains_dangerous_goods: true + transportable_by_air + dangerous_goods_declaration per parcel |
3H05, etc. |
StarTrack
Required fields for each entry
| Field | Type | Required | Notes |
|---|---|---|---|
un_number |
integer | Yes | UN classification number |
technical_name |
string | No | Technical name of the substance |
class_division |
integer or float | Yes | Primary hazard class and division |
subsidiary_risk |
float | No | Secondary hazard classification |
packing_group_designator |
"I" / "II" / "III" |
Yes | Packing group |
outer_packaging_type |
string | Yes | e.g. "Carton" |
outer_packaging_quantity |
integer | Yes | Number of outer packages |
net_weight |
float (kg) | Yes | Net weight of dangerous goods |
Example — 2 parcels, same dangerous substance
{ "tier": "startrack", "parcels": [ [ { "un_number": 1950, "technical_name": "Aerosols, flammable", "class_division": 2, "subsidiary_risk": 2.1, "packing_group_designator": "III", "outer_packaging_type": "Carton", "outer_packaging_quantity": 1, "net_weight": 1.3 } ], [ { "un_number": 1950, "technical_name": "Aerosols, flammable", "class_division": 2, "subsidiary_risk": 2.1, "packing_group_designator": "III", "outer_packaging_type": "Carton", "outer_packaging_quantity": 1, "net_weight": 1.3 } ] ] }
How it appears in a /Ship API call
"CarrierOptions": [ { "name": "australiapostv2dangerous_goods_multiparcel", "value": "{\"tier\":\"startrack\",\"parcels\":[[{\"un_number\":1950,\"technical_name\":\"Aerosols, flammable\",\"class_division\":2,\"subsidiary_risk\":2.1,\"packing_group_designator\":\"III\",\"outer_packaging_type\":\"Carton\",\"outer_packaging_quantity\":1,\"net_weight\":1.3}],[{\"un_number\":1950,\"technical_name\":\"Aerosols, flammable\",\"class_division\":2,\"subsidiary_risk\":2.1,\"packing_group_designator\":\"III\",\"outer_packaging_type\":\"Carton\",\"outer_packaging_quantity\":1,\"net_weight\":1.3}]]}" } ]
Parcel Post
For Parcel Post, it is sufficient to indicate whether a parcel contains dangerous goods or not — no chemical details are required. This service cannot travel by air.
Fields
| Field | Type | Required | Notes |
|---|---|---|---|
un_number |
integer | No (but recommended) | Any field is enough to flag the parcel |
Example — 2 parcels, only the first contains dangerous goods
{ "tier": "parcel_post", "parcels": [ [ { "un_number": 1950 } ], [] ] }
How it appears in a /Ship API call
"CarrierOptions": [ { "name": "australiapostv2dangerous_goods_multiparcel", "value": "{\"tier\":\"parcel_post\",\"parcels\":[[{\"un_number\":1950}],[]]}" } ]
Express Post
Required fields for each entry
| Field | Type | Required | Notes |
|---|---|---|---|
declaration_code |
string (see list below) | Yes | One of the 6 supported UN codes |
transportable_by_air |
boolean | Yes | Whether the goods can travel via Express Post's air network |
Supported declaration_code values
UN1845_DryIce_and_UN3373_BioSubstance_BUN2910_radioactive_excepted_limited_qtyUN2911_radioactive_excepted_instruments_or_articlesUN3091_Lithium_MetalAndAlloy_contained_in_equipment⚠️ cannot be used for returns via Express PostUN3373_BioSubstance_BUN3481_Lithium_IonOrPolymer_contained_in_equipment⚠️ cannot be used for returns via Express Post
⚠️ Return restriction: If the shipment is a return and the declared code is
UN3091_*orUN3481_*, ShippyPro will reject the request. Use Parcel Post for these return scenarios instead.
Example — 1 parcel with a biological substance
{ "tier": "express_post", "parcels": [ [ { "declaration_code": "UN3373_BioSubstance_B", "transportable_by_air": true } ] ] }
How it appears in a /Ship API call
"CarrierOptions": [ { "name": "australiapostv2dangerous_goods_multiparcel", "value": "{\"tier\":\"express_post\",\"parcels\":[[{\"declaration_code\":\"UN3373_BioSubstance_B\",\"transportable_by_air\":true}]]}" } ]
Combining with Other Carrier Options
The dangerous goods option can be used alongside any other carrier options without issues:
"CarrierOptions": [ { "name": "glsflex", "value": "1" }, { "name": "dangerous_goods_multiparcel", "value": "{\"tier\":\"express_post\",\"parcels\":[[{\"declaration_code\":\"UN3373_BioSubstance_B\",\"transportable_by_air\":true}]]}" } ]
Validation Errors
| Condition | Error message |
|---|---|
| Option absent | No error — shipment proceeds without DG declaration |
| Value is not valid JSON | dangerous_goods_multiparcel must be a JSON-encoded object with 'tier' and 'parcels' fields |
tier missing |
dangerous_goods_multiparcel.tier is required |
tier not valid |
dangerous_goods_multiparcel.tier must be one of: startrack, parcel_post, express_post |
parcels missing or not an array |
dangerous_goods_multiparcel.parcels must be an array |
| Parcel count mismatch | dangerous_goods_multiparcel.parcels length (X) does not match parcel count (Y) |
Express Post entry missing declaration_code |
Express Post entries require declaration_code (parcel X) |
Express Post entry missing transportable_by_air |
Express Post entries require transportable_by_air (boolean) (parcel X) |
Express Post invalid declaration_code |
Invalid declaration_code for Express Post: <code> |
| Express Post more than one entry per parcel | Express Post supports at most one dangerous_goods entry per parcel (parcel X has Y) |
| Express Post return with UN3091 or UN3481 | <code> cannot be returned via Express Post — use Parcel Post |
Common Mistakes to Avoid
- Parcel count must match exactly. If the order has 2 parcels but the JSON only declares 1 slot, the request is rejected before even reaching AusPost.
- An empty parcel must be declared as
[], notnull. For a 2-parcel shipment where only the first contains dangerous goods:"parcels": [[{...}], []]. transportable_by_airmust be a real boolean (true/false), not a string ("true"/"false").- For returns of lithium-in-equipment (UN3091, UN3481), Parcel Post is mandatory. Express Post will reject these codes on return shipments.
- The configured Product ID must match the tier declared in the JSON. If they are not aligned, AusPost itself will reject the request with a separate error.
.png?width=360&height=301&name=image%20(9).png)