ZA – South Africa

Fastway2 Parcel API v3

πŸ”΅ Test Environment
Base URL: https://apitest.fastway2.org/v3
X-API-Key: fw3_test_za_8f7e3d2a1c
🟒 Production Environment
Base URL: https://api.fastway2.org/v3
X-API-Key: To be provided upon official application
Authentication: Include your API key in the X-API-Key header.
X-API-Key: your_api_key_here

πŸš€ API reference – quick overview

Create shipment

POST /shipments

Book a parcel, get tracking number and label PDF. Supports CN β†’ ZA shipments with full item details.

Track parcel

POST /track

Retrieve full tracking history for up to 100 tracking numbers. Returns local SA timestamps and standardised event codes.

Get label

GET /labels/{tn}

Re‑download shipping label (PDF). Links expire after 7 days.

Error codes

Standardised error responses with codes (1000–5002) to quickly identify issues.

Tracking codes

List of event codes (PENDING, ARRIVAL, DELIVERED, etc.) used in tracking details.

Create shipment (booking)
POST /shipments

Book a parcel. Sender in China/Hong Kong, recipient in South Africa (ZA). Returns tracking number and label PDF link.

Request body (JSON)

FieldTypeRequiredLength (max)Description
service_codestringyes20Default fixed value: 1575.
reference_nostringyes40Your unique reference number.
inco_term_codestringyes3International Commercial Terms (e.g., "DDP").
specialInstruction1stringno255Special handling instructions (e.g., "Fragile").
senderobjectyes–Sender details (CN/HK format).
namestringyes60Full name / company.
phonestringyes20e.g. +86 20 91234567
emailstringno80Email for pickup notifications.
countrystringyes2Use CN for China.
statestringyes30e.g. "Guangdong"
suburbstringyes40City/District.
address_line_1stringyes200Street address, building, floor.
address_line_2stringno200Additional address details.
postcodestringno10Postal code if any.
recipientobjectyes–Recipient details (South Africa).
namestringyes60Full name / company.
phonestringyes20e.g. +27 71 234 5678
emailstringyes80For delivery notifications (mandatory).
countrystringyes2Use ZA.
statestringyes30Province: Gauteng, Western Cape, etc.
suburbstringyes40e.g. "Sandton", "Braamfontein".
address_line_1stringyes200Street address, building, floor.
address_line_2stringno200Additional address details.
postcodestringyes10South African postal code (4 digits).
parcelobjectyes–Physical properties & contents.
weightnumberyes6,3Total parcel weight in kg (up to 3 decimals).
lengthintegeryes4cm
widthintegeryes4cm
heightintegeryes4cm
itemsarrayyes–Itemised list (mandatory).
[].skustringyes30Your internal SKU (mandatory).
[].quantitynumberyes4Item quantity.
[].namestringyes120Item description.
[].hs_codestringyes10Harmonized System code (mandatory).
[].currencystringyes3ISO currency code, e.g. ZAR, USD.
[].valuenumberyes8,2Unit value in the specified currency.
[].sku_weightnumberyes6,3Weight of a single unit of this SKU.
[].sku_weight_unitstringyes5Unit: kg or g (default kg).
[].image_urlstringyes500URL to product image (Recommend).
[].product_urlstringyes500URL to product sales page (Recommend).

Complete request example (CN β†’ ZA)

{
  "service_code": "1575",
  "reference_no": "ZA-REF-20250126-001",
  "inco_term_code": "DDP",
  "specialInstruction1": "Fragile - handle with care",
  "sender": {
    "name": "Li Wei",
    "phone": "+86 20 91234567",
    "email": "li.wei@example.cn",
    "country": "CN",
    "state": "Guangdong",
    "suburb": "Guangzhou",
    "address_line_1": "123 Tianhe Road",
    "address_line_2": "Unit 1802",
    "postcode": "510620"
  },
  "recipient": {
    "name": "Thabo Ndlovu",
    "phone": "+27 71 234 5678",
    "email": "thabo@example.co.za",
    "country": "ZA",
    "state": "Gauteng",
    "suburb": "Braamfontein",
    "address_line_1": "45 Smit Street",
    "address_line_2": "",
    "postcode": "2000"
  },
  "parcel": {
    "weight": 2.45,
    "length": 35,
    "width": 25,
    "height": 15,
    "items": [
      {
        "sku": "BK-001",
        "quantity":1,
        "name": "African Short Stories",
        "hs_code": "49019900",
        "currency": "ZAR",
        "value": 185.00,
        "sku_weight": 0.45,
        "sku_weight_unit": "kg",
        "image_url": "https://example.com/images/book1.jpg",
        "product_url": "https://example.com/product/49019900"
      }
    ]
  }
}

βœ… Success (200 OK)

{ "code": 200, "message": "Shipment created", "data": { "tracking_number": "ZA782345678ZA", "label_url": "https://api.fastway2.org/v3/labels/ZA782345678ZA.pdf", "label_format": "pdf", "reference_no": "ZA-REF-20250126-001" } }

❌ Error example (400)

{ "code": 2001, "message": "Missing required field: items[0].currency", "data": null }

Label URL expires after 7 days. Use the Get label endpoint to refresh.

Track parcel
POST /track

Retrieve tracking history for one or multiple tracking numbers (max 100 per request).

Request body (JSON)

FieldTypeRequiredDescription
tracking_numbersarray of stringsyesArray of tracking numbers, e.g. ["ZA782345678ZA"]. Max 100 items.

Response fields

FieldTypeDescription
resultsobjectDictionary mapping tracking number β†’ tracking details.
errorsobjectInvalid or not found numbers with error messages.
tracking_numberstringThe tracking number.
latest_status_codestringCurrent status code (e.g., "created_01").
latest_status_descriptionstringHuman-readable description of current status.
latest_extended_descriptionstringAdditional details about current status.
latest_local_timestringLocal timestamp (SAST) of the latest event.
latest_locationstringLocation of the latest event.
originstringOrigin city.
destinationstringDestination city.
tracking_detailsarrayList of tracking events (latest first).
timestampstringUTC ISO timestamp of the event.
local_timestringLocal SAST time (YYYY-MM-DD HH:MM:SS).
locationstringFacility or city where the event occurred.
status_codestringTracking event code (see Tracking event codes table).
status_descriptionstringDescription of the event.
extended_descriptionstringOptional additional information about the event.

Request example

POST /v3/track Content-Type: application/json { "tracking_numbers": ["ZA782345678ZA", "ZA998877ZA"] }

βœ… Success response

{ "code": 200, "message": "OK", "data": { "results": { "ZA782345678ZA": { "tracking_number": "ZA782345678ZA", "latest_status_code": "delivered_09", "latest_status_description": "Delivery Completed", "latest_extended_description": "Parcel handed to resident and signed", "latest_local_time": "2025-03-25 16:20:00", "latest_location": "Johannesburg", "origin": "Hong Kong", "destination": "Johannesburg, GP", "tracking_details": [ { "timestamp": "2025-03-25T14:20:00Z", "local_time": "2025-03-25 16:20:00", "location": "Johannesburg", "status_code": "delivered_09", "status_description": "Delivery Completed", "extended_description": "Proof of delivery signed by recipient" }, { "timestamp": "2025-03-25T08:15:00Z", "local_time": "2025-03-25 10:15:00", "location": "Johannesburg Depot", "status_code": "od_01", "status_description": "Out for Delivery", "extended_description": "Driver assigned to route 12B" }, { "timestamp": "2025-03-24T22:00:00Z", "local_time": "2025-03-25 00:00:00", "location": "Johannesburg Hub", "status_code": "depot_01", "status_description": "Arrived at destination depot", "extended_description": "Parcel sorted for delivery" }, { "timestamp": "2025-03-23T18:30:00Z", "local_time": "2025-03-23 20:30:00", "location": "Johannesburg Sorting Centre", "status_code": "sorted_01", "status_description": "In Transit", "extended_description": "Processed at sorting facility" }, { "timestamp": "2025-03-22T10:45:00Z", "local_time": "2025-03-22 12:45:00", "location": "Johannesburg Customs", "status_code": "customs_cleared_01", "status_description": "Released from Customs", "extended_description": "Customs clearance completed, duties paid" }, { "timestamp": "2025-03-21T09:00:00Z", "local_time": "2025-03-21 11:00:00", "location": "Johannesburg Customs", "status_code": "under_clearance_03", "status_description": "Your parcel is currently with customs.", "extended_description": "Awaiting customs inspection" }, { "timestamp": "2025-03-19T10:30:00Z", "local_time": "2025-03-19 18:30:00", "location": "Hong Kong Hub", "status_code": "processed_01", "status_description": "Parcel Check In", "extended_description": "Parcel accepted at origin facility" }, { "timestamp": "2025-03-18T08:00:00Z", "local_time": "2025-03-18 16:00:00", "location": "Hong Kong", "status_code": "created_01", "status_description": "We have been notified of your order.", "extended_description": "Shipping label created, awaiting pickup" } ] }, "ZA998877ZA": { "tracking_number": "ZA998877ZA", "latest_status_code": "sorted_01", "latest_status_description": "In Transit", "latest_extended_description": "Parcel in transit to destination country", "latest_local_time": "2025-03-26 09:45:00", "latest_location": "Hong Kong International Hub", "origin": "Durban", "destination": "Pretoria", "tracking_details": [ { "timestamp": "2025-03-26T07:45:00Z", "local_time": "2025-03-26 09:45:00", "location": "Hong Kong International Hub", "status_code": "sorted_01", "status_description": "In Transit", "extended_description": "Handed over to airline" }, { "timestamp": "2025-03-25T22:30:00Z", "local_time": "2025-03-26 00:30:00", "location": "Durban Hub", "status_code": "processed_04", "status_description": "Shipment Added in Transit Bag", "extended_description": "Bagged for export" }, { "timestamp": "2025-03-25T14:00:00Z", "local_time": "2025-03-25 16:00:00", "location": "Durban", "status_code": "created_01", "status_description": "We have been notified of your order.", "extended_description": "Order received" } ] } }, "errors": {} } }

❌ Partial errors

{ "code": 200, "message": "Partial success", "data": { "results": { "ZA782345678ZA": { "tracking_number": "ZA782345678ZA", "status": "in_transit", "status_desc": "In transit", "origin": "Cape Town", "destination": "Johannesburg", "tracking_details": [] } }, "errors": { "INVALID999": "Tracking number format invalid", "ZA000000ZA": "Not found" } } }
Get shipping label
GET /labels/{trackingNumber}

Download a previously generated label. Default response is JSON with URL; add ?format=pdf to get the file directly.

Path & query

ParameterTypeDescription
trackingNumberstringe.g. ZA782345678ZA
format (opt)stringpdf (default)

βœ… JSON response

{ "code": 200, "message": "Success", "data": { "tracking_number": "ZA782345678ZA", "label_url": "https://api.fastway2.org/v3/labels/ZA782345678ZA.pdf", "label_format": "pdf", "created_at": "2025-03-17T10:30:00Z", "expires_at": "2025-03-24T10:30:00Z" } }

❌ Not found error

{ "code": 4000, "message": "Label not found / expired", "data": null }
Error codes
CodeMessageDescription
200SuccessNo error.
1000Internal server errorTry again later.
1001Service unavailableMaintenance.
2000Invalid parameterCheck field format.
2001Missing required fieldField is mandatory.
2002Parameter out of rangeValue exceeds allowed length/range.
3000Authentication failedInvalid or missing X-API-Key.
3001Permission deniedKey lacks access.
4000Resource not foundTracking number not recognised.
4001Duplicate requestIdempotency conflict.
5000Business validation failedAddress unreachable / P.O. Box not allowed.
5001Carrier rejectionDownstream carrier error.
5002Quota exceededToo many requests.
Tracking event codes
CodeDescriptionStage
cre_01We have been notified of your order.Created
cre_02Collection AssignedCreated
pro_01Parcel Check InProcessed
pro_04Shipment Added in Transit BagProcessed
arr_01Flight Partial ArrivedArrived
unc_01Parcel Collected from AirportUnder Clearance
unc_02Your parcel has been stopped at customs.Under Clearance
unc_03Your parcel is currently with customs.Under Clearance
unc_04Customs rejected the shipment.Under Clearance
ccl_01Released from CustomsCleared
ccl_02Customs Invoice PaidCleared
cus_03Released from SecurityCleared
sor_01In TransitSorted to destination
sor_02CollectedSorted to destination
sor_03Ready For DispatchSorted to destination
dep_01Arrived at destination depotReach destination depot
dep_02Pickup Point DepotReach destination depot
ofd_01Out for DeliveryOut for delivery
tex_01Delayed ParcelTransit exception
tex_02MisdirectedTransit exception
tex_03DamagedTransit exception
tex_04Parcel InterceptedTransit exception
exe_01Protest ActionDelivery Exception
exe_02Premises closed on arrivalDelivery Exception
exe_03Traffic CongestionDelivery Exception
exe_04Out of TimeDelivery Exception
exe_05Calling Card LeftDelivery Exception
exe_06Bad WeatherDelivery Exception
exe_07Problem FreightDelivery Exception
exe_08Address UnclearDelivery Exception
exe_09Consignee on HolidayDelivery Exception
exe_10Rejected DeliveryDelivery Exception
exe_11Cannot Locate ReceiverDelivery Exception
exe_12Change of AddressDelivery Exception
exe_13Out of Regional BoundariesDelivery Exception
del_01Signature ObtainedDelivered
del_02Back door DeliveryDelivered
del_03Left in LetterboxDelivered
del_04Contactless SignatureDelivered
del_05Left in Safe PlaceDelivered
del_06Manual PODDelivered
del_07Left As InstructedDelivered
del_08Left with NeighbourDelivered
del_09Delivery CompletedDelivered
del_10Parcel Collected by CustomerDelivered
cla_01Insurance ClaimClaim
cla_02Hijacking ClaimClaim
cla_03Damaged ClaimClaim
can_01Cancelled ShipmentCancelled
ret_01Return to SenderReturned
aba_01Abandoned ShipmentDestroyed/Abandoned

All local times are South African Standard Time (SAST, UTC+2).