{"openapi":"3.0.0","info":{"title":"Transdirect v5 API","version":"5.2.0","description":"Transdirect API v5. Use it to create booking quotes, stream quote results as carriers respond, manage bookings, retrieve labels, track shipments, search locations, and manage saved orders."},"servers":[{"url":"https://api.transdirect.com.au","description":"Current API origin"}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"api-key"}},"schemas":{"ApiJsonValue":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true},{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/ApiJsonValue"},{"nullable":true}]}},{"type":"object","additionalProperties":{"allOf":[{"$ref":"#/components/schemas/ApiJsonValue"},{"nullable":true}]}}]},"Country":{"type":"object","properties":{"id":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Internal country identifier; may be a numeric or string ID."},"code":{"type":"string","description":"Two-letter ISO 3166-1 alpha-2 country code (e.g. AU, NZ)."},"name":{"type":"string","description":"Full country name (e.g. Australia)."},"postcode_status":{"anyOf":[{"type":"string"},{"type":"number"},{"nullable":true}],"description":"Flag indicating whether postcodes are supported/required for this country."}},"required":["code","name"]},"LocationPublicAddressSuggestion":{"type":"object","properties":{"description":{"type":"string","description":"Human-readable address suggestion to show to the user."},"placeId":{"type":"string","description":"Google Places identifier used to resolve the full address."}},"required":["description","placeId"]},"LocationResolvedAddressFields":{"type":"object","properties":{"unit":{"type":"string","description":"Unit, apartment, or suite number; empty when not applicable."},"streetNumber":{"type":"string","description":"Street number portion of the address."},"street":{"type":"string","description":"Street name without the street type."},"streetType":{"type":"string","description":"Street type (e.g. Street, Road, Avenue)."},"address":{"type":"string","description":"Full street address line combining unit, number, street and type."},"suburb":{"type":"string","description":"Suburb or town name."},"state":{"type":"string","description":"State or territory code (e.g. NSW)."},"postcode":{"type":"string","description":"Postal code (4-digit for Australia)."},"country":{"type":"string","description":"Two-letter ISO country code."}},"required":["unit","streetNumber","street","streetType","address","suburb","state","postcode","country"]},"LocationSearchResponse":{"type":"object","properties":{"locations":{"type":"array","items":{"anyOf":[{"$ref":"#/components/schemas/SuburbLocation"},{"$ref":"#/components/schemas/CountryLocation"}]},"description":"Matching suburb and country locations for the search query."}},"required":["locations"]},"SuburbLocation":{"type":"object","properties":{"id":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Internal locality identifier."},"locality":{"type":"string","description":"Suburb or town name."},"postcode":{"type":"string","description":"Postal code for the locality (4-digit for Australia)."},"state":{"type":"string","description":"State or territory code (e.g. NSW, VIC, QLD)."},"priority":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Ranking hint used to order matching localities in search results."}},"required":["locality","postcode","state"]},"CountryLocation":{"type":"object","properties":{"id":{"anyOf":[{"type":"number"},{"type":"string"}],"description":"Internal country-location identifier."},"country_code":{"type":"string","description":"Two-letter ISO 3166-1 alpha-2 country code."},"country_name":{"type":"string","description":"Full country name."}},"required":["country_code","country_name"]},"PostcodeSearchResponse":{"type":"object","properties":{"locations":{"type":"array","items":{"type":"object","properties":{"locality":{"type":"string","description":"Suburb or town name."},"postcode":{"type":"string","description":"Postal code for the locality (4-digit for Australia)."},"state":{"type":"string","description":"State or territory code (e.g. NSW, VIC, QLD)."}},"required":["locality","postcode","state"]},"description":"Suburbs matching the supplied postcode."}},"required":["locations"]},"StandardLocationsAllResponse":{"type":"object","properties":{"count":{"type":"integer","description":"Total number of suburb rows returned in `suburbs`."},"suburbs":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","description":"suburbs_code row id. A soft reference for ranking and joins, not an identity — reference data gets reloaded."},"locality":{"type":"string","description":"Suburb or town name."},"postcode":{"type":"string","description":"Postal code for the locality (4-digit for Australia)."},"state":{"type":"string","description":"State or territory code (e.g. NSW, VIC, QLD)."},"priority":{"type":"number","description":"Ranking hint used to order localities that share a postcode."}},"required":["locality","postcode","state"]},"description":"Every valid Australian suburb/postcode/state row, for client-side (IndexedDB) caching."}},"required":["count","suburbs"]},"TrackingResponse":{"type":"object","properties":{"reference":{"type":"string","description":"Tracking reference that was looked up (booking ID or connote)."},"matched":{"type":"boolean","description":"Whether the reference matched a known booking or consignment."},"bookingId":{"type":"string","nullable":true,"description":"Matched Transdirect booking ID; null when no match."},"connote":{"type":"string","nullable":true,"description":"Carrier consignment note number; null when unavailable."},"deliveryStatus":{"type":"number","nullable":true,"description":"Numeric internal delivery-status code; null when unavailable."},"statusPhrase":{"type":"string","description":"Short human-readable status phrase for the shipment."},"state":{"type":"string","enum":["not_found","pending","picked_up","in_transit","out_for_delivery","delivered","attention"],"description":"Overall tracking state (e.g. in_transit, delivered, not_found)."},"headline":{"type":"string","description":"Headline summary line to show to the recipient."},"summary":{"type":"string","description":"Longer summary describing the current tracking situation."},"helpRecommended":{"type":"boolean","description":"Whether the recipient should be prompted to contact support."},"attachmentRecommended":{"type":"boolean","description":"Whether the recipient should be prompted to attach supporting evidence."},"checkedAt":{"type":"string","description":"ISO 8601 timestamp when tracking was last checked."},"items":{"type":"array","items":{"$ref":"#/components/schemas/TrackingItem"},"description":"Per-item tracking details for the shipment."}},"required":["reference","matched","bookingId","connote","deliveryStatus","statusPhrase","state","headline","summary","helpRecommended","attachmentRecommended","checkedAt","items"],"additionalProperties":false},"TrackingItem":{"type":"object","properties":{"label":{"type":"string","description":"Display label identifying this parcel or consignment item."},"eta":{"type":"string","nullable":true,"description":"Estimated delivery date/time; null when unknown."},"stage":{"type":"string","enum":["pending","picked_up","in_transit","out_for_delivery","delivered","exception","unknown"],"description":"Current normalised delivery stage of this item."},"stageCode":{"type":"number","nullable":true,"description":"Numeric code for the current stage; null when unavailable."},"trackingGraphicUrl":{"type":"string","nullable":true,"description":"URL of a progress-bar graphic for the item; null when unavailable."},"events":{"type":"array","items":{"$ref":"#/components/schemas/TrackingEvent"},"description":"Chronological tracking events recorded for this item."}},"required":["label","eta","stage","stageCode","trackingGraphicUrl","events"],"additionalProperties":false},"TrackingEvent":{"type":"object","properties":{"occurredAt":{"type":"string","nullable":true,"description":"ISO 8601 timestamp the event occurred; null when unknown."},"dateText":{"type":"string","nullable":true,"description":"Human-readable date/time label for display; null when unavailable."},"stage":{"type":"string","enum":["pending","picked_up","in_transit","out_for_delivery","delivered","exception","unknown"],"description":"Normalised delivery stage for this event (e.g. in_transit, delivered)."},"status":{"type":"string","nullable":true,"description":"Normalised status label for the event; null when unavailable."},"description":{"type":"string","nullable":true,"description":"Human-readable description of the event; null when unavailable."},"location":{"type":"string","nullable":true,"description":"Location where the event occurred; null when unavailable."},"podUrl":{"type":"string","nullable":true,"description":"URL of the proof-of-delivery document; null when not available."},"deliveryDateText":{"type":"string","nullable":true,"description":"Human-readable delivery date label; null when not delivered."},"raw":{"type":"object","properties":{"date":{"type":"string","description":"Raw event date as supplied by the carrier."},"datetime":{"type":"string","description":"Raw combined date-time string as supplied by the carrier."},"time":{"type":"string","description":"Raw event time as supplied by the carrier."},"occurred_at":{"type":"string","description":"Raw timestamp the event occurred, as supplied by the carrier."},"status":{"type":"string","description":"Raw status code or label from the carrier."},"description":{"type":"string","description":"Raw event description from the carrier."},"details":{"type":"string","description":"Additional raw event detail text from the carrier."},"event":{"type":"string","description":"Raw event name or type from the carrier."},"milestone":{"type":"string","description":"Raw milestone identifier from the carrier."},"location":{"type":"string","description":"Raw location text from the carrier."},"depot":{"type":"string","description":"Raw depot name from the carrier."},"branch":{"type":"string","description":"Raw branch name from the carrier."}},"description":"Original unprocessed event payload from the carrier."}},"required":["occurredAt","dateText","stage","status","description","location","podUrl","deliveryDateText","raw"],"additionalProperties":false},"BookingSyncSettingsResponse":{"type":"object","properties":{"shipping_title":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}],"description":"Label shown to buyers for the shipping method."},"enable_sync":{"type":"string","enum":["disabled"],"description":"Present and \"disabled\" when order syncing is turned off."},"pending":{"type":"string","enum":["on"],"description":"\"on\" when orders with pending status are synced."},"processing":{"type":"string","enum":["on"],"description":"\"on\" when orders with processing status are synced."},"onhold":{"type":"string","enum":["on"],"description":"\"on\" when on-hold orders are synced."},"completed":{"type":"string","enum":["on"],"description":"\"on\" when completed orders are synced."},"cancelled":{"type":"string","enum":["on"],"description":"\"on\" when cancelled orders are synced."},"refunded":{"type":"string","enum":["on"],"description":"\"on\" when refunded orders are synced."},"failed":{"type":"string","enum":["on"],"description":"\"on\" when failed orders are synced."},"multiwarehouse_enabled":{"anyOf":[{"type":"string","enum":["on"]},{"type":"string","enum":["off"]}],"description":"Whether multi-warehouse pickup selection is enabled (\"on\"/\"off\")."}},"required":["shipping_title","multiwarehouse_enabled"]},"SettingsError":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable settings error message."}},"required":["error"],"additionalProperties":false},"ApiSettings":{"type":"object","properties":{"module_id":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}],"description":"Identifier of the API module/key these settings belong to."},"module_title":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}],"description":"Display title of the API module/key."},"shipping_title":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}],"description":"Label shown to buyers for the shipping method at checkout."},"street_type":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}],"description":"Default street type used when building sender addresses."},"default_height":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}],"description":"Default parcel height in cm applied when none is supplied."},"default_width":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}],"description":"Default parcel width in cm applied when none is supplied."},"default_lenght":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}],"description":"Default parcel length in cm (field name misspelt for v4 parity)."},"default_weight":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}],"description":"Default parcel weight in kg applied when none is supplied."},"enable_sync":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}],"description":"Whether e-commerce order syncing is enabled (\"enabled\"/\"disabled\")."},"sync_from_date":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}],"description":"Earliest order date (YYYY-MM-DD) to import when syncing."},"quote_diplay":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}],"description":"How quotes are displayed to buyers (field name misspelt for v4 parity)."},"surcharge_amount":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}],"description":"Flat surcharge added to quoted prices, in AUD."},"enabled_courier":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true},{"type":"array","items":{"type":"string"}}],"description":"Courier string_id(s) enabled for this key; single value or array."},"mode":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}],"description":"Operating mode of the key, e.g. \"live\" or \"demo\"."},"sync_all_order":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}],"description":"Whether all order statuses are synced rather than a selected subset."}},"required":["module_id","module_title","shipping_title","street_type","default_height","default_width","default_lenght","default_weight","enable_sync","sync_from_date","quote_diplay","surcharge_amount","enabled_courier","mode","sync_all_order"]},"ApiConfigResponse":{"type":"object","properties":{"api_key":{"type":"object","properties":{"id":{"type":"number","description":"API key identifier."},"member_id":{"type":"number","description":"Member who owns this API key."},"status":{"type":"boolean","description":"Whether the key is currently active."},"demo_mode":{"type":"boolean","description":"Whether the key operates in no-charge demo mode."},"module_type_id":{"type":"number","nullable":true,"description":"Module type identifier for the integration (e.g. platform type)."},"site_domain":{"type":"string","nullable":true,"description":"Site domain registered for this key."},"created":{"type":"string","nullable":true,"description":"ISO 8601 timestamp the key was created."}},"required":["id","member_id","status","demo_mode","module_type_id","site_domain","created"],"description":"Identity and status of the API key."},"module_setting":{"type":"object","additionalProperties":{"nullable":true},"description":"Complete raw module_setting blob controlling quote/booking behaviour."},"warehouses":{"type":"array","items":{"$ref":"#/components/schemas/ApiConfigWarehouse"},"description":"Configured pickup warehouses for this key."},"rules":{"type":"array","items":{"$ref":"#/components/schemas/ApiConfigRule"},"description":"Margin/markup rules applied to quotes."},"package_type_rules":{"type":"array","items":{"$ref":"#/components/schemas/ApiConfigPackageTypeRule"},"description":"Weight-to-package-type mapping rules."}},"required":["api_key","module_setting","warehouses","rules","package_type_rules"]},"ApiConfigWarehouse":{"type":"object","properties":{"id":{"type":"number","description":"Warehouse (pickup location) identifier."},"suburb":{"type":"string","nullable":true,"description":"Warehouse suburb."},"postcode":{"type":"string","nullable":true,"description":"Warehouse 4-digit AU postcode."},"state":{"type":"string","nullable":true,"description":"Warehouse state code (e.g. NSW, VIC)."},"type":{"type":"string","nullable":true,"description":"Warehouse address type, \"business\" or \"residential\"."},"created":{"type":"string","nullable":true,"description":"ISO 8601 timestamp the warehouse was created."}},"required":["id","suburb","postcode","state","type","created"]},"ApiConfigRule":{"type":"object","properties":{"id":{"type":"number","description":"Margin/markup rule identifier."},"module_id":{"type":"number","nullable":true,"description":"API module/key this rule belongs to."},"type":{"type":"string","nullable":true,"description":"Rule type, e.g. margin or markup."},"trigger_comparison":{"type":"string","nullable":true,"description":"Comparison operator that decides when the rule fires (e.g. \"gt\", \"lte\")."},"trigger_value":{"type":"string","nullable":true,"description":"Threshold value the trigger comparison is evaluated against."},"action_operator":{"type":"string","nullable":true,"description":"Operator applied by the action (e.g. add, multiply, percent)."},"action_value":{"type":"string","nullable":true,"description":"Value applied by the action operator."},"trigger_description":{"type":"string","nullable":true,"description":"Human-readable description of the trigger condition."},"action_description":{"type":"string","nullable":true,"description":"Human-readable description of the action taken."},"created":{"type":"string","nullable":true,"description":"ISO 8601 timestamp the rule was created."},"priority":{"type":"number","nullable":true,"description":"Evaluation priority; lower numbers are applied first."},"couriers":{"type":"array","items":{"type":"string"},"description":"Courier string_ids this rule is scoped to; empty means all couriers."}},"required":["id","module_id","type","trigger_comparison","trigger_value","action_operator","action_value","trigger_description","action_description","created","priority","couriers"]},"ApiConfigPackageTypeRule":{"type":"object","properties":{"id":{"type":"number","description":"Package-type rule identifier."},"package_type":{"type":"string","nullable":true,"description":"Package type assigned when the range matches (e.g. \"Carton\", \"Pallet\")."},"base_on":{"type":"string","nullable":true,"description":"Metric the range is measured against, e.g. \"weight\"."},"range_from":{"type":"number","nullable":true,"description":"Lower bound of the matching range (inclusive), in the base_on unit."},"range_to":{"type":"number","nullable":true,"description":"Upper bound of the matching range (inclusive), in the base_on unit."}},"required":["id","package_type","base_on","range_from","range_to"]},"ApiKeyTestResponse":{"type":"object","properties":{"id":{"type":"number","description":"API key identifier that was tested."},"member_id":{"type":"number","description":"Member who owns the tested key."},"status":{"anyOf":[{"type":"number"},{"type":"string"},{"nullable":true}],"description":"Key status flag (active/inactive), or null if unknown."},"module_type_id":{"type":"number","nullable":true,"description":"Module type identifier for the integration."},"member_email":{"type":"string","nullable":true,"description":"Contact email of the owning member."}},"required":["id","member_id","status","module_type_id"],"additionalProperties":false},"BookingItem":{"type":"object","properties":{"id":{"type":"number","description":"Booking item identifier."},"description":{"type":"string","description":"Package type or contents description."},"weight":{"type":"number","description":"Item weight in kg."},"length":{"type":"number","description":"Item length in cm."},"width":{"type":"number","description":"Item width in cm."},"height":{"type":"number","description":"Item height in cm."},"quantity":{"type":"number","description":"Number of identical items of these dimensions."}},"required":["id","description","weight","length","width","height","quantity"],"additionalProperties":false},"BookingItemError":{"type":"object","properties":{"error":{"type":"string","description":"Single error message describing the failure."},"errors":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"One or more validation error messages."}},"additionalProperties":false},"BookingItemInput":{"type":"object","properties":{"description":{"type":"string","nullable":true,"minLength":1,"description":"Package type or contents description (e.g. \"Carton\")."},"weight":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Item weight in kg."},"length":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Item length in cm."},"width":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Item width in cm."},"height":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Item height in cm."},"quantity":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Number of identical items of these dimensions."}},"required":["weight","length","width","height","quantity"],"additionalProperties":false},"Booking":{"type":"object","properties":{"id":{"type":"number","description":"Booking identifier."},"booked_at":{"type":"string","description":"ISO 8601 timestamp the booking was confirmed."},"booked_by":{"type":"string","nullable":true,"description":"Name of the user who confirmed the booking, if known."},"created_at":{"type":"string","description":"ISO 8601 timestamp the booking (or quote) was created."},"declared_value":{"type":"number","description":"Declared value of the goods in AUD."},"insured_value":{"type":"number","description":"Insured (transit cover) value in AUD."},"description":{"type":"string","nullable":true,"description":"Short booking description."},"items":{"type":"array","items":{"$ref":"#/components/schemas/BookingItem"},"description":"Items included in the booking."},"label":{"type":"string","description":"Shipping label reference or URL for the booking."},"notifications":{"type":"object","properties":{"email":{"type":"boolean","enum":[false],"description":"Email notifications flag (always false on this endpoint)."},"sms":{"type":"boolean","enum":[false],"description":"SMS notifications flag (always false on this endpoint)."}},"required":["email","sms"],"additionalProperties":false,"description":"Notification preferences for the booking."},"quote_errors":{"type":"array","items":{"type":"object","properties":{"courier":{"type":"string","description":"Courier string_id that failed to quote."},"code":{"type":"string","description":"Error code for the quote failure."},"serviceability":{"type":"string","description":"Canonical cross-courier serviceability code — see SERVICEABILITY_CODES."},"retryable":{"type":"boolean","description":"Whether the failure is transient and worth retrying."}},"required":["courier","code"],"additionalProperties":false},"description":"Per-courier errors encountered while quoting."},"status":{"type":"string","nullable":true,"description":"Booking status as a human label, not the stored machine code: v5 maps codes through a fixed lookup table, e.g. \"paid\" -> \"Paid\", \"pending_payment\" -> \"Pending Payment\", \"sending_to_courier\" -> \"Sending to Courier\", \"on_hold\" -> \"On hold\", \"cancelled_refund\" -> \"Cancel Refund\". The mapping is not title-casing and is not reversible - both \"pending_review\" and \"on_hold_suspicious\" return \"Pending Review\" - and a code with no label (\"from_on_hold\") is passed through unchanged. Note \"new\": this response returns \"New\", but POST /api/bookings/v4 returns the raw \"new\" on create. Match case-insensitively, or accept both forms."},"is_paid":{"type":"boolean","description":"Whether the booking has been paid."},"cost":{"anyOf":[{"type":"number"},{"type":"string"},{"nullable":true}],"description":"Total booking cost in AUD."},"additional_charges":{"type":"number","description":"Extra charges applied on top of the base cost, in AUD."},"courier":{"type":"string","nullable":true,"description":"Courier string_id selected for the booking."},"order":{"type":"object","properties":{"order_id":{"type":"number","description":"Transdirect order identifier linked to this booking."},"order_number":{"type":"string","nullable":true,"description":"External order number from the source platform."}},"required":["order_id","order_number"],"additionalProperties":false,"description":"Linked e-commerce order, if the booking came from one."},"receiver":{"anyOf":[{"$ref":"#/components/schemas/BookingAddress"},{"type":"string","enum":[""]}],"description":"Receiver (delivery) address, or \"\" if not yet set."},"sender":{"anyOf":[{"$ref":"#/components/schemas/BookingAddress"},{"type":"string","enum":[""]}],"description":"Sender (pickup) address, or \"\" if not yet set."},"pickup_window":{"type":"array","items":{"type":"string"},"description":"Confirmed pickup window as [start, end] time strings."},"connote":{"type":"string","nullable":true,"description":"Carrier consignment note / tracking number, once lodged."},"charged_weight":{"type":"number","description":"Weight the carrier charged on, in kg (may be volumetric)."},"scanned_weight":{"type":"number","description":"Actual weight scanned by the carrier, in kg."},"special_instructions":{"type":"string","description":"Free-text delivery instructions."},"updated_at":{"type":"string","description":"ISO 8601 timestamp the booking was last updated."},"pickup_instructions":{"type":"string","nullable":true,"description":"Free-text pickup instructions."},"tailgate_pickup":{"type":"boolean","description":"Whether tailgate assistance was requested at pickup."},"tailgate_delivery":{"type":"boolean","description":"Whether tailgate assistance was requested at delivery."},"collection_point":{"type":"object","properties":{"agent_id":{"type":"string","nullable":true,"description":"Collection point agent identifier."},"provider":{"type":"string","nullable":true,"description":"Collection point network provider."},"store_name":{"type":"string","nullable":true,"description":"Display name of the collection point store."},"address":{"anyOf":[{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}]}},{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}]}},{"type":"string"},{"nullable":true}],"description":"Collection point address (string, array, object, or null)."},"surcharge":{"type":"number","description":"Surcharge for using the collection point, in AUD."},"use_closest":{"type":"boolean","description":"Whether the closest collection point should be auto-selected."}},"required":["agent_id","provider","store_name","address","surcharge","use_closest"],"additionalProperties":false,"description":"Collection point (pickup from depot/store) details, when applicable."}},"required":["id","booked_at","booked_by","created_at","declared_value","insured_value","description","items","label","notifications","receiver","sender","pickup_window","connote","charged_weight","scanned_weight","special_instructions","updated_at","pickup_instructions","tailgate_pickup","tailgate_delivery"],"additionalProperties":false},"BookingAddress":{"type":"object","properties":{"id":{"type":"number","description":"Address identifier."},"address":{"type":"string","nullable":true,"description":"Street address line."},"company_name":{"type":"string","nullable":true,"description":"Company/business name at this address."},"email":{"type":"string","nullable":true,"description":"Contact email for this party."},"name":{"type":"string","nullable":true,"description":"Contact person name at this address."},"postcode":{"type":"string","nullable":true,"description":"4-digit AU postcode (or destination postcode for international)."},"phone":{"type":"string","nullable":true,"description":"Contact phone number."},"state":{"type":"string","nullable":true,"description":"State code (e.g. NSW, VIC)."},"suburb":{"type":"string","nullable":true,"description":"Suburb/locality."},"type":{"type":"string","nullable":true,"description":"Address type, \"business\" or \"residential\"."},"country":{"type":"string","nullable":true,"description":"2-letter ISO country code (e.g. AU)."}},"required":["id","address","company_name","email","name","postcode","phone","state","suburb","type","country"],"additionalProperties":false},"EndpointError":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable error message describing why the request failed."}},"required":["error"],"additionalProperties":false},"BookingSenderResponse":{"type":"object","properties":{"sender":{"type":"object","properties":{"id":{"type":"number","description":"Address identifier."},"address":{"type":"string","nullable":true,"description":"Street address line."},"company_name":{"type":"string","nullable":true,"description":"Company/business name at this address."},"email":{"type":"string","nullable":true,"description":"Contact email for this party."},"name":{"type":"string","nullable":true,"description":"Contact person name at this address."},"postcode":{"type":"string","nullable":true,"description":"4-digit AU postcode (or destination postcode for international)."},"phone":{"type":"string","nullable":true,"description":"Contact phone number."},"state":{"type":"string","nullable":true,"description":"State code (e.g. NSW, VIC)."},"suburb":{"type":"string","nullable":true,"description":"Suburb/locality."},"type":{"type":"string","nullable":true,"description":"Address type, \"business\" or \"residential\"."},"country":{"type":"string","nullable":true,"description":"2-letter ISO country code (e.g. AU)."}},"required":["id","address","company_name","email","name","postcode","phone","state","suburb","type","country"],"additionalProperties":false,"description":"Sender (pickup) address for the booking."}},"required":["sender"],"additionalProperties":false},"BookingReceiverResponse":{"type":"object","properties":{"receiver":{"type":"object","properties":{"id":{"type":"number","description":"Address identifier."},"address":{"type":"string","nullable":true,"description":"Street address line."},"company_name":{"type":"string","nullable":true,"description":"Company/business name at this address."},"email":{"type":"string","nullable":true,"description":"Contact email for this party."},"name":{"type":"string","nullable":true,"description":"Contact person name at this address."},"postcode":{"type":"string","nullable":true,"description":"4-digit AU postcode (or destination postcode for international)."},"phone":{"type":"string","nullable":true,"description":"Contact phone number."},"state":{"type":"string","nullable":true,"description":"State code (e.g. NSW, VIC)."},"suburb":{"type":"string","nullable":true,"description":"Suburb/locality."},"type":{"type":"string","nullable":true,"description":"Address type, \"business\" or \"residential\"."},"country":{"type":"string","nullable":true,"description":"2-letter ISO country code (e.g. AU)."}},"required":["id","address","company_name","email","name","postcode","phone","state","suburb","type","country"],"additionalProperties":false,"description":"Receiver (delivery) address for the booking."}},"required":["receiver"],"additionalProperties":false},"CustomsDeclarationResponse":{"type":"object","properties":{"status":{"type":"string","enum":["success"],"description":"Always \"success\" when the declaration was accepted."},"message":{"type":"string","description":"Confirmation message for the accepted declaration."}},"required":["status","message"],"additionalProperties":false},"CustomsDeclarationError":{"type":"object","properties":{"errors":{"type":"array","items":{"type":"string"},"description":"List of validation error messages for the declaration."}},"required":["errors"],"additionalProperties":false},"CustomsDeclaration":{"type":"object","properties":{"name":{"type":"string","nullable":true,"minLength":1,"description":"Sender/declarant contact name."},"email":{"type":"string","nullable":true,"minLength":1,"description":"Sender/declarant email address."},"phone":{"type":"string","nullable":true,"minLength":1,"description":"Sender/declarant phone number."},"company_name":{"type":"string","nullable":true,"default":"","description":"Sender company/business name."},"street_number":{"type":"string","nullable":true,"minLength":1,"description":"Street number of the sender address."},"street_name":{"type":"string","nullable":true,"minLength":1,"description":"Street name of the sender address."},"street_type":{"type":"string","nullable":true,"minLength":1,"description":"Street type of the sender address (e.g. St, Rd, Ave)."},"booking_party_details_type":{"anyOf":[{"type":"string","enum":["1"]},{"type":"number","enum":[1]},{"type":"string","enum":["0"]},{"type":"number","enum":[0]},{"type":"string","enum":["commercial"]},{"type":"string","enum":["private"]}],"default":"1","description":"Party type: 1/\"commercial\" for business or 0/\"private\" for individual; defaults to commercial."},"reason_of_shipment":{"type":"string","nullable":true,"minLength":1,"description":"Reason for export (e.g. sale, gift, sample)."},"items":{"type":"array","items":{"$ref":"#/components/schemas/CustomsDeclarationItem"},"minItems":1,"description":"Goods line items covered by the declaration (at least one)."},"postcode":{"type":"string","nullable":true,"default":"","description":"Sender 4-digit AU postcode."},"suburb":{"type":"string","nullable":true,"default":"","description":"Sender suburb."},"state":{"type":"string","nullable":true,"default":"","description":"Sender state code (e.g. NSW, VIC)."},"country":{"type":"string","nullable":true,"default":"","description":"Sender 2-letter ISO country code."}},"required":["items"]},"CustomsDeclarationItem":{"type":"object","properties":{"item":{"type":"string","nullable":true,"minLength":1,"description":"Name of the goods line item."},"weight":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Item weight in kg."},"quantity":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Number of units of this item."},"invoice_value":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Declared invoice value per line, in AUD."},"invoice_description":{"type":"string","nullable":true,"minLength":1,"description":"Customs description of the goods."},"manufacturer_country":{"type":"string","nullable":true,"minLength":1,"description":"Country of manufacture (2-letter ISO code or country name)."}},"required":["weight","quantity","invoice_value"]},"BookingConfirmPaymentError":{"type":"object","properties":{"errors":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"},{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"type":"object","properties":{"message":{"type":"string","description":"Validation error message for the field."},"format":{"type":"string","description":"Expected format hint for the field."}},"additionalProperties":false},{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"type":"object","properties":{"message":{"type":"string","description":"Validation error message for the field."},"format":{"type":"string","description":"Expected format hint for the field."}},"additionalProperties":false}]}}]}}],"description":"Validation errors as a list, string, or per-field map."},"payment_error":{"type":"object","properties":{"code":{"type":"string","nullable":true,"description":"Gateway error code for the failed payment."},"user_message":{"type":"string","nullable":true,"description":"User-facing message explaining the payment failure."},"log_id":{"anyOf":[{"type":"string"},{"type":"number"},{"nullable":true}],"description":"Internal log identifier for tracing the payment attempt."},"method":{"type":"string","nullable":true,"description":"Payment method that failed, e.g. \"card\" or \"paypal\"."}},"additionalProperties":false,"description":"Details of the payment gateway failure, when a payment was attempted."}},"required":["errors"],"additionalProperties":false},"BookingConfirmRequest":{"type":"object","properties":{"courier":{"type":"string","minLength":1,"description":"Courier string_id of the selected quote to confirm and pay."},"pickup-date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Requested pickup date (YYYY-MM-DD); hyphenated alias of pickup_date."},"pickup_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Requested pickup date (YYYY-MM-DD); underscore alias of pickup-date."},"pickup-time":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Requested pickup time/window; hyphenated alias of pickup_time."},"pickup_time":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Requested pickup time/window; underscore alias of pickup-time."},"tier":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Selected quote tier number when the courier offers multiple tiers."},"payment_method":{"type":"string","pattern":"^(demo|credit|(nab|paypal)_\\d{1,15})$","description":"How to pay: \"nab_<id>\" or \"paypal_<id>\" (an id from GET /api/members/payment-methods), \"credit\" to bill your credit account, or \"demo\" for a sandbox booking. May be sent alongside payment only if the two agree."},"payment":{"oneOf":[{"type":"object","properties":{"method":{"type":"string","enum":["credit"],"description":"Charge the booking to the member account credit balance."}},"required":["method"],"additionalProperties":false},{"type":"object","properties":{"method":{"type":"string","enum":["card"],"description":"Pay with a saved NAB credit card."},"card_id":{"anyOf":[{"type":"integer","minimum":0,"exclusiveMinimum":true},{"type":"string","pattern":"^\\d+$"}],"description":"Identifier of the saved card to charge."}},"required":["method","card_id"],"additionalProperties":false},{"type":"object","properties":{"method":{"type":"string","enum":["paypal"],"description":"Pay via a stored PayPal billing agreement."},"agreement_id":{"anyOf":[{"type":"integer","minimum":0,"exclusiveMinimum":true},{"type":"string","pattern":"^\\d+$"}],"description":"Identifier of the saved PayPal billing agreement."}},"required":["method","agreement_id"],"additionalProperties":false},{"type":"object","properties":{"method":{"type":"string","enum":["demo"],"description":"No-charge demo payment (demo-enabled keys only)."}},"required":["method"],"additionalProperties":false}],"description":"Structured payment selection. May be sent alongside payment_method only if the two agree."},"agreed_terms":{"type":"boolean","nullable":true,"description":"Explicit acceptance of the Transdirect Terms and Conditions for this booking. Omitted defaults to the account's standing acceptance."},"agreed_warranty":{"type":"boolean","nullable":true,"description":"Explicit acceptance of the selected carrier's Transit Warranty terms for this booking, when the carrier has one. Omitted defaults to the account's standing acceptance."}},"required":["courier"]},"BookingDocumentError":{"type":"object","properties":{"error":{"type":"string","description":"Error code or short reason the document could not be produced."},"message":{"type":"string","description":"Human-readable explanation of the error."},"booking_id":{"type":"number","description":"Booking the document request related to."},"status":{"type":"string","description":"Booking status at the time of the error."}},"required":["error"],"additionalProperties":false},"PublicUrlResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true],"description":"Always true when the public URL was generated."},"url":{"type":"string","description":"Temporary public URL for the booking document/label."},"expires_at":{"type":"string","description":"ISO 8601 timestamp after which the URL stops working."}},"required":["success","url","expires_at"],"additionalProperties":false},"BatchDocumentRequest":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"integer","minimum":0,"exclusiveMinimum":true},"minItems":1,"maxItems":50,"description":"Booking ids to include in the batch document (1-50)."},"format":{"type":"string","enum":["standard","a6"],"default":"standard","description":"Label format: \"standard\" (A4) or \"a6\"; defaults to standard."}},"required":["ids"]},"BookingTrackingEvent":{"type":"object","properties":{"date":{"type":"string","nullable":true,"description":"Event timestamp as reported by the courier; null when unknown."},"status":{"type":"string","nullable":true,"description":"Courier status label for the event; null when unavailable."},"description":{"type":"string","nullable":true,"description":"Human-readable description of the tracking event; null when unavailable."},"location":{"type":"string","nullable":true,"description":"Location associated with the event; null when unavailable."},"pod_url":{"type":"string","nullable":true,"description":"Proof-of-delivery document URL; null when not available."},"delivery_date":{"type":"string","nullable":true,"description":"Delivery date for the shipment; null when not delivered or unknown."},"track_status":{"type":"string","nullable":true,"description":"Normalised tracking status code (e.g. picked_up, in_transit, delivered); null when unknown."}},"required":["date","status","description","location","pod_url","delivery_date","track_status"]},"BookingMutationError":{"type":"object","properties":{"errors":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"},{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"type":"object","properties":{"message":{"type":"string","description":"Validation error message for the field."},"format":{"type":"string","description":"Expected format hint for the field."}},"additionalProperties":false},{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"type":"object","properties":{"message":{"type":"string","description":"Validation error message for the field."},"format":{"type":"string","description":"Expected format hint for the field."}},"additionalProperties":false}]}}]}}],"description":"Validation errors as a list, string, or per-field map."}},"required":["errors"],"additionalProperties":false},"BookingUpdateRequest":{"type":"object","properties":{"declared_value":{"type":"number","nullable":true,"minimum":0,"description":"Declared value of the goods in AUD."},"insured_value":{"type":"number","nullable":true,"minimum":0,"description":"Value to insure (transit cover) in AUD."},"description":{"type":"string","nullable":true,"maxLength":80,"description":"Short booking description (max 80 chars)."},"goods_description":{"type":"string","nullable":true,"maxLength":80,"description":"Description of the goods being shipped (max 80 chars)."},"sender":{"type":"object","properties":{"address":{"type":"string","nullable":true,"description":"Street address line."},"company_name":{"type":"string","nullable":true,"description":"Company/business name at this address."},"email":{"type":"string","nullable":true,"description":"Contact email for this party."},"name":{"type":"string","nullable":true,"description":"Contact person name at this address."},"postcode":{"type":"string","nullable":true,"description":"4-digit AU postcode (or destination postcode for international)."},"phone":{"anyOf":[{"type":"string","nullable":true},{"type":"number","nullable":true},{"nullable":true}],"description":"Contact phone number."},"state":{"type":"string","nullable":true,"description":"State code (e.g. NSW, VIC)."},"suburb":{"type":"string","nullable":true,"description":"Suburb/locality."},"type":{"type":"string","enum":["business","residential"],"description":"Address type: \"business\" or \"residential\"."},"country":{"type":"string","nullable":true,"description":"2-letter ISO country code (e.g. AU)."}},"additionalProperties":false,"description":"Updated sender (pickup) address details."},"receiver":{"type":"object","properties":{"address":{"type":"string","nullable":true,"description":"Street address line."},"company_name":{"type":"string","nullable":true,"description":"Company/business name at this address."},"email":{"type":"string","nullable":true,"description":"Contact email for this party."},"name":{"type":"string","nullable":true,"description":"Contact person name at this address."},"postcode":{"type":"string","nullable":true,"description":"4-digit AU postcode (or destination postcode for international)."},"phone":{"anyOf":[{"type":"string","nullable":true},{"type":"number","nullable":true},{"nullable":true}],"description":"Contact phone number."},"state":{"type":"string","nullable":true,"description":"State code (e.g. NSW, VIC)."},"suburb":{"type":"string","nullable":true,"description":"Suburb/locality."},"type":{"type":"string","enum":["business","residential"],"description":"Address type: \"business\" or \"residential\"."},"country":{"type":"string","nullable":true,"description":"2-letter ISO country code (e.g. AU)."}},"additionalProperties":false,"description":"Updated receiver (delivery) address details."},"items":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string","nullable":true,"minLength":1,"description":"Package type or contents description (e.g. \"Carton\")."},"weight":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Item weight in kg."},"length":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Item length in cm."},"width":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Item width in cm."},"height":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Item height in cm."},"quantity":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Number of identical items of these dimensions."},"id":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Existing booking item id to update; omit to add a new item."}},"additionalProperties":false},"description":"Booking items to add or update."},"tailgate_pickup":{"type":"boolean","nullable":true,"description":"Whether tailgate assistance is required at pickup."},"tailgate_delivery":{"type":"boolean","nullable":true,"description":"Whether tailgate assistance is required at delivery."},"instructions":{"type":"object","properties":{"delivery":{"type":"string","nullable":true,"description":"Special instructions for the delivery driver."},"pickup":{"type":"string","nullable":true,"description":"Special instructions for the pickup driver."}},"additionalProperties":false,"description":"Free-text pickup and delivery instructions."}},"additionalProperties":false},"StandardLocationsIndexResponse":{"type":"object","properties":{"code":{"type":"number","enum":[200],"description":"Status code echoed in the body; always 200 for a successful page."},"next_page":{"type":"string","description":"Absolute URL of the next page of results; present only when the current page is full and more rows may exist."},"prev_page":{"type":"string","description":"Absolute URL of the previous page of results; present only when the current page number is greater than 1."},"locations":{"type":"array","items":{"$ref":"#/components/schemas/SuburbLocation"},"description":"Suburb/locality rows for this page, ordered by postcode."}},"required":["code","locations"]},"CountryStatesResponse":{"type":"object","properties":{"states":{"type":"array","items":{"$ref":"#/components/schemas/CountryState"},"description":"States or territories available for the selected country."},"state_required":{"type":"boolean","description":"Whether a state must be supplied when addressing in this country."},"postcode_required":{"type":"boolean","description":"Whether a postcode must be supplied when addressing in this country."}},"required":["states","state_required","postcode_required"]},"CountryState":{"type":"object","properties":{"code":{"type":"string","description":"State or territory code (e.g. NSW)."},"name":{"type":"string","description":"Full state or territory name (e.g. New South Wales)."}},"required":["code","name"]},"ValidateRouteResponse":{"type":"object","properties":{"couriers":{"type":"object","additionalProperties":{"type":"object","properties":{"rules":{"type":"array","items":{"$ref":"#/components/schemas/CourierRule"},"description":"Rules that apply to this courier for the route."},"can_quote":{"type":"boolean","description":"Whether the courier can quote the route (no blocking rules)."}},"required":["rules","can_quote"]},"description":"Per-courier validation results, keyed by courier string_id."}},"required":["couriers"]},"CourierRule":{"type":"object","properties":{"code":{"type":"string","description":"Machine-readable rule code."},"severity":{"type":"string","enum":["block","surcharge","prompt"],"description":"Rule severity: \"block\" (cannot quote), \"surcharge\" (adds cost), or \"prompt\" (warn user)."},"msg":{"type":"string","description":"Human-readable explanation of the rule."},"surcharge_amount":{"type":"number","description":"Surcharge added when severity is \"surcharge\", in AUD."},"meta":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"},"default":{},"description":"Additional structured metadata about the rule."}},"required":["code","severity","msg"],"additionalProperties":false},"ValidateRouteRequest":{"type":"object","properties":{"from":{"type":"object","properties":{"postcode":{"type":"string","nullable":true,"default":"","description":"4-digit AU postcode of the location."},"suburb":{"type":"string","nullable":true,"default":"","description":"Suburb/locality of the location."},"state":{"type":"string","nullable":true,"default":"","description":"State code (e.g. NSW, VIC)."},"country":{"type":"string","nullable":true,"default":"AU","description":"2-letter ISO country code; defaults to AU."},"type":{"type":"string","nullable":true,"default":"business","description":"Address type, \"business\" or \"residential\"; defaults to business."},"isResidential":{"type":"boolean","nullable":true,"description":"Explicit residential flag, overriding type when set."}},"default":{"postcode":"","suburb":"","state":"","country":"AU","type":"business"},"additionalProperties":false,"description":"Origin (pickup) location for the route."},"to":{"type":"object","properties":{"postcode":{"type":"string","nullable":true,"default":"","description":"4-digit AU postcode of the location."},"suburb":{"type":"string","nullable":true,"default":"","description":"Suburb/locality of the location."},"state":{"type":"string","nullable":true,"default":"","description":"State code (e.g. NSW, VIC)."},"country":{"type":"string","nullable":true,"default":"AU","description":"2-letter ISO country code; defaults to AU."},"type":{"type":"string","nullable":true,"default":"business","description":"Address type, \"business\" or \"residential\"; defaults to business."},"isResidential":{"type":"boolean","nullable":true,"description":"Explicit residential flag, overriding type when set."}},"default":{"postcode":"","suburb":"","state":"","country":"AU","type":"business"},"additionalProperties":false,"description":"Destination (delivery) location for the route."},"items":{"type":"array","items":{"$ref":"#/components/schemas/ValidateRouteItem"},"default":[],"description":"Items to be shipped along the route."},"couriers":{"type":"array","nullable":true,"items":{"type":"string","nullable":true},"description":"Courier string_ids to restrict validation to; null/omit for all."}}},"ValidateRouteItem":{"type":"object","properties":{"description":{"type":"string","nullable":true,"default":"Carton","description":"Package type/contents description; defaults to \"Carton\"."},"packaging":{"type":"string","nullable":true,"description":"Packaging type override for the item."},"weight":{"type":"number","nullable":true,"default":0,"description":"Item weight in kg."},"length":{"type":"number","nullable":true,"default":0,"description":"Item length in cm."},"width":{"type":"number","nullable":true,"default":0,"description":"Item width in cm."},"height":{"type":"number","nullable":true,"default":0,"description":"Item height in cm."},"quantity":{"type":"integer","nullable":true,"default":1,"description":"Number of identical items; defaults to 1."}},"additionalProperties":false},"Order":{"type":"object","properties":{"id":{"type":"number","description":"Order record identifier."},"transdirect_order_id":{"type":"number","nullable":true,"description":"Linked Transdirect order id, if any."},"transdirect_member_id":{"type":"number","description":"Member who owns the order."},"transdirect_order_status":{"type":"string","nullable":true,"description":"Current order status (e.g. \"new\", \"processing\", \"completed\")."},"order_id":{"type":"string","nullable":true,"description":"External order reference from the source platform."},"goods_summary":{"type":"string","nullable":true,"description":"Short summary of the goods purchased."},"goods_dump":{"type":"string","nullable":true,"description":"Raw serialised goods/line-item data from the source platform."},"imported_from":{"type":"string","nullable":true,"description":"Source of the order import (e.g. \"shopify\", \"csv\")."},"imported_time":{"type":"string","nullable":true,"description":"Timestamp the order was imported (ISO 8601)."},"purchased_time":{"type":"string","nullable":true,"description":"Timestamp the order was purchased (ISO 8601)."},"sale_price":{"anyOf":[{"type":"number"},{"type":"string"},{"nullable":true}],"description":"Order sale price in AUD."},"selected_courier":{"type":"string","nullable":true,"description":"Courier string_id selected for the order."},"courier_price":{"anyOf":[{"type":"number"},{"type":"string"},{"nullable":true}],"description":"Shipping price for the selected courier, in AUD."},"paid_time":{"type":"string","nullable":true,"description":"Timestamp the order was paid (ISO 8601)."},"buyer_name":{"type":"string","nullable":true,"description":"Name of the buyer who placed the order."},"buyer_email":{"type":"string","nullable":true,"description":"Email of the buyer who placed the order."},"delivery":{"type":"object","properties":{"name":{"type":"string","nullable":true,"description":"Delivery recipient name."},"email":{"type":"string","nullable":true,"description":"Delivery recipient email."},"phone":{"type":"string","nullable":true,"description":"Delivery recipient phone number."},"address":{"type":"string","nullable":true,"description":"Delivery recipient full address."}},"required":["name","email","phone","address"],"additionalProperties":false,"description":"Delivery recipient details for the order."},"last_updated":{"type":"string","nullable":true,"description":"Timestamp the order was last updated (ISO 8601)."}},"required":["id","transdirect_order_id","transdirect_member_id","transdirect_order_status","order_id","goods_summary","goods_dump","imported_from","imported_time","purchased_time","sale_price","selected_courier","courier_price","paid_time","buyer_name","buyer_email","delivery","last_updated"],"additionalProperties":false},"OrderError":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable error message describing why the order request failed."}},"required":["error"],"additionalProperties":false},"OrderStatusUpdate":{"type":"object","properties":{"transdirect_order_status":{"type":"string","nullable":true,"minLength":1,"description":"New order status to set (e.g. \"processing\", \"completed\", \"cancelled\")."}},"additionalProperties":false},"SavedOrderUpdateInput":{"type":"object","properties":{"transdirect_order_id":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Transdirect order id to update."},"order_id":{"type":"string","nullable":true,"description":"External order reference from the source platform."},"delivery":{"type":"object","properties":{"name":{"type":"string","nullable":true,"description":"Delivery recipient name."},"email":{"type":"string","nullable":true,"description":"Delivery recipient email."},"phone":{"type":"string","nullable":true,"description":"Delivery recipient phone number."},"address":{"type":"string","nullable":true,"description":"Delivery recipient full address."}},"description":"Structured delivery recipient details to update."},"delivery_client_name":{"type":"string","nullable":true,"description":"Delivery recipient name (flat alias of delivery.name)."},"delivery_client_email":{"type":"string","nullable":true,"description":"Delivery recipient email (flat alias of delivery.email)."},"delivery_client_phone":{"type":"string","nullable":true,"description":"Delivery recipient phone (flat alias of delivery.phone)."},"delivery_client_address":{"type":"string","nullable":true,"description":"Delivery recipient address (flat alias of delivery.address)."},"buyer_name":{"type":"string","nullable":true,"description":"Name of the buyer who placed the order."},"buyer_email":{"type":"string","nullable":true,"description":"Email of the buyer who placed the order."},"goods_summary":{"type":"string","nullable":true,"description":"Short summary of the goods purchased."},"goods_dump":{"type":"string","nullable":true,"description":"Raw serialised goods/line-item data from the source platform."},"imported_from":{"type":"string","nullable":true,"description":"Source of the order import (e.g. \"shopify\", \"csv\")."},"purchased_time":{"type":"string","nullable":true,"description":"Timestamp the order was purchased (ISO 8601)."},"sale_price":{"type":"number","nullable":true,"description":"Order sale price in AUD."},"selected_courier":{"type":"string","nullable":true,"description":"Courier string_id selected for the order."},"courier_price":{"type":"number","nullable":true,"description":"Shipping price for the selected courier, in AUD."},"paid_time":{"type":"string","nullable":true,"description":"Timestamp the order was paid (ISO 8601)."},"transdirect_order_status":{"type":"string","nullable":true,"description":"New order status to set (e.g. \"processing\", \"completed\")."}},"additionalProperties":false},"SavedOrderInput":{"type":"object","properties":{"transdirect_order_id":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Existing Transdirect order id to associate with; omit to create new."},"order_id":{"type":"string","nullable":true,"default":"","description":"External order reference from the source platform."},"delivery":{"type":"object","properties":{"name":{"type":"string","nullable":true,"default":"","description":"Delivery recipient name."},"email":{"type":"string","nullable":true,"default":"","description":"Delivery recipient email."},"phone":{"type":"string","nullable":true,"default":"","description":"Delivery recipient phone number."},"address":{"type":"string","nullable":true,"default":"","description":"Delivery recipient full address."}},"description":"Structured delivery recipient details."},"delivery_client_name":{"type":"string","nullable":true,"default":"","description":"Delivery recipient name (flat alias of delivery.name)."},"delivery_client_email":{"type":"string","nullable":true,"default":"","description":"Delivery recipient email (flat alias of delivery.email)."},"delivery_client_phone":{"type":"string","nullable":true,"default":"","description":"Delivery recipient phone (flat alias of delivery.phone)."},"delivery_client_address":{"type":"string","nullable":true,"default":"","description":"Delivery recipient address (flat alias of delivery.address)."},"buyer_name":{"type":"string","nullable":true,"default":"","description":"Name of the buyer who placed the order."},"buyer_email":{"type":"string","nullable":true,"default":"","description":"Email of the buyer who placed the order."},"goods_summary":{"type":"string","nullable":true,"default":"","description":"Short summary of the goods purchased."},"goods_dump":{"type":"string","nullable":true,"default":"","description":"Raw serialised goods/line-item data from the source platform."},"imported_from":{"type":"string","nullable":true,"default":"","description":"Source of the order import (e.g. \"shopify\", \"csv\")."},"purchased_time":{"type":"string","nullable":true,"default":"","description":"Timestamp the order was purchased (ISO 8601)."},"sale_price":{"type":"number","nullable":true,"default":0,"description":"Order sale price in AUD."},"selected_courier":{"type":"string","nullable":true,"default":"","description":"Courier string_id selected for the order, if any."},"courier_price":{"type":"number","nullable":true,"default":0,"description":"Shipping price for the selected courier, in AUD."},"paid_time":{"type":"string","nullable":true,"default":"","description":"Timestamp the order was paid (ISO 8601)."}},"additionalProperties":false},"SimpleOrderInput":{"type":"object","properties":{"order_id":{"type":"string","nullable":true,"minLength":1,"description":"External order reference from the source platform; required."},"delivery_client_name":{"type":"string","nullable":true,"default":"","description":"Delivery recipient name."},"delivery_client_email":{"type":"string","nullable":true,"default":"","description":"Delivery recipient email."},"delivery_client_phone":{"type":"string","nullable":true,"default":"","description":"Delivery recipient phone number."},"delivery_client_address":{"type":"string","nullable":true,"default":"","description":"Delivery recipient full address."},"buyer_name":{"type":"string","nullable":true,"default":"","description":"Name of the buyer who placed the order."},"buyer_email":{"type":"string","nullable":true,"default":"","description":"Email of the buyer who placed the order."},"goods_summary":{"type":"string","nullable":true,"default":"","description":"Short summary of the goods purchased."},"imported_from":{"type":"string","nullable":true,"default":"csv","description":"Source of the order import (e.g. \"csv\", \"shopify\"); defaults to csv."},"sale_price":{"type":"number","nullable":true,"default":0,"description":"Order sale price in AUD."},"courier_price":{"type":"number","nullable":true,"default":0,"description":"Shipping price charged to the buyer, in AUD."}},"additionalProperties":false},"PickupAvailabilityResponse":{"type":"object","properties":{"pickupDates":{"type":"array","items":{"type":"string"},"description":"Selectable pickup dates as YYYY-MM-DD strings."},"pickupTimes":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string","description":"Window start time (HH:MM, 24-hour)."},"to":{"type":"string","description":"Window end time (HH:MM, 24-hour)."}},"required":["from","to"]},"description":"Selectable pickup time windows for the chosen date."},"fromTime":{"type":"string","nullable":true,"description":"Earliest ready-from time for the pickup (HH:MM), or null if unavailable."},"toTime":{"type":"string","nullable":true,"description":"Latest available pickup time (HH:MM), or null if unavailable."},"earliest":{"type":"string","nullable":true,"description":"Earliest available pickup date (YYYY-MM-DD), or null if none."},"readyFromTimes":{"type":"array","items":{"type":"string"},"description":"Allowed \"ready from\" times (HH:MM) for spec-driven carriers."},"lastAvailableTimes":{"type":"array","items":{"type":"string"},"description":"Allowed \"last available\" cut-off times (HH:MM) for spec-driven carriers."},"todayReadyFromTimes":{"type":"array","items":{"type":"string"},"description":"Ready-from times (HH:MM) still selectable for a same-day pickup."},"pickupWindow":{"type":"object","properties":{"operatingStart":{"type":"string","description":"Depot operating start time (HH:MM)."},"operatingEnd":{"type":"string","description":"Depot operating end time (HH:MM)."},"displayStart":{"type":"string","description":"Suggested window start to display to the user (HH:MM)."},"displayEnd":{"type":"string","description":"Suggested window end to display to the user (HH:MM)."},"sameDayCutoff":{"type":"string","description":"Latest booking time (HH:MM) to still qualify for same-day pickup."},"minWindowMinutes":{"type":"number","description":"Minimum allowed pickup window length in minutes."},"incrementMinutes":{"type":"number","description":"Time-selection increment in minutes."},"fixed":{"type":"boolean","description":"True when the carrier enforces a fixed, non-adjustable pickup window."}},"required":["operatingStart","operatingEnd","displayStart","displayEnd","sameDayCutoff","minWindowMinutes","incrementMinutes","fixed"],"description":"Granular pickup-window contract for spec-driven carriers."},"error":{"type":"string","description":"Error message when pickup availability could not be determined."}},"required":["pickupDates","pickupTimes","fromTime","toTime","earliest"]},"PickupAvailabilityRequest":{"type":"object","properties":{"courier":{"type":"string","minLength":1,"maxLength":120,"description":"Courier string_id to check pickup availability for (e.g. \"allied\", \"tnt_road_express\")."},"sender":{"type":"object","properties":{"suburb":{"type":"string","maxLength":120,"default":"","description":"Sender suburb used to resolve the pickup location and its operating hours."},"state":{"type":"string","maxLength":20,"default":"","description":"Sender state code (e.g. NSW, VIC, QLD)."},"postcode":{"type":"string","maxLength":20,"default":"","description":"Sender 4-digit AU postcode."},"type":{"type":"string","maxLength":40,"default":"","description":"Sender address type, \"business\" or \"residential\"."}},"additionalProperties":false,"description":"Sender pickup location whose pickup windows are being queried."}},"required":["courier","sender"]},"Member":{"type":"object","properties":{"id":{"type":"number","description":"Member identifier."},"company_name":{"type":"string","nullable":true,"description":"Member company/business name."},"contact_name":{"type":"string","nullable":true,"description":"Primary contact name for the member."},"address":{"type":"string","nullable":true,"description":"Member street address."},"suburb":{"type":"string","nullable":true,"description":"Member suburb."},"postcode":{"type":"number","description":"Member 4-digit AU postcode."},"state":{"type":"string","nullable":true,"description":"Member state code (e.g. NSW, VIC)."},"phone":{"type":"string","nullable":true,"description":"Member contact phone number."},"discount_factor":{"type":"number","description":"Multiplier applied to base rates for this member (1 = no discount)."},"credit_limit":{"type":"number","description":"Total account credit limit in AUD."},"credit_limit_available":{"type":"number","description":"Remaining available credit in AUD."},"charge_type":{"type":"string","nullable":true,"description":"Billing arrangement, e.g. prepaid or account/credit."},"last_invoice_timestamp":{"anyOf":[{"type":"string"},{"type":"number"},{"nullable":true}],"description":"Timestamp of the last invoice (ISO 8601 or Unix epoch)."},"terms":{"anyOf":[{"type":"string"},{"type":"number"},{"nullable":true}],"description":"Payment terms in days for account members."},"active":{"anyOf":[{"type":"string"},{"type":"number"},{"nullable":true}],"description":"Whether the member account is active (truthy flag)."}},"required":["id","company_name","contact_name","address","suburb","postcode","state","phone","discount_factor","credit_limit","credit_limit_available","charge_type","last_invoice_timestamp","terms","active"],"additionalProperties":false},"SavedPaymentMethod":{"type":"object","properties":{"id":{"type":"string","pattern":"^(nab|paypal)_\\d+$","description":"Saved payment method id, formatted \"nab_<id>\" (card) or \"paypal_<id>\"."},"type":{"type":"string","enum":["credit_card","paypal"],"description":"Payment method type: \"credit_card\" or \"paypal\"."},"masked_label":{"type":"string","description":"Masked display label, e.g. \"Visa ****1234\"."},"is_default":{"type":"boolean","description":"Whether this is the member default payment method."}},"required":["id","type","masked_label","is_default"],"additionalProperties":false},"CouriersResponse":{"type":"object","properties":{"Allied":{"type":"object","properties":{"Allied":{"type":"string","enum":["allied"]},"Allied Pallet":{"type":"string","enum":["allied_pallet"]}},"required":["Allied","Allied Pallet"],"additionalProperties":false,"description":"Allied services mapped to their string_ids."},"Couriers Please":{"type":"string","enum":["couriers_please"],"description":"Couriers Please string_id."},"Team Global Express":{"type":"object","properties":{"Team Global Express IPEC":{"type":"string","enum":["team_global_express"]},"Team Global Express Priority":{"type":"string","enum":["team_global_express_priority"]},"Team Global Express Specialised":{"type":"string","enum":["team_global_express_specialised"]}},"required":["Team Global Express IPEC","Team Global Express Priority","Team Global Express Specialised"],"additionalProperties":false,"description":"Team Global Express services mapped to their string_ids."},"Northline":{"type":"string","enum":["northline"],"description":"Northline string_id."},"TNT Express":{"type":"object","properties":{"9AM":{"type":"string","enum":["tnt_nine_express"]},"10AM":{"type":"string","enum":["tnt_ten_express"]},"12PM":{"type":"string","enum":["tnt_twelve_express"]},"Overnight":{"type":"string","enum":["tnt_overnight_express"]},"Road Express":{"type":"string","enum":["tnt_road_express"]}},"required":["9AM","10AM","12PM","Overnight","Road Express"],"additionalProperties":false,"description":"TNT Express services mapped to their string_ids."},"Fedex":{"type":"object","properties":{"Fedex International Economy Document Export":{"type":"string","enum":["fedex_international_economy_document_export"]},"Fedex International Economy Document Import":{"type":"string","enum":["fedex_international_economy_document_import"]},"Fedex International Economy Export":{"type":"string","enum":["fedex_international_economy_export"]},"Fedex International Economy Import":{"type":"string","enum":["fedex_international_economy_import"]}},"required":["Fedex International Economy Document Export","Fedex International Economy Document Import","Fedex International Economy Export","Fedex International Economy Import"],"additionalProperties":false,"description":"FedEx international services mapped to their string_ids."},"Direct Couriers":{"type":"object","properties":{"Regular":{"type":"string","enum":["direct_couriers_regular"]},"Express":{"type":"string","enum":["direct_couriers_express"]},"Elite":{"type":"string","enum":["direct_couriers_elite"]}},"required":["Regular","Express","Elite"],"additionalProperties":false,"description":"Direct Couriers service tiers mapped to their string_ids."},"Sampson Express":{"type":"string","enum":["sampson_express"],"description":"Sampson Express string_id."},"Go People":{"type":"string","enum":["go_people"],"description":"Go People string_id."},"Capital Transport":{"type":"object","properties":{"Capital Transport":{"type":"string","enum":["capital_transport"]},"Capital Transport Express":{"type":"string","enum":["capital_transport_express"]}},"required":["Capital Transport","Capital Transport Express"],"additionalProperties":false,"description":"Capital Transport services mapped to their string_ids."},"Hunter Road Freight":{"type":"string","enum":["hunter_road_freight"],"description":"Hunter Road Freight string_id."},"Xpress":{"type":"string","enum":["xpress"],"description":"Xpress string_id."},"Aramex":{"type":"string","enum":["aramex"],"description":"Aramex string_id."}},"required":["Allied","Couriers Please","Team Global Express","Northline","TNT Express","Fedex","Direct Couriers","Sampson Express","Go People","Capital Transport","Hunter Road Freight","Xpress","Aramex"],"additionalProperties":false}},"parameters":{}},"paths":{"/api/v5/bookings/public":{"post":{"tags":["quotes"],"summary":"Get publicly-visible courier quotes (no API key required)","description":"Same as POST /api/v5/bookings but anonymous. Per-IP rate-limited (30/min, 150/5 min). Only couriers with publiclyVisible=true are included.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sender":{"type":"object","properties":{"address":{"nullable":true},"address2":{"nullable":true},"company_name":{"nullable":true},"email":{"nullable":true},"name":{"nullable":true},"phone":{"nullable":true},"postcode":{"nullable":true},"suburb":{"nullable":true},"state":{"nullable":true},"country":{"nullable":true},"type":{"nullable":true},"residential":{"type":"boolean","nullable":true},"tailgate":{"type":"boolean","nullable":true,"default":false}}},"receiver":{"type":"object","properties":{"address":{"nullable":true},"address2":{"nullable":true},"company_name":{"nullable":true},"email":{"nullable":true},"name":{"nullable":true},"phone":{"nullable":true},"postcode":{"nullable":true},"suburb":{"nullable":true},"state":{"nullable":true},"country":{"nullable":true},"type":{"nullable":true},"residential":{"type":"boolean","nullable":true},"tailgate":{"type":"boolean","nullable":true,"default":false}}},"items":{"type":"array","nullable":true,"items":{"type":"object","nullable":true,"properties":{"length":{"nullable":true},"width":{"nullable":true},"height":{"nullable":true},"weight":{"nullable":true},"quantity":{"nullable":true},"description":{"nullable":true},"sku":{"nullable":true}}}},"declared_value":{"nullable":true},"insured_value":{"nullable":true},"include_warranty":{"type":"boolean","nullable":true},"whole_weight":{"type":"boolean","nullable":true},"cost":{"nullable":true},"description":{"nullable":true},"instructions":{"type":"object","nullable":true,"properties":{"delivery":{"nullable":true},"pickup":{"nullable":true}}},"referrer":{"nullable":true},"requesting_site":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}]},"timeout":{"nullable":true},"tailgate_pickup":{"type":"boolean","nullable":true},"tailgate_delivery":{"type":"boolean","nullable":true},"pickup_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"options":{"type":"object","properties":{"tailgate_pickup":{"type":"boolean","nullable":true},"tailgate_delivery":{"type":"boolean","nullable":true},"insurance_value":{"type":"number","nullable":true,"minimum":0},"authority_to_leave":{"type":"boolean","nullable":true},"disable_cache":{"type":"boolean","nullable":true},"multipickup":{"type":"object","properties":{"address_id":{"type":"integer","minimum":0,"exclusiveMinimum":true},"tier":{"type":"integer","minimum":1,"maximum":2}}}},"default":{}}},"required":["sender","receiver"]},"examples":{"sydneyCartons":{"summary":"Sydney to Sydney cartons","value":{"sender":{"address":"1 Market Street","company_name":"Sender Pty Ltd","email":"sender@example.com","name":"Sender Contact","phone":"0290000000","postcode":"2000","suburb":"Sydney","state":"NSW","country":"AU","type":"business","tailgate":false},"receiver":{"address":"25 George Street","company_name":"Receiver Pty Ltd","email":"receiver@example.com","name":"Receiver Contact","phone":"0291111111","postcode":"2000","suburb":"Sydney","state":"NSW","country":"AU","type":"business","tailgate":false},"items":[{"description":"Carton","length":30,"width":20,"height":15,"weight":2,"quantity":1,"sku":"DEMO-CARTON-1"},{"description":"Carton","length":40,"width":30,"height":20,"weight":5,"quantity":1,"sku":"DEMO-CARTON-2"}],"declared_value":250,"insured_value":0,"description":"Demo Sydney carton quote","referrer":"api-demo","requesting_site":"api-worker-demo","tailgate_pickup":false,"tailgate_delivery":false,"options":{"authority_to_leave":false,"disable_cache":false}}}}}}},"responses":{"200":{"description":"Quote list (sorted by total ascending)","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"number","nullable":true},"booking_access_token":{"type":"string"},"booked_at":{"type":"string"},"booked_by":{"type":"string","nullable":true},"created_at":{"type":"string"},"declared_value":{"type":"number"},"insured_value":{"type":"number"},"description":{"type":"string","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"description":{"type":"string"},"weight":{"type":"number"},"length":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"},"quantity":{"type":"number"},"sku":{"nullable":true}},"required":["id","description","weight","length","width","height","quantity"]}},"label":{"type":"string"},"notifications":{"type":"object","properties":{"email":{"type":"boolean"},"sms":{"type":"boolean"}},"required":["email","sms"]},"quotes":{"type":"object","additionalProperties":{"type":"object","properties":{"total":{"type":"number"},"price_insurance_ex":{"type":"number"},"fee":{"type":"number"},"applied_gst":{"type":"number"},"insured_amount":{"type":"number"},"service":{"type":"string"},"transit_time":{"type":"string"},"transit":{"type":"object","properties":{"text":{"type":"string"},"type":{"type":"string","enum":["business_days","hours","same_day","overnight","date_time","unknown"]},"min_days":{"type":"number"},"max_days":{"type":"number"},"min_hours":{"type":"number"},"max_hours":{"type":"number"},"estimated_delivery_at":{"type":"string"}},"required":["text","type"]},"pickup_dates":{"type":"array","items":{"type":"string"}},"pickup_time":{"anyOf":[{"type":"string"},{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]}]},"pickupAvailability":{"type":"object","properties":{"dates":{"type":"array","items":{"type":"string"}},"dateLabels":{"type":"array","items":{"type":"string"}},"times":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]}},"earliest":{"type":"object","properties":{"day":{"type":"string"},"date":{"type":"string"},"time":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]},"times":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]}},"readyFromTimes":{"type":"array","items":{"type":"string"}},"lastAvailableTimes":{"type":"array","items":{"type":"string"}}},"required":["day","date","time"]},"pickupWindow":{"type":"object","properties":{"operatingStart":{"type":"string"},"operatingEnd":{"type":"string"},"displayStart":{"type":"string"},"displayEnd":{"type":"string"},"sameDayCutoff":{"type":"string"},"minWindowMinutes":{"type":"number"},"incrementMinutes":{"type":"number"},"fixed":{"type":"boolean"},"currentTimeInPickupTz":{"type":"string"},"senderUtcOffsetMinutes":{"type":"number","description":"The sender timezone's UTC offset in minutes when the quote was built."},"sameDayCutoffAtMs":{"type":"number","description":"Epoch ms at which today stops being an offered pickup date. Absent when there is none to expire."}},"required":["operatingStart","operatingEnd","displayStart","displayEnd","sameDayCutoff","minWindowMinutes","incrementMinutes","fixed"]},"readyFromTimes":{"type":"array","items":{"type":"string"}},"lastAvailableTimes":{"type":"array","items":{"type":"string"}},"todayReadyFromTimes":{"type":"array","items":{"type":"string"}},"fixedPickupTime":{"type":"boolean","enum":[true]}},"required":["dates","times"]},"pickup_cutoff":{"type":"string","nullable":true},"pickup_window":{"type":"object","properties":{"operatingStart":{"type":"string"},"operatingEnd":{"type":"string"},"displayStart":{"type":"string"},"displayEnd":{"type":"string"},"sameDayCutoff":{"type":"string"},"minWindowMinutes":{"type":"number"},"incrementMinutes":{"type":"number"},"fixed":{"type":"boolean"},"currentTimeInPickupTz":{"type":"string"},"senderUtcOffsetMinutes":{"type":"number","description":"The sender timezone's UTC offset in minutes when the quote was built."},"sameDayCutoffAtMs":{"type":"number","description":"Epoch ms at which today stops being an offered pickup date. Absent when there is none to expire."}},"required":["operatingStart","operatingEnd","displayStart","displayEnd","sameDayCutoff","minWindowMinutes","incrementMinutes","fixed"],"description":"Pickup-window rules driving the ready-from / last-available time picker."},"pickup_ready_from_times":{"type":"array","items":{"type":"string"},"description":"Selectable \"ready from\" pickup times (HH:mm), capped before the collection cutoff. The FULL business-day list — same-day narrowing is applied client-side per selected date via pickup_same_day_ready_from."},"pickup_last_available_times":{"type":"array","items":{"type":"string"},"description":"Selectable \"last available\" pickup times (HH:mm) at the uncapped business close."},"pickup_same_day_ready_from":{"type":"string","nullable":true,"description":"Earliest \"ready from\" time (HH:mm) selectable when the pickup date is today; the picker floors same-day pickups to this. Absent (or null) when today is not an offered pickup date."},"rate_card_code":{"type":"string","description":"Internal rate-card code used to price this quote."},"free_shipping":{"type":"boolean","enum":[true]},"courier":{"type":"string"},"surcharge":{"type":"number"},"tiers":{"type":"array","items":{"type":"object","properties":{"identifier":{"type":"number"},"description":{"type":"string"},"total":{"type":"number"},"price_insurance_ex":{"type":"number"},"fee":{"type":"number"},"applied_gst":{"type":"number"},"insured_amount":{"type":"number"}},"required":["identifier","description","total","price_insurance_ex","fee","applied_gst","insured_amount"]},"description":"Available insurance/service tiers for this quote."}},"required":["total","price_insurance_ex","fee","applied_gst","insured_amount","service","transit_time","transit","pickup_dates","pickup_time","pickupAvailability","rate_card_code"]},"description":"Map of carrier/service key to the quote returned for it."},"quote_errors":{"type":"array","items":{"type":"object","properties":{"courier":{"type":"string"},"code":{"type":"string"},"serviceability":{"type":"string"},"message":{"type":"string","default":""},"retryable":{"type":"boolean","default":false}},"required":["courier","code"]},"description":"Per-carrier errors for carriers that could not be quoted."},"receiver":{"type":"object","properties":{"id":{"type":"number"},"address":{"type":"string"},"address2":{"type":"string"},"company_name":{"type":"string"},"email":{"type":"string","nullable":true},"name":{"type":"string"},"postcode":{"type":"string"},"phone":{"type":"string"},"state":{"type":"string"},"suburb":{"type":"string"},"type":{"type":"string","enum":["business","residential"]},"country":{"type":"string"}},"required":["id","address","company_name","email","name","postcode","phone","state","suburb","type","country"],"description":"Delivery (destination) address on the quote."},"sender":{"type":"object","properties":{"id":{"type":"number"},"address":{"type":"string"},"address2":{"type":"string"},"company_name":{"type":"string"},"email":{"type":"string","nullable":true},"name":{"type":"string"},"postcode":{"type":"string"},"phone":{"type":"string"},"state":{"type":"string"},"suburb":{"type":"string"},"type":{"type":"string","enum":["business","residential"]},"country":{"type":"string"}},"required":["id","address","company_name","email","name","postcode","phone","state","suburb","type","country"],"description":"Pickup (origin) address on the quote."},"pickup_window":{"type":"array","items":{"type":"string"},"description":"Selected pickup window as a pair of time strings [from, to]."},"connote":{"type":"string","nullable":true,"description":"Carrier consignment (connote) number, once lodged, or null."},"charged_weight":{"type":"number","description":"Weight the carrier charged on, in kilograms (kg)."},"scanned_weight":{"type":"number","description":"Weight scanned by the carrier, in kilograms (kg)."},"special_instructions":{"type":"string","description":"Special handling instructions for the consignment."},"status":{"type":"string","description":"Booking status, e.g. \"new\"/\"pending_payment\" (quote) or a paid/confirmed state."},"cost":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/components/schemas/ApiJsonValue"}},{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}}],"description":"Selected quote cost breakdown, when present."},"updated_at":{"type":"string","description":"Timestamp the quote/booking was last updated, as an ISO 8601 datetime."},"pickup_instructions":{"type":"string","nullable":true,"description":"Instructions for the driver at pickup, or null."},"tailgate_pickup":{"type":"boolean","description":"Whether a tailgate vehicle was requested at pickup."},"tailgate_delivery":{"type":"boolean","description":"Whether a tailgate vehicle was requested at delivery."},"pendingVisualChecks":{"type":"array","items":{"type":"object","properties":{"bookingCheckId":{"type":"integer"},"checkId":{"type":"integer"},"checkName":{"type":"string"},"checkDescription":{"type":"string","default":""},"formJson":{"type":"string","nullable":true},"timing":{"type":"string","nullable":true},"status":{"type":"string"},"createdAt":{"type":"string","nullable":true},"blocksStep":{"type":"boolean"}},"required":["bookingCheckId","checkId","checkName","status"]}},"service_notices":{"type":"array","items":{"type":"object","properties":{"courier":{"type":"string"},"kind":{"type":"string"},"message":{"type":"string"}},"required":["courier","kind","message"]},"description":"Informational, non-bookable carrier notices (e.g. a carrier whose quote API is temporarily down), shown as their own rows in the quote list."},"meta":{"type":"object","properties":{"api_version":{"type":"string","enum":["v5"]},"cache":{"type":"object","properties":{"status":{"type":"string","enum":["HIT","MISS","BYPASS"]},"original_duration_ms":{"type":"number"},"served_duration_ms":{"type":"number"}},"required":["status"]},"timing":{"type":"object","properties":{"duration_ms":{"type":"number"},"boxing_duration_ms":{"type":"number"},"carrier_timings_ms":{"type":"object","additionalProperties":{"type":"number"}}}},"anonymous":{"type":"boolean"},"quote_count":{"type":"number"},"warnings":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"input":{"type":"object","properties":{"postcode":{"type":"string"},"suburb":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"priority":{"type":"number","nullable":true}}},"inferred":{"type":"object","properties":{"postcode":{"type":"string"},"suburb":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"priority":{"type":"number","nullable":true}}},"suggestions":{"type":"array","items":{"type":"object","properties":{"postcode":{"type":"string"},"suburb":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"priority":{"type":"number","nullable":true}}}}},"required":["code","path","message"]}},"persistence":{"type":"object","properties":{"booking_write_mode":{"type":"string","enum":["disabled","enabled"]},"status":{"type":"string","enum":["disabled","written","failed"]},"via":{"type":"string","enum":["hyperdrive","remote-v5","php"]},"book_origin":{"type":"string"}},"required":["booking_write_mode","status"]},"parity":{"type":"object","properties":{"mode":{"type":"string","enum":["disabled","enabled"]},"status":{"type":"string","enum":["skipped","queued"]}},"required":["mode","status"]},"admin":{"type":"object","properties":{"calculations":{"type":"object","additionalProperties":{"type":"object","properties":{"courier":{"type":"string"},"pipeline":{"type":"string","enum":["default","family"]},"error":{"$ref":"#/components/schemas/ApiJsonValue"},"gstAlreadyIncluded":{"type":"boolean"},"fuelLevy":{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["static"]},"pct":{"type":"number"}},"required":["kind","pct"]},{"type":"object","properties":{"kind":{"type":"string","enum":["monthly-fetch"]},"surchargeKey":{"type":"string"}},"required":["kind","surchargeKey"]},{"type":"object","properties":{"kind":{"type":"string","enum":["in-response"]}},"required":["kind"]}]},"marginMultiplier":{"type":"number"},"memberDiscount":{"type":"number"},"courierRaw":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}]}},{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}]}}]},"carbonOffsetBase":{"type":"number"},"trace":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"atMs":{"type":"number"},"courier":{"type":"string"},"label":{"type":"string"},"cache":{"$ref":"#/components/schemas/ApiJsonValue"},"payload":{"$ref":"#/components/schemas/ApiJsonValue"}},"required":["kind","atMs","label"]}},"steps":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"before":{"type":"number"},"after":{"type":"number"},"delta":{"type":"number"},"rounding":{"type":"object","properties":{"preRound":{"type":"number"},"postRound":{"type":"number"},"precision":{"type":"integer","minimum":0}},"required":["preRound","postRound","precision"]}},"required":["key","label","after"]}}},"required":["courier","pipeline","fuelLevy","marginMultiplier","steps"]}},"upstreamErrors":{"type":"object","additionalProperties":{"type":"object","properties":{"kind":{"type":"string","enum":["upstream_status"]},"status":{"type":"number"},"reason":{"type":"string"},"body":{"type":"string"}},"required":["kind","status","reason"]}}}}},"required":["api_version","cache","timing"]}},"required":["id","booked_at","booked_by","created_at","declared_value","insured_value","description","items","label","notifications","quotes","quote_errors","receiver","sender","pickup_window","connote","charged_weight","scanned_weight","special_instructions","status","updated_at","pickup_instructions","tailgate_pickup","tailgate_delivery"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"member_id":{"anyOf":[{"type":"string"},{"type":"number"}]},"limit":{"type":"number"},"window_seconds":{"type":"number"},"upgrade":{"type":"object","properties":{"signup_endpoint":{"type":"string"},"signup_method":{"type":"string"},"quote_endpoint":{"type":"string"},"api_key_header":{"type":"string"},"docs":{"type":"string"}}}},"required":["error"]},{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}},"substituted_fields":{"type":"array","items":{"type":"string"},"description":"Validation paths whose rejected values were substituted by server-side module settings rather than supplied by the caller."}},"required":["errors"]},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}},"required":["status","message"]}]}}}},"429":{"description":"Rate-limited","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"member_id":{"anyOf":[{"type":"string"},{"type":"number"}]},"limit":{"type":"number"},"window_seconds":{"type":"number"},"upgrade":{"type":"object","properties":{"signup_endpoint":{"type":"string"},"signup_method":{"type":"string"},"quote_endpoint":{"type":"string"},"api_key_header":{"type":"string"},"docs":{"type":"string"}}}},"required":["error"]},{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}},"substituted_fields":{"type":"array","items":{"type":"string"},"description":"Validation paths whose rejected values were substituted by server-side module settings rather than supplied by the caller."}},"required":["errors"]},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}},"required":["status","message"]}]}}}}}}},"/api/v5/bookings":{"post":{"tags":["quotes"],"summary":"Get courier quotes for a shipment","description":"With an api-key, boxes the items, fans out to every courier the calling member has enabled, applies member discounts/rules, and inserts a bookings row with status=new. Without an api-key, runs publicly-visible couriers only and is limited to 10 requests/hour per IP.","security":[{"ApiKeyAuth":[]},{}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sender":{"type":"object","properties":{"address":{"nullable":true},"address2":{"nullable":true},"company_name":{"nullable":true},"email":{"nullable":true},"name":{"nullable":true},"phone":{"nullable":true},"postcode":{"nullable":true},"suburb":{"nullable":true},"state":{"nullable":true},"country":{"nullable":true},"type":{"nullable":true},"residential":{"type":"boolean","nullable":true},"tailgate":{"type":"boolean","nullable":true,"default":false}}},"receiver":{"type":"object","properties":{"address":{"nullable":true},"address2":{"nullable":true},"company_name":{"nullable":true},"email":{"nullable":true},"name":{"nullable":true},"phone":{"nullable":true},"postcode":{"nullable":true},"suburb":{"nullable":true},"state":{"nullable":true},"country":{"nullable":true},"type":{"nullable":true},"residential":{"type":"boolean","nullable":true},"tailgate":{"type":"boolean","nullable":true,"default":false}}},"items":{"type":"array","nullable":true,"items":{"type":"object","nullable":true,"properties":{"length":{"nullable":true},"width":{"nullable":true},"height":{"nullable":true},"weight":{"nullable":true},"quantity":{"nullable":true},"description":{"nullable":true},"sku":{"nullable":true}}}},"declared_value":{"nullable":true},"insured_value":{"nullable":true},"include_warranty":{"type":"boolean","nullable":true},"whole_weight":{"type":"boolean","nullable":true},"cost":{"nullable":true},"description":{"nullable":true},"instructions":{"type":"object","nullable":true,"properties":{"delivery":{"nullable":true},"pickup":{"nullable":true}}},"referrer":{"nullable":true},"requesting_site":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}]},"timeout":{"nullable":true},"tailgate_pickup":{"type":"boolean","nullable":true},"tailgate_delivery":{"type":"boolean","nullable":true},"pickup_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"options":{"type":"object","properties":{"tailgate_pickup":{"type":"boolean","nullable":true},"tailgate_delivery":{"type":"boolean","nullable":true},"insurance_value":{"type":"number","nullable":true,"minimum":0},"authority_to_leave":{"type":"boolean","nullable":true},"disable_cache":{"type":"boolean","nullable":true},"multipickup":{"type":"object","properties":{"address_id":{"type":"integer","minimum":0,"exclusiveMinimum":true},"tier":{"type":"integer","minimum":1,"maximum":2}}}},"default":{}}},"required":["sender","receiver"]},"examples":{"sydneyCartons":{"summary":"Sydney to Sydney cartons","value":{"sender":{"address":"1 Market Street","company_name":"Sender Pty Ltd","email":"sender@example.com","name":"Sender Contact","phone":"0290000000","postcode":"2000","suburb":"Sydney","state":"NSW","country":"AU","type":"business","tailgate":false},"receiver":{"address":"25 George Street","company_name":"Receiver Pty Ltd","email":"receiver@example.com","name":"Receiver Contact","phone":"0291111111","postcode":"2000","suburb":"Sydney","state":"NSW","country":"AU","type":"business","tailgate":false},"items":[{"description":"Carton","length":30,"width":20,"height":15,"weight":2,"quantity":1,"sku":"DEMO-CARTON-1"},{"description":"Carton","length":40,"width":30,"height":20,"weight":5,"quantity":1,"sku":"DEMO-CARTON-2"}],"declared_value":250,"insured_value":0,"description":"Demo Sydney carton quote","referrer":"api-demo","requesting_site":"api-worker-demo","tailgate_pickup":false,"tailgate_delivery":false,"options":{"authority_to_leave":false,"disable_cache":false}}}}}}},"responses":{"200":{"description":"Quote list (sorted by total ascending)","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"number","nullable":true},"booking_access_token":{"type":"string"},"booked_at":{"type":"string"},"booked_by":{"type":"string","nullable":true},"created_at":{"type":"string"},"declared_value":{"type":"number"},"insured_value":{"type":"number"},"description":{"type":"string","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"description":{"type":"string"},"weight":{"type":"number"},"length":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"},"quantity":{"type":"number"},"sku":{"nullable":true}},"required":["id","description","weight","length","width","height","quantity"]}},"label":{"type":"string"},"notifications":{"type":"object","properties":{"email":{"type":"boolean"},"sms":{"type":"boolean"}},"required":["email","sms"]},"quotes":{"type":"object","additionalProperties":{"type":"object","properties":{"total":{"type":"number"},"price_insurance_ex":{"type":"number"},"fee":{"type":"number"},"applied_gst":{"type":"number"},"insured_amount":{"type":"number"},"service":{"type":"string"},"transit_time":{"type":"string"},"transit":{"type":"object","properties":{"text":{"type":"string"},"type":{"type":"string","enum":["business_days","hours","same_day","overnight","date_time","unknown"]},"min_days":{"type":"number"},"max_days":{"type":"number"},"min_hours":{"type":"number"},"max_hours":{"type":"number"},"estimated_delivery_at":{"type":"string"}},"required":["text","type"]},"pickup_dates":{"type":"array","items":{"type":"string"}},"pickup_time":{"anyOf":[{"type":"string"},{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]}]},"pickupAvailability":{"type":"object","properties":{"dates":{"type":"array","items":{"type":"string"}},"dateLabels":{"type":"array","items":{"type":"string"}},"times":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]}},"earliest":{"type":"object","properties":{"day":{"type":"string"},"date":{"type":"string"},"time":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]},"times":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]}},"readyFromTimes":{"type":"array","items":{"type":"string"}},"lastAvailableTimes":{"type":"array","items":{"type":"string"}}},"required":["day","date","time"]},"pickupWindow":{"type":"object","properties":{"operatingStart":{"type":"string"},"operatingEnd":{"type":"string"},"displayStart":{"type":"string"},"displayEnd":{"type":"string"},"sameDayCutoff":{"type":"string"},"minWindowMinutes":{"type":"number"},"incrementMinutes":{"type":"number"},"fixed":{"type":"boolean"},"currentTimeInPickupTz":{"type":"string"},"senderUtcOffsetMinutes":{"type":"number","description":"The sender timezone's UTC offset in minutes when the quote was built."},"sameDayCutoffAtMs":{"type":"number","description":"Epoch ms at which today stops being an offered pickup date. Absent when there is none to expire."}},"required":["operatingStart","operatingEnd","displayStart","displayEnd","sameDayCutoff","minWindowMinutes","incrementMinutes","fixed"]},"readyFromTimes":{"type":"array","items":{"type":"string"}},"lastAvailableTimes":{"type":"array","items":{"type":"string"}},"todayReadyFromTimes":{"type":"array","items":{"type":"string"}},"fixedPickupTime":{"type":"boolean","enum":[true]}},"required":["dates","times"]},"pickup_cutoff":{"type":"string","nullable":true},"pickup_window":{"type":"object","properties":{"operatingStart":{"type":"string"},"operatingEnd":{"type":"string"},"displayStart":{"type":"string"},"displayEnd":{"type":"string"},"sameDayCutoff":{"type":"string"},"minWindowMinutes":{"type":"number"},"incrementMinutes":{"type":"number"},"fixed":{"type":"boolean"},"currentTimeInPickupTz":{"type":"string"},"senderUtcOffsetMinutes":{"type":"number","description":"The sender timezone's UTC offset in minutes when the quote was built."},"sameDayCutoffAtMs":{"type":"number","description":"Epoch ms at which today stops being an offered pickup date. Absent when there is none to expire."}},"required":["operatingStart","operatingEnd","displayStart","displayEnd","sameDayCutoff","minWindowMinutes","incrementMinutes","fixed"],"description":"Pickup-window rules driving the ready-from / last-available time picker."},"pickup_ready_from_times":{"type":"array","items":{"type":"string"},"description":"Selectable \"ready from\" pickup times (HH:mm), capped before the collection cutoff. The FULL business-day list — same-day narrowing is applied client-side per selected date via pickup_same_day_ready_from."},"pickup_last_available_times":{"type":"array","items":{"type":"string"},"description":"Selectable \"last available\" pickup times (HH:mm) at the uncapped business close."},"pickup_same_day_ready_from":{"type":"string","nullable":true,"description":"Earliest \"ready from\" time (HH:mm) selectable when the pickup date is today; the picker floors same-day pickups to this. Absent (or null) when today is not an offered pickup date."},"rate_card_code":{"type":"string","description":"Internal rate-card code used to price this quote."},"free_shipping":{"type":"boolean","enum":[true]},"courier":{"type":"string"},"surcharge":{"type":"number"},"tiers":{"type":"array","items":{"type":"object","properties":{"identifier":{"type":"number"},"description":{"type":"string"},"total":{"type":"number"},"price_insurance_ex":{"type":"number"},"fee":{"type":"number"},"applied_gst":{"type":"number"},"insured_amount":{"type":"number"}},"required":["identifier","description","total","price_insurance_ex","fee","applied_gst","insured_amount"]},"description":"Available insurance/service tiers for this quote."}},"required":["total","price_insurance_ex","fee","applied_gst","insured_amount","service","transit_time","transit","pickup_dates","pickup_time","pickupAvailability","rate_card_code"]},"description":"Map of carrier/service key to the quote returned for it."},"quote_errors":{"type":"array","items":{"type":"object","properties":{"courier":{"type":"string"},"code":{"type":"string"},"serviceability":{"type":"string"},"message":{"type":"string","default":""},"retryable":{"type":"boolean","default":false}},"required":["courier","code"]},"description":"Per-carrier errors for carriers that could not be quoted."},"receiver":{"type":"object","properties":{"id":{"type":"number"},"address":{"type":"string"},"address2":{"type":"string"},"company_name":{"type":"string"},"email":{"type":"string","nullable":true},"name":{"type":"string"},"postcode":{"type":"string"},"phone":{"type":"string"},"state":{"type":"string"},"suburb":{"type":"string"},"type":{"type":"string","enum":["business","residential"]},"country":{"type":"string"}},"required":["id","address","company_name","email","name","postcode","phone","state","suburb","type","country"],"description":"Delivery (destination) address on the quote."},"sender":{"type":"object","properties":{"id":{"type":"number"},"address":{"type":"string"},"address2":{"type":"string"},"company_name":{"type":"string"},"email":{"type":"string","nullable":true},"name":{"type":"string"},"postcode":{"type":"string"},"phone":{"type":"string"},"state":{"type":"string"},"suburb":{"type":"string"},"type":{"type":"string","enum":["business","residential"]},"country":{"type":"string"}},"required":["id","address","company_name","email","name","postcode","phone","state","suburb","type","country"],"description":"Pickup (origin) address on the quote."},"pickup_window":{"type":"array","items":{"type":"string"},"description":"Selected pickup window as a pair of time strings [from, to]."},"connote":{"type":"string","nullable":true,"description":"Carrier consignment (connote) number, once lodged, or null."},"charged_weight":{"type":"number","description":"Weight the carrier charged on, in kilograms (kg)."},"scanned_weight":{"type":"number","description":"Weight scanned by the carrier, in kilograms (kg)."},"special_instructions":{"type":"string","description":"Special handling instructions for the consignment."},"status":{"type":"string","description":"Booking status, e.g. \"new\"/\"pending_payment\" (quote) or a paid/confirmed state."},"cost":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/components/schemas/ApiJsonValue"}},{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}}],"description":"Selected quote cost breakdown, when present."},"updated_at":{"type":"string","description":"Timestamp the quote/booking was last updated, as an ISO 8601 datetime."},"pickup_instructions":{"type":"string","nullable":true,"description":"Instructions for the driver at pickup, or null."},"tailgate_pickup":{"type":"boolean","description":"Whether a tailgate vehicle was requested at pickup."},"tailgate_delivery":{"type":"boolean","description":"Whether a tailgate vehicle was requested at delivery."},"pendingVisualChecks":{"type":"array","items":{"type":"object","properties":{"bookingCheckId":{"type":"integer"},"checkId":{"type":"integer"},"checkName":{"type":"string"},"checkDescription":{"type":"string","default":""},"formJson":{"type":"string","nullable":true},"timing":{"type":"string","nullable":true},"status":{"type":"string"},"createdAt":{"type":"string","nullable":true},"blocksStep":{"type":"boolean"}},"required":["bookingCheckId","checkId","checkName","status"]}},"service_notices":{"type":"array","items":{"type":"object","properties":{"courier":{"type":"string"},"kind":{"type":"string"},"message":{"type":"string"}},"required":["courier","kind","message"]},"description":"Informational, non-bookable carrier notices (e.g. a carrier whose quote API is temporarily down), shown as their own rows in the quote list."},"meta":{"type":"object","properties":{"api_version":{"type":"string","enum":["v5"]},"cache":{"type":"object","properties":{"status":{"type":"string","enum":["HIT","MISS","BYPASS"]},"original_duration_ms":{"type":"number"},"served_duration_ms":{"type":"number"}},"required":["status"]},"timing":{"type":"object","properties":{"duration_ms":{"type":"number"},"boxing_duration_ms":{"type":"number"},"carrier_timings_ms":{"type":"object","additionalProperties":{"type":"number"}}}},"anonymous":{"type":"boolean"},"quote_count":{"type":"number"},"warnings":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"input":{"type":"object","properties":{"postcode":{"type":"string"},"suburb":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"priority":{"type":"number","nullable":true}}},"inferred":{"type":"object","properties":{"postcode":{"type":"string"},"suburb":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"priority":{"type":"number","nullable":true}}},"suggestions":{"type":"array","items":{"type":"object","properties":{"postcode":{"type":"string"},"suburb":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"priority":{"type":"number","nullable":true}}}}},"required":["code","path","message"]}},"persistence":{"type":"object","properties":{"booking_write_mode":{"type":"string","enum":["disabled","enabled"]},"status":{"type":"string","enum":["disabled","written","failed"]},"via":{"type":"string","enum":["hyperdrive","remote-v5","php"]},"book_origin":{"type":"string"}},"required":["booking_write_mode","status"]},"parity":{"type":"object","properties":{"mode":{"type":"string","enum":["disabled","enabled"]},"status":{"type":"string","enum":["skipped","queued"]}},"required":["mode","status"]},"admin":{"type":"object","properties":{"calculations":{"type":"object","additionalProperties":{"type":"object","properties":{"courier":{"type":"string"},"pipeline":{"type":"string","enum":["default","family"]},"error":{"$ref":"#/components/schemas/ApiJsonValue"},"gstAlreadyIncluded":{"type":"boolean"},"fuelLevy":{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["static"]},"pct":{"type":"number"}},"required":["kind","pct"]},{"type":"object","properties":{"kind":{"type":"string","enum":["monthly-fetch"]},"surchargeKey":{"type":"string"}},"required":["kind","surchargeKey"]},{"type":"object","properties":{"kind":{"type":"string","enum":["in-response"]}},"required":["kind"]}]},"marginMultiplier":{"type":"number"},"memberDiscount":{"type":"number"},"courierRaw":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}]}},{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}]}}]},"carbonOffsetBase":{"type":"number"},"trace":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"atMs":{"type":"number"},"courier":{"type":"string"},"label":{"type":"string"},"cache":{"$ref":"#/components/schemas/ApiJsonValue"},"payload":{"$ref":"#/components/schemas/ApiJsonValue"}},"required":["kind","atMs","label"]}},"steps":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"before":{"type":"number"},"after":{"type":"number"},"delta":{"type":"number"},"rounding":{"type":"object","properties":{"preRound":{"type":"number"},"postRound":{"type":"number"},"precision":{"type":"integer","minimum":0}},"required":["preRound","postRound","precision"]}},"required":["key","label","after"]}}},"required":["courier","pipeline","fuelLevy","marginMultiplier","steps"]}},"upstreamErrors":{"type":"object","additionalProperties":{"type":"object","properties":{"kind":{"type":"string","enum":["upstream_status"]},"status":{"type":"number"},"reason":{"type":"string"},"body":{"type":"string"}},"required":["kind","status","reason"]}}}}},"required":["api_version","cache","timing"]}},"required":["id","booked_at","booked_by","created_at","declared_value","insured_value","description","items","label","notifications","quotes","quote_errors","receiver","sender","pickup_window","connote","charged_weight","scanned_weight","special_instructions","status","updated_at","pickup_instructions","tailgate_pickup","tailgate_delivery"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"member_id":{"anyOf":[{"type":"string"},{"type":"number"}]},"limit":{"type":"number"},"window_seconds":{"type":"number"},"upgrade":{"type":"object","properties":{"signup_endpoint":{"type":"string"},"signup_method":{"type":"string"},"quote_endpoint":{"type":"string"},"api_key_header":{"type":"string"},"docs":{"type":"string"}}}},"required":["error"]},{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}},"substituted_fields":{"type":"array","items":{"type":"string"},"description":"Validation paths whose rejected values were substituted by server-side module settings rather than supplied by the caller."}},"required":["errors"]},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}},"required":["status","message"]}]}}}},"401":{"description":"Invalid api key","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"member_id":{"anyOf":[{"type":"string"},{"type":"number"}]},"limit":{"type":"number"},"window_seconds":{"type":"number"},"upgrade":{"type":"object","properties":{"signup_endpoint":{"type":"string"},"signup_method":{"type":"string"},"quote_endpoint":{"type":"string"},"api_key_header":{"type":"string"},"docs":{"type":"string"}}}},"required":["error"]},{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}},"substituted_fields":{"type":"array","items":{"type":"string"},"description":"Validation paths whose rejected values were substituted by server-side module settings rather than supplied by the caller."}},"required":["errors"]},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}},"required":["status","message"]}]}}}},"404":{"description":"Member not found","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"member_id":{"anyOf":[{"type":"string"},{"type":"number"}]},"limit":{"type":"number"},"window_seconds":{"type":"number"},"upgrade":{"type":"object","properties":{"signup_endpoint":{"type":"string"},"signup_method":{"type":"string"},"quote_endpoint":{"type":"string"},"api_key_header":{"type":"string"},"docs":{"type":"string"}}}},"required":["error"]},{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}},"substituted_fields":{"type":"array","items":{"type":"string"},"description":"Validation paths whose rejected values were substituted by server-side module settings rather than supplied by the caller."}},"required":["errors"]},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}},"required":["status","message"]}]}}}},"429":{"description":"Rate-limited","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"member_id":{"anyOf":[{"type":"string"},{"type":"number"}]},"limit":{"type":"number"},"window_seconds":{"type":"number"},"upgrade":{"type":"object","properties":{"signup_endpoint":{"type":"string"},"signup_method":{"type":"string"},"quote_endpoint":{"type":"string"},"api_key_header":{"type":"string"},"docs":{"type":"string"}}}},"required":["error"]},{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}},"substituted_fields":{"type":"array","items":{"type":"string"},"description":"Validation paths whose rejected values were substituted by server-side module settings rather than supplied by the caller."}},"required":["errors"]},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}},"required":["status","message"]}]}}}},"503":{"description":"Quote reference data unavailable","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"member_id":{"anyOf":[{"type":"string"},{"type":"number"}]},"limit":{"type":"number"},"window_seconds":{"type":"number"},"upgrade":{"type":"object","properties":{"signup_endpoint":{"type":"string"},"signup_method":{"type":"string"},"quote_endpoint":{"type":"string"},"api_key_header":{"type":"string"},"docs":{"type":"string"}}}},"required":["error"]},{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}},"substituted_fields":{"type":"array","items":{"type":"string"},"description":"Validation paths whose rejected values were substituted by server-side module settings rather than supplied by the caller."}},"required":["errors"]},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}},"required":["status","message"]}]}}}}}},"get":{"tags":["bookings"],"summary":"List bookings","description":"Lists the authenticated member's bookings and quotes, newest first. Supports ETag / Last-Modified conditional requests and returns 304 when the cache validator is still current. Requires an API key. Returns 404 when the member has no bookings.","parameters":[{"schema":{"type":"string","description":"Only return bookings created at or after this time (ISO 8601 datetime)."},"required":false,"description":"Only return bookings created at or after this time (ISO 8601 datetime).","name":"since","in":"query"},{"schema":{"type":"string","description":"Column to sort by (e.g. booking_time, paid_date, status, cost, courier); prefix with \"-\" for descending. Defaults to newest first (booking_time descending)."},"required":false,"description":"Column to sort by (e.g. booking_time, paid_date, status, cost, courier); prefix with \"-\" for descending. Defaults to newest first (booking_time descending).","name":"sort","in":"query"}],"responses":{"200":{"description":"Booking list","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Booking"}}}}},"304":{"description":"Booking list cache validator still current"},"400":{"description":"Invalid booking list query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointError"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"No bookings found"}}}},"/api/v5/bookings/stream":{"post":{"tags":["quotes"],"summary":"Stream courier quotes as they become available","description":"Server-Sent Events endpoint for the v5 quote flow. Emits ready, quote, carrier_error, and complete events. Uses the same authentication, anonymous rate limit, member discount, surcharge, warranty, and cache behaviour as POST /api/v5/bookings.","security":[{"ApiKeyAuth":[]},{}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sender":{"type":"object","properties":{"address":{"nullable":true},"address2":{"nullable":true},"company_name":{"nullable":true},"email":{"nullable":true},"name":{"nullable":true},"phone":{"nullable":true},"postcode":{"nullable":true},"suburb":{"nullable":true},"state":{"nullable":true},"country":{"nullable":true},"type":{"nullable":true},"residential":{"type":"boolean","nullable":true},"tailgate":{"type":"boolean","nullable":true,"default":false}}},"receiver":{"type":"object","properties":{"address":{"nullable":true},"address2":{"nullable":true},"company_name":{"nullable":true},"email":{"nullable":true},"name":{"nullable":true},"phone":{"nullable":true},"postcode":{"nullable":true},"suburb":{"nullable":true},"state":{"nullable":true},"country":{"nullable":true},"type":{"nullable":true},"residential":{"type":"boolean","nullable":true},"tailgate":{"type":"boolean","nullable":true,"default":false}}},"items":{"type":"array","nullable":true,"items":{"type":"object","nullable":true,"properties":{"length":{"nullable":true},"width":{"nullable":true},"height":{"nullable":true},"weight":{"nullable":true},"quantity":{"nullable":true},"description":{"nullable":true},"sku":{"nullable":true}}}},"declared_value":{"nullable":true},"insured_value":{"nullable":true},"include_warranty":{"type":"boolean","nullable":true},"whole_weight":{"type":"boolean","nullable":true},"cost":{"nullable":true},"description":{"nullable":true},"instructions":{"type":"object","nullable":true,"properties":{"delivery":{"nullable":true},"pickup":{"nullable":true}}},"referrer":{"nullable":true},"requesting_site":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}]},"timeout":{"nullable":true},"tailgate_pickup":{"type":"boolean","nullable":true},"tailgate_delivery":{"type":"boolean","nullable":true},"pickup_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"options":{"type":"object","properties":{"tailgate_pickup":{"type":"boolean","nullable":true},"tailgate_delivery":{"type":"boolean","nullable":true},"insurance_value":{"type":"number","nullable":true,"minimum":0},"authority_to_leave":{"type":"boolean","nullable":true},"disable_cache":{"type":"boolean","nullable":true},"multipickup":{"type":"object","properties":{"address_id":{"type":"integer","minimum":0,"exclusiveMinimum":true},"tier":{"type":"integer","minimum":1,"maximum":2}}}},"default":{}}},"required":["sender","receiver"]},"examples":{"sydneyCartons":{"summary":"Sydney to Sydney cartons","value":{"sender":{"address":"1 Market Street","company_name":"Sender Pty Ltd","email":"sender@example.com","name":"Sender Contact","phone":"0290000000","postcode":"2000","suburb":"Sydney","state":"NSW","country":"AU","type":"business","tailgate":false},"receiver":{"address":"25 George Street","company_name":"Receiver Pty Ltd","email":"receiver@example.com","name":"Receiver Contact","phone":"0291111111","postcode":"2000","suburb":"Sydney","state":"NSW","country":"AU","type":"business","tailgate":false},"items":[{"description":"Carton","length":30,"width":20,"height":15,"weight":2,"quantity":1,"sku":"DEMO-CARTON-1"},{"description":"Carton","length":40,"width":30,"height":20,"weight":5,"quantity":1,"sku":"DEMO-CARTON-2"}],"declared_value":250,"insured_value":0,"description":"Demo Sydney carton quote","referrer":"api-demo","requesting_site":"api-worker-demo","tailgate_pickup":false,"tailgate_delivery":false,"options":{"authority_to_leave":false,"disable_cache":false}}}}}}},"responses":{"200":{"description":"Server-Sent Events stream of quote progress","content":{"text/event-stream":{"schema":{"type":"string","example":"event: ready\ndata: {\"carrierCount\":4,\"cached\":false}\n\nevent: quote\ndata: {\"carrier\":\"direct_couriers\",\"latencyMs\":421}\n\nevent: complete\ndata: {\"cached\":false,\"durationMs\":1380}\n\n"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"member_id":{"anyOf":[{"type":"string"},{"type":"number"}]},"limit":{"type":"number"},"window_seconds":{"type":"number"},"upgrade":{"type":"object","properties":{"signup_endpoint":{"type":"string"},"signup_method":{"type":"string"},"quote_endpoint":{"type":"string"},"api_key_header":{"type":"string"},"docs":{"type":"string"}}}},"required":["error"]},{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}},"substituted_fields":{"type":"array","items":{"type":"string"},"description":"Validation paths whose rejected values were substituted by server-side module settings rather than supplied by the caller."}},"required":["errors"]},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}},"required":["status","message"]}]}}}},"401":{"description":"Invalid api key","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"member_id":{"anyOf":[{"type":"string"},{"type":"number"}]},"limit":{"type":"number"},"window_seconds":{"type":"number"},"upgrade":{"type":"object","properties":{"signup_endpoint":{"type":"string"},"signup_method":{"type":"string"},"quote_endpoint":{"type":"string"},"api_key_header":{"type":"string"},"docs":{"type":"string"}}}},"required":["error"]},{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}},"substituted_fields":{"type":"array","items":{"type":"string"},"description":"Validation paths whose rejected values were substituted by server-side module settings rather than supplied by the caller."}},"required":["errors"]},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}},"required":["status","message"]}]}}}},"404":{"description":"Member not found","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"member_id":{"anyOf":[{"type":"string"},{"type":"number"}]},"limit":{"type":"number"},"window_seconds":{"type":"number"},"upgrade":{"type":"object","properties":{"signup_endpoint":{"type":"string"},"signup_method":{"type":"string"},"quote_endpoint":{"type":"string"},"api_key_header":{"type":"string"},"docs":{"type":"string"}}}},"required":["error"]},{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}},"substituted_fields":{"type":"array","items":{"type":"string"},"description":"Validation paths whose rejected values were substituted by server-side module settings rather than supplied by the caller."}},"required":["errors"]},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}},"required":["status","message"]}]}}}},"429":{"description":"Rate-limited","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"member_id":{"anyOf":[{"type":"string"},{"type":"number"}]},"limit":{"type":"number"},"window_seconds":{"type":"number"},"upgrade":{"type":"object","properties":{"signup_endpoint":{"type":"string"},"signup_method":{"type":"string"},"quote_endpoint":{"type":"string"},"api_key_header":{"type":"string"},"docs":{"type":"string"}}}},"required":["error"]},{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}},"substituted_fields":{"type":"array","items":{"type":"string"},"description":"Validation paths whose rejected values were substituted by server-side module settings rather than supplied by the caller."}},"required":["errors"]},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}},"required":["status","message"]}]}}}},"503":{"description":"Quote reference data unavailable","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"member_id":{"anyOf":[{"type":"string"},{"type":"number"}]},"limit":{"type":"number"},"window_seconds":{"type":"number"},"upgrade":{"type":"object","properties":{"signup_endpoint":{"type":"string"},"signup_method":{"type":"string"},"quote_endpoint":{"type":"string"},"api_key_header":{"type":"string"},"docs":{"type":"string"}}}},"required":["error"]},{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}},"substituted_fields":{"type":"array","items":{"type":"string"},"description":"Validation paths whose rejected values were substituted by server-side module settings rather than supplied by the caller."}},"required":["errors"]},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}},"required":["status","message"]}]}}}}}}},"/api/v5/locations/countries":{"get":{"tags":["locations"],"summary":"List countries","description":"Returns the static country list used by booking forms. This is the v5 surface for the old /api/locations/get_country endpoint.","responses":{"200":{"description":"Country list response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Country"}}}}}}}},"/api/v5/locations/get_country":{"get":{"tags":["locations"],"summary":"List countries legacy alias","description":"Compatibility alias for clients migrating from the old /api/locations/get_country route.","responses":{"200":{"description":"Country list response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Country"}}}}}}}},"/api/v5/locations/address-suggestions":{"get":{"tags":["locations"],"summary":"Search street-address suggestions","description":"Returns V5-native Addressr suggestions for Australian street addresses. The public booking flow uses this shared selector instead of browser-facing PHP address autocomplete.","parameters":[{"schema":{"type":"string","description":"Street-address search query."},"required":false,"description":"Street-address search query.","name":"q","in":"query"},{"schema":{"type":"string","description":"Two-letter country code. V5 currently serves native Addressr suggestions for AU."},"required":false,"description":"Two-letter country code. V5 currently serves native Addressr suggestions for AU.","name":"country","in":"query"}],"responses":{"200":{"description":"Address suggestion response","content":{"application/json":{"schema":{"type":"object","properties":{"suggestions":{"type":"array","items":{"$ref":"#/components/schemas/LocationPublicAddressSuggestion"}}},"required":["suggestions"]}}}}}}},"/api/v5/locations/address-details":{"get":{"tags":["locations"],"summary":"Resolve a street-address suggestion","description":"Resolves an Addressr place identifier into the split address fields used by the shared public/members address editor.","parameters":[{"schema":{"type":"string","minLength":1,"description":"Addressr place identifier returned by /address-suggestions."},"required":true,"description":"Addressr place identifier returned by /address-suggestions.","name":"pid","in":"query"}],"responses":{"200":{"description":"Address detail response","content":{"application/json":{"schema":{"type":"object","properties":{"fields":{"$ref":"#/components/schemas/LocationResolvedAddressFields"}},"required":["fields"]}}}},"404":{"description":"Address detail was not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error","message"]}}}}}}},"/api/v5/locations/search":{"get":{"tags":["locations"],"summary":"Search valid suburbs and postcodes","description":"Searches the V5 database copy of valid Australian suburb/postcode/state rows. This route intentionally runs in V5 instead of the old PHP location autocomplete endpoint.","parameters":[{"schema":{"type":"string","description":"Suburb or postcode prefix. Blank returns a bounded default list plus countries."},"required":false,"description":"Suburb or postcode prefix. Blank returns a bounded default list plus countries.","name":"q","in":"query"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":5000,"description":"Maximum suburb rows to return. Defaults to 1000 for blank search and 100 for prefix search.","example":100},"required":false,"description":"Maximum suburb rows to return. Defaults to 1000 for blank search and 100 for prefix search.","name":"limit","in":"query"}],"responses":{"200":{"description":"Location search response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationSearchResponse"}}}}}}},"/api/v5/locations/postcode/{postCode}":{"get":{"tags":["locations"],"summary":"List valid suburbs for a postcode","description":"Returns every valid suburb/locality for a four digit Australian postcode from the V5 database copy.","parameters":[{"schema":{"type":"string","pattern":"^\\d{4}$","example":"2000","description":"Four digit Australian postcode."},"required":true,"description":"Four digit Australian postcode.","name":"postCode","in":"path"}],"responses":{"200":{"description":"Locations by postcode response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostcodeSearchResponse"}}}}}}},"/api/v5/locations/all/":{"get":{"tags":["locations"],"summary":"Bulk suburb/postcode reference dump","description":"Returns the entire Australian suburb/postcode/state reference table for client-side (IndexedDB) caching. Edge-cached and identical for every visitor. The trailing slash is part of the route.","responses":{"200":{"description":"Full suburb reference dump","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardLocationsAllResponse"}}}}}}},"/api/v5/tracking/{reference}":{"get":{"tags":["tracking"],"summary":"Track a public shipment reference","description":"Returns normalised tracking status and event history for a booking ID, consignment number or courier tracking reference. Public — no API key required. Falls back to the legacy tracking service when native tracking finds no match; returns 404 when nothing matches and 502 when the legacy service is unavailable.","parameters":[{"schema":{"type":"string","minLength":3,"maxLength":80,"pattern":"^[A-Za-z0-9_-]+$","example":"IRE032323149","description":"Booking ID, consignment number or courier tracking reference."},"required":true,"description":"Booking ID, consignment number or courier tracking reference.","name":"reference","in":"path"}],"responses":{"200":{"description":"Normalized public tracking response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackingResponse"}}}},"404":{"description":"No booking matched the supplied reference","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackingResponse"}}}},"502":{"description":"The legacy tracking service did not return a usable response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v5/bookings/trackstatus/{reference}":{"get":{"tags":["tracking"],"summary":"Track a public shipment reference","description":"Returns normalised tracking status and event history for a booking ID, consignment number or courier tracking reference. Public — no API key required. Falls back to the legacy tracking service when native tracking finds no match; returns 404 when nothing matches and 502 when the legacy service is unavailable.","parameters":[{"schema":{"type":"string","minLength":3,"maxLength":80,"pattern":"^[A-Za-z0-9_-]+$","example":"IRE032323149","description":"Booking ID, consignment number or courier tracking reference."},"required":true,"description":"Booking ID, consignment number or courier tracking reference.","name":"reference","in":"path"}],"responses":{"200":{"description":"Normalized public tracking response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackingResponse"}}}},"404":{"description":"No booking matched the supplied reference","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackingResponse"}}}},"502":{"description":"The legacy tracking service did not return a usable response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v5/bookings/v4/trackstatus/{reference}":{"get":{"tags":["tracking"],"summary":"Track a public shipment reference","description":"Returns normalised tracking status and event history for a booking ID, consignment number or courier tracking reference. Public — no API key required. Falls back to the legacy tracking service when native tracking finds no match; returns 404 when nothing matches and 502 when the legacy service is unavailable.","parameters":[{"schema":{"type":"string","minLength":3,"maxLength":80,"pattern":"^[A-Za-z0-9_-]+$","example":"IRE032323149","description":"Booking ID, consignment number or courier tracking reference."},"required":true,"description":"Booking ID, consignment number or courier tracking reference.","name":"reference","in":"path"}],"responses":{"200":{"description":"Normalized public tracking response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackingResponse"}}}},"404":{"description":"No booking matched the supplied reference","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackingResponse"}}}},"502":{"description":"The legacy tracking service did not return a usable response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v5/bookings/sync":{"get":{"tags":["api-settings"],"summary":"Get standard API order sync settings","description":"Returns the order-sync configuration for the key: which order statuses (pending, processing, on-hold, completed, cancelled, refunded, failed) are synced and whether multi-warehouse is enabled. Requires an API key.","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Order sync settings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingSyncSettingsResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsError"}}}},"404":{"description":"API key not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsError"}}}}}}},"/api/v5/bookings/v4/api_details":{"get":{"tags":["api-settings"],"summary":"Get standard API module settings","description":"Returns the curated subset of the standard API module settings bound to the API key: titles, default parcel dimensions/weight, quote display, surcharge, order-sync flags and enabled couriers. Requires an API key.","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Standard API settings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiSettings"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsError"}}}},"404":{"description":"API key not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsError"}}}}}}},"/api/v5/bookings/v4/api_details/full":{"get":{"tags":["api-settings"],"summary":"Get the full configuration bound to an API key","description":"Unlike /api_details (a curated subset), returns the key identity, the complete module_setting blob, pickup warehouses, margin/markup rules and weight-to-package-type rules.","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Full API key configuration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiConfigResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsError"}}}},"404":{"description":"API key not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsError"}}}}}}},"/api/v5/bookings/v4/set_api_settings":{"post":{"tags":["api-settings"],"summary":"Update standard API module settings","description":"Saves the standard API module settings for the key (titles, default dimensions, sync flags, enabled couriers, pickup warehouse). When \"authtype\" is \"Email and Password\" a new API key is created and returned; otherwise the response is `true`. Requires an API key.","security":[{"ApiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"authtype":{"type":"string","nullable":true,"description":"Authentication type for the integration."},"requesting_site":{"type":"string","nullable":true,"description":"Domain of the site making requests with this key."},"trans_title":{"type":"string","nullable":true,"description":"Label shown to buyers for the shipping method."},"address_type":{"type":"string","nullable":true,"description":"Default sender address type, \"business\" or \"residential\"."},"height":{"type":"string","nullable":true,"description":"Default parcel height in cm."},"width":{"type":"string","nullable":true,"description":"Default parcel width in cm."},"length":{"type":"string","nullable":true,"description":"Default parcel length in cm."},"weight":{"type":"string","nullable":true,"description":"Default parcel weight in kg."},"enable_order":{"type":"string","nullable":true,"description":"Whether order syncing is enabled."},"order_date":{"type":"string","nullable":true,"description":"Earliest order date (YYYY-MM-DD) to import when syncing."},"quotes":{"type":"string","nullable":true,"description":"How many quotes to display, or the quote-display mode."},"surcharge_price":{"type":"string","nullable":true,"description":"Flat surcharge added to quoted prices, in AUD."},"unit":{"type":"string","nullable":true,"description":"Measurement unit system, e.g. metric."},"enabled_group_box":{"type":"string","nullable":true,"description":"Whether the grouped-box packing option is enabled."},"box_size":{"type":"string","nullable":true,"description":"Default box size preset used for grouped packing."},"postcode":{"type":"array","items":{"type":"string","nullable":true},"description":"Pickup postcodes (4-digit AU) configured for this key."},"postcode_type":{"type":"array","items":{"type":"array","items":{"type":"string","nullable":true}},"description":"Per-postcode address type entries, paired with the postcode list."},"order_status":{"anyOf":[{"type":"array","items":{"type":"string","nullable":true}},{"type":"string","nullable":true},{"nullable":true}],"description":"Order status(es) to sync; single value or array."}},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}]}}]}}]}}}}},"responses":{"200":{"description":"Settings saved, or a new API key when email/password auth creates one","content":{"application/json":{"schema":{"anyOf":[{"type":"boolean","enum":[true]},{"type":"object","properties":{"API-Key":{"type":"string"}},"required":["API-Key"]}]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsError"}}}},"404":{"description":"API key not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsError"}}}}}}},"/api/v5/bookings/v4/test_api_key_settings":{"post":{"tags":["api-settings"],"summary":"Test standard API key settings","description":"Intentionally does not require active API-key middleware so inactive keys can be inspected like PHP.","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"API key row, or plain text \"API is invalid\" when the key is missing or unknown","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyTestResponse"}},"text/plain":{"schema":{"type":"string"}}}}}}},"/api/v5/bookings/{id}/items":{"get":{"tags":["booking-items"],"summary":"List booking items","description":"Returns every item line (parcel) on the booking, with description, weight (kg), dimensions (cm) and quantity. Requires a valid API key and ownership of the booking. Returns 404 when the booking has no items.","responses":{"200":{"description":"Booking items","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BookingItem"}}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking or items not found"}}},"post":{"tags":["booking-items"],"summary":"Create a booking item","description":"Adds an item line (description, weight in kg, length/width/height in cm, quantity) to the booking and recalculates the booking total weight. Requires an API key and booking ownership. Not permitted on Multipick bookings.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItemInput"}}}},"responses":{"201":{"description":"Created booking item","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItem"}}}},"400":{"description":"Invalid item mutation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItemError"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}}},"/api/v5/bookings/{id}/items/{item_id}":{"get":{"tags":["booking-items"],"summary":"Get a booking item","description":"Returns a single item line on the booking by its numeric ID. Requires an API key and ownership of the parent booking.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"123"},"required":true,"name":"item_id","in":"path","description":"Numeric ID of the item line within the booking."}],"responses":{"200":{"description":"Booking item","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItem"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Item not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItemError"}}}}}},"put":{"tags":["booking-items"],"summary":"Update a booking item","description":"Updates the given item line (description, weight in kg, dimensions in cm, quantity); omitted fields keep their existing value. Recalculates the booking total weight. Requires an API key and booking ownership. Not permitted on Multipick bookings.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"123"},"required":true,"name":"item_id","in":"path","description":"Numeric ID of the item line within the booking."}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"description":{"type":"string","nullable":true,"minLength":1,"description":"Package type or contents description (e.g. \"Carton\")."},"weight":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Item weight in kg."},"length":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Item length in cm."},"width":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Item width in cm."},"height":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Item height in cm."},"quantity":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Number of identical items of these dimensions."},"id":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Existing booking item id to update; omit to add a new item."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Booking item","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItem"}}}},"400":{"description":"Invalid item mutation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItemError"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Item not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItemError"}}}}}},"delete":{"tags":["booking-items"],"summary":"Delete a booking item","description":"Removes an item line from the booking and recalculates the booking total weight. Requires an API key and booking ownership. Not permitted on Multipick bookings. Returns 204 on success.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"123"},"required":true,"name":"item_id","in":"path","description":"Numeric ID of the item line within the booking."}],"responses":{"204":{"description":"Booking item deleted"},"400":{"description":"Invalid item mutation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItemError"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Item not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItemError"}}}}}}},"/api/v5/bookings/v4/{id}/items":{"get":{"tags":["booking-items"],"summary":"List booking items","description":"Returns every item line (parcel) on the booking, with description, weight (kg), dimensions (cm) and quantity. Requires a valid API key and ownership of the booking. Returns 404 when the booking has no items.","responses":{"200":{"description":"Booking items","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BookingItem"}}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking or items not found"}}},"post":{"tags":["booking-items"],"summary":"Create a booking item","description":"Adds an item line (description, weight in kg, length/width/height in cm, quantity) to the booking and recalculates the booking total weight. Requires an API key and booking ownership. Not permitted on Multipick bookings.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItemInput"}}}},"responses":{"201":{"description":"Created booking item","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItem"}}}},"400":{"description":"Invalid item mutation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItemError"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}}},"/api/v5/bookings/v4/{id}/items/{item_id}":{"get":{"tags":["booking-items"],"summary":"Get a booking item","description":"Returns a single item line on the booking by its numeric ID. Requires an API key and ownership of the parent booking.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"123"},"required":true,"name":"item_id","in":"path","description":"Numeric ID of the item line within the booking."}],"responses":{"200":{"description":"Booking item","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItem"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Item not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItemError"}}}}}},"put":{"tags":["booking-items"],"summary":"Update a booking item","description":"Updates the given item line (description, weight in kg, dimensions in cm, quantity); omitted fields keep their existing value. Recalculates the booking total weight. Requires an API key and booking ownership. Not permitted on Multipick bookings.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"123"},"required":true,"name":"item_id","in":"path","description":"Numeric ID of the item line within the booking."}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"description":{"type":"string","nullable":true,"minLength":1,"description":"Package type or contents description (e.g. \"Carton\")."},"weight":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Item weight in kg."},"length":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Item length in cm."},"width":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Item width in cm."},"height":{"type":"number","minimum":0,"exclusiveMinimum":true,"description":"Item height in cm."},"quantity":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Number of identical items of these dimensions."},"id":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Existing booking item id to update; omit to add a new item."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Booking item","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItem"}}}},"400":{"description":"Invalid item mutation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItemError"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Item not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItemError"}}}}}},"delete":{"tags":["booking-items"],"summary":"Delete a booking item","description":"Removes an item line from the booking and recalculates the booking total weight. Requires an API key and booking ownership. Not permitted on Multipick bookings. Returns 204 on success.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"123"},"required":true,"name":"item_id","in":"path","description":"Numeric ID of the item line within the booking."}],"responses":{"204":{"description":"Booking item deleted"},"400":{"description":"Invalid item mutation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItemError"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Item not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingItemError"}}}}}}},"/api/v5/bookings/v4":{"get":{"tags":["bookings"],"summary":"List bookings through the legacy v4 alias","description":"Legacy \"/v4\" alias of GET /; lists the member's bookings and quotes and behaves identically, including conditional-request (304) support. Requires an API key.","parameters":[{"schema":{"type":"string","description":"Only return bookings created at or after this time (ISO 8601 datetime)."},"required":false,"description":"Only return bookings created at or after this time (ISO 8601 datetime).","name":"since","in":"query"},{"schema":{"type":"string","description":"Column to sort by (e.g. booking_time, paid_date, status, cost, courier); prefix with \"-\" for descending. Defaults to newest first (booking_time descending)."},"required":false,"description":"Column to sort by (e.g. booking_time, paid_date, status, cost, courier); prefix with \"-\" for descending. Defaults to newest first (booking_time descending).","name":"sort","in":"query"}],"responses":{"200":{"description":"Booking list","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Booking"}}}}},"304":{"description":"Booking list cache validator still current"},"400":{"description":"Invalid booking list query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointError"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"No bookings found"}}},"post":{"tags":["bookings"],"summary":"Create a booking quote through the legacy v4 alias","description":"Requests live courier rates and creates a draft booking quote through the legacy \"/v4\" alias, equivalent to the standard quote endpoint. Requires an API key. Returns 201 with the quote response.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"sender":{"type":"object","properties":{"address":{"nullable":true},"address2":{"nullable":true},"company_name":{"nullable":true},"email":{"nullable":true},"name":{"nullable":true},"phone":{"nullable":true},"postcode":{"nullable":true},"suburb":{"nullable":true},"state":{"nullable":true},"country":{"nullable":true},"type":{"nullable":true},"residential":{"type":"boolean","nullable":true},"tailgate":{"type":"boolean","nullable":true,"default":false}}},"receiver":{"type":"object","properties":{"address":{"nullable":true},"address2":{"nullable":true},"company_name":{"nullable":true},"email":{"nullable":true},"name":{"nullable":true},"phone":{"nullable":true},"postcode":{"nullable":true},"suburb":{"nullable":true},"state":{"nullable":true},"country":{"nullable":true},"type":{"nullable":true},"residential":{"type":"boolean","nullable":true},"tailgate":{"type":"boolean","nullable":true,"default":false}}},"items":{"type":"array","nullable":true,"items":{"type":"object","nullable":true,"properties":{"length":{"nullable":true},"width":{"nullable":true},"height":{"nullable":true},"weight":{"nullable":true},"quantity":{"nullable":true},"description":{"nullable":true},"sku":{"nullable":true}}}},"declared_value":{"nullable":true},"insured_value":{"nullable":true},"include_warranty":{"type":"boolean","nullable":true},"whole_weight":{"type":"boolean","nullable":true},"cost":{"nullable":true},"description":{"nullable":true},"instructions":{"type":"object","nullable":true,"properties":{"delivery":{"nullable":true},"pickup":{"nullable":true}}},"referrer":{"nullable":true},"requesting_site":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}]},"timeout":{"nullable":true},"tailgate_pickup":{"type":"boolean","nullable":true},"tailgate_delivery":{"type":"boolean","nullable":true},"pickup_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"options":{"type":"object","properties":{"tailgate_pickup":{"type":"boolean","nullable":true},"tailgate_delivery":{"type":"boolean","nullable":true},"insurance_value":{"type":"number","nullable":true,"minimum":0},"authority_to_leave":{"type":"boolean","nullable":true},"disable_cache":{"type":"boolean","nullable":true},"multipickup":{"type":"object","properties":{"address_id":{"type":"integer","minimum":0,"exclusiveMinimum":true},"tier":{"type":"integer","minimum":1,"maximum":2}}}},"default":{}}},"required":["sender","receiver"]}}}},"responses":{"201":{"description":"Created booking quote response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"number","nullable":true},"booking_access_token":{"type":"string"},"booked_at":{"type":"string"},"booked_by":{"type":"string","nullable":true},"created_at":{"type":"string"},"declared_value":{"type":"number"},"insured_value":{"type":"number"},"description":{"type":"string","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"description":{"type":"string"},"weight":{"type":"number"},"length":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"},"quantity":{"type":"number"},"sku":{"nullable":true}},"required":["id","description","weight","length","width","height","quantity"]}},"label":{"type":"string"},"notifications":{"type":"object","properties":{"email":{"type":"boolean"},"sms":{"type":"boolean"}},"required":["email","sms"]},"quotes":{"type":"object","additionalProperties":{"type":"object","properties":{"total":{"type":"number"},"price_insurance_ex":{"type":"number"},"fee":{"type":"number"},"applied_gst":{"type":"number"},"insured_amount":{"type":"number"},"service":{"type":"string"},"transit_time":{"type":"string"},"transit":{"type":"object","properties":{"text":{"type":"string"},"type":{"type":"string","enum":["business_days","hours","same_day","overnight","date_time","unknown"]},"min_days":{"type":"number"},"max_days":{"type":"number"},"min_hours":{"type":"number"},"max_hours":{"type":"number"},"estimated_delivery_at":{"type":"string"}},"required":["text","type"]},"pickup_dates":{"type":"array","items":{"type":"string"}},"pickup_time":{"anyOf":[{"type":"string"},{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]}]},"pickupAvailability":{"type":"object","properties":{"dates":{"type":"array","items":{"type":"string"}},"dateLabels":{"type":"array","items":{"type":"string"}},"times":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]}},"earliest":{"type":"object","properties":{"day":{"type":"string"},"date":{"type":"string"},"time":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]},"times":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]}},"readyFromTimes":{"type":"array","items":{"type":"string"}},"lastAvailableTimes":{"type":"array","items":{"type":"string"}}},"required":["day","date","time"]},"pickupWindow":{"type":"object","properties":{"operatingStart":{"type":"string"},"operatingEnd":{"type":"string"},"displayStart":{"type":"string"},"displayEnd":{"type":"string"},"sameDayCutoff":{"type":"string"},"minWindowMinutes":{"type":"number"},"incrementMinutes":{"type":"number"},"fixed":{"type":"boolean"},"currentTimeInPickupTz":{"type":"string"},"senderUtcOffsetMinutes":{"type":"number","description":"The sender timezone's UTC offset in minutes when the quote was built."},"sameDayCutoffAtMs":{"type":"number","description":"Epoch ms at which today stops being an offered pickup date. Absent when there is none to expire."}},"required":["operatingStart","operatingEnd","displayStart","displayEnd","sameDayCutoff","minWindowMinutes","incrementMinutes","fixed"]},"readyFromTimes":{"type":"array","items":{"type":"string"}},"lastAvailableTimes":{"type":"array","items":{"type":"string"}},"todayReadyFromTimes":{"type":"array","items":{"type":"string"}},"fixedPickupTime":{"type":"boolean","enum":[true]}},"required":["dates","times"]},"pickup_cutoff":{"type":"string","nullable":true},"pickup_window":{"type":"object","properties":{"operatingStart":{"type":"string"},"operatingEnd":{"type":"string"},"displayStart":{"type":"string"},"displayEnd":{"type":"string"},"sameDayCutoff":{"type":"string"},"minWindowMinutes":{"type":"number"},"incrementMinutes":{"type":"number"},"fixed":{"type":"boolean"},"currentTimeInPickupTz":{"type":"string"},"senderUtcOffsetMinutes":{"type":"number","description":"The sender timezone's UTC offset in minutes when the quote was built."},"sameDayCutoffAtMs":{"type":"number","description":"Epoch ms at which today stops being an offered pickup date. Absent when there is none to expire."}},"required":["operatingStart","operatingEnd","displayStart","displayEnd","sameDayCutoff","minWindowMinutes","incrementMinutes","fixed"],"description":"Pickup-window rules driving the ready-from / last-available time picker."},"pickup_ready_from_times":{"type":"array","items":{"type":"string"},"description":"Selectable \"ready from\" pickup times (HH:mm), capped before the collection cutoff. The FULL business-day list — same-day narrowing is applied client-side per selected date via pickup_same_day_ready_from."},"pickup_last_available_times":{"type":"array","items":{"type":"string"},"description":"Selectable \"last available\" pickup times (HH:mm) at the uncapped business close."},"pickup_same_day_ready_from":{"type":"string","nullable":true,"description":"Earliest \"ready from\" time (HH:mm) selectable when the pickup date is today; the picker floors same-day pickups to this. Absent (or null) when today is not an offered pickup date."},"rate_card_code":{"type":"string","description":"Internal rate-card code used to price this quote."},"free_shipping":{"type":"boolean","enum":[true]},"courier":{"type":"string"},"surcharge":{"type":"number"},"tiers":{"type":"array","items":{"type":"object","properties":{"identifier":{"type":"number"},"description":{"type":"string"},"total":{"type":"number"},"price_insurance_ex":{"type":"number"},"fee":{"type":"number"},"applied_gst":{"type":"number"},"insured_amount":{"type":"number"}},"required":["identifier","description","total","price_insurance_ex","fee","applied_gst","insured_amount"]},"description":"Available insurance/service tiers for this quote."}},"required":["total","price_insurance_ex","fee","applied_gst","insured_amount","service","transit_time","transit","pickup_dates","pickup_time","pickupAvailability","rate_card_code"]},"description":"Map of carrier/service key to the quote returned for it."},"quote_errors":{"type":"array","items":{"type":"object","properties":{"courier":{"type":"string"},"code":{"type":"string"},"serviceability":{"type":"string"},"message":{"type":"string","default":""},"retryable":{"type":"boolean","default":false}},"required":["courier","code"]},"description":"Per-carrier errors for carriers that could not be quoted."},"receiver":{"type":"object","properties":{"id":{"type":"number"},"address":{"type":"string"},"address2":{"type":"string"},"company_name":{"type":"string"},"email":{"type":"string","nullable":true},"name":{"type":"string"},"postcode":{"type":"string"},"phone":{"type":"string"},"state":{"type":"string"},"suburb":{"type":"string"},"type":{"type":"string","enum":["business","residential"]},"country":{"type":"string"}},"required":["id","address","company_name","email","name","postcode","phone","state","suburb","type","country"],"description":"Delivery (destination) address on the quote."},"sender":{"type":"object","properties":{"id":{"type":"number"},"address":{"type":"string"},"address2":{"type":"string"},"company_name":{"type":"string"},"email":{"type":"string","nullable":true},"name":{"type":"string"},"postcode":{"type":"string"},"phone":{"type":"string"},"state":{"type":"string"},"suburb":{"type":"string"},"type":{"type":"string","enum":["business","residential"]},"country":{"type":"string"}},"required":["id","address","company_name","email","name","postcode","phone","state","suburb","type","country"],"description":"Pickup (origin) address on the quote."},"pickup_window":{"type":"array","items":{"type":"string"},"description":"Selected pickup window as a pair of time strings [from, to]."},"connote":{"type":"string","nullable":true,"description":"Carrier consignment (connote) number, once lodged, or null."},"charged_weight":{"type":"number","description":"Weight the carrier charged on, in kilograms (kg)."},"scanned_weight":{"type":"number","description":"Weight scanned by the carrier, in kilograms (kg)."},"special_instructions":{"type":"string","description":"Special handling instructions for the consignment."},"status":{"type":"string","description":"Booking status, e.g. \"new\"/\"pending_payment\" (quote) or a paid/confirmed state."},"cost":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/components/schemas/ApiJsonValue"}},{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}}],"description":"Selected quote cost breakdown, when present."},"updated_at":{"type":"string","description":"Timestamp the quote/booking was last updated, as an ISO 8601 datetime."},"pickup_instructions":{"type":"string","nullable":true,"description":"Instructions for the driver at pickup, or null."},"tailgate_pickup":{"type":"boolean","description":"Whether a tailgate vehicle was requested at pickup."},"tailgate_delivery":{"type":"boolean","description":"Whether a tailgate vehicle was requested at delivery."},"pendingVisualChecks":{"type":"array","items":{"type":"object","properties":{"bookingCheckId":{"type":"integer"},"checkId":{"type":"integer"},"checkName":{"type":"string"},"checkDescription":{"type":"string","default":""},"formJson":{"type":"string","nullable":true},"timing":{"type":"string","nullable":true},"status":{"type":"string"},"createdAt":{"type":"string","nullable":true},"blocksStep":{"type":"boolean"}},"required":["bookingCheckId","checkId","checkName","status"]}},"service_notices":{"type":"array","items":{"type":"object","properties":{"courier":{"type":"string"},"kind":{"type":"string"},"message":{"type":"string"}},"required":["courier","kind","message"]},"description":"Informational, non-bookable carrier notices (e.g. a carrier whose quote API is temporarily down), shown as their own rows in the quote list."},"meta":{"type":"object","properties":{"api_version":{"type":"string","enum":["v5"]},"cache":{"type":"object","properties":{"status":{"type":"string","enum":["HIT","MISS","BYPASS"]},"original_duration_ms":{"type":"number"},"served_duration_ms":{"type":"number"}},"required":["status"]},"timing":{"type":"object","properties":{"duration_ms":{"type":"number"},"boxing_duration_ms":{"type":"number"},"carrier_timings_ms":{"type":"object","additionalProperties":{"type":"number"}}}},"anonymous":{"type":"boolean"},"quote_count":{"type":"number"},"warnings":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"input":{"type":"object","properties":{"postcode":{"type":"string"},"suburb":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"priority":{"type":"number","nullable":true}}},"inferred":{"type":"object","properties":{"postcode":{"type":"string"},"suburb":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"priority":{"type":"number","nullable":true}}},"suggestions":{"type":"array","items":{"type":"object","properties":{"postcode":{"type":"string"},"suburb":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"priority":{"type":"number","nullable":true}}}}},"required":["code","path","message"]}},"persistence":{"type":"object","properties":{"booking_write_mode":{"type":"string","enum":["disabled","enabled"]},"status":{"type":"string","enum":["disabled","written","failed"]},"via":{"type":"string","enum":["hyperdrive","remote-v5","php"]},"book_origin":{"type":"string"}},"required":["booking_write_mode","status"]},"parity":{"type":"object","properties":{"mode":{"type":"string","enum":["disabled","enabled"]},"status":{"type":"string","enum":["skipped","queued"]}},"required":["mode","status"]},"admin":{"type":"object","properties":{"calculations":{"type":"object","additionalProperties":{"type":"object","properties":{"courier":{"type":"string"},"pipeline":{"type":"string","enum":["default","family"]},"error":{"$ref":"#/components/schemas/ApiJsonValue"},"gstAlreadyIncluded":{"type":"boolean"},"fuelLevy":{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["static"]},"pct":{"type":"number"}},"required":["kind","pct"]},{"type":"object","properties":{"kind":{"type":"string","enum":["monthly-fetch"]},"surchargeKey":{"type":"string"}},"required":["kind","surchargeKey"]},{"type":"object","properties":{"kind":{"type":"string","enum":["in-response"]}},"required":["kind"]}]},"marginMultiplier":{"type":"number"},"memberDiscount":{"type":"number"},"courierRaw":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}]}},{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}]}}]},"carbonOffsetBase":{"type":"number"},"trace":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"atMs":{"type":"number"},"courier":{"type":"string"},"label":{"type":"string"},"cache":{"$ref":"#/components/schemas/ApiJsonValue"},"payload":{"$ref":"#/components/schemas/ApiJsonValue"}},"required":["kind","atMs","label"]}},"steps":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"before":{"type":"number"},"after":{"type":"number"},"delta":{"type":"number"},"rounding":{"type":"object","properties":{"preRound":{"type":"number"},"postRound":{"type":"number"},"precision":{"type":"integer","minimum":0}},"required":["preRound","postRound","precision"]}},"required":["key","label","after"]}}},"required":["courier","pipeline","fuelLevy","marginMultiplier","steps"]}},"upstreamErrors":{"type":"object","additionalProperties":{"type":"object","properties":{"kind":{"type":"string","enum":["upstream_status"]},"status":{"type":"number"},"reason":{"type":"string"},"body":{"type":"string"}},"required":["kind","status","reason"]}}}}},"required":["api_version","cache","timing"]}},"required":["id","booked_at","booked_by","created_at","declared_value","insured_value","description","items","label","notifications","quotes","quote_errors","receiver","sender","pickup_window","connote","charged_weight","scanned_weight","special_instructions","status","updated_at","pickup_instructions","tailgate_pickup","tailgate_delivery"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointError"}}}},"401":{"description":"Missing or invalid API key"}}}},"/api/v5/bookings/{id}/sender":{"get":{"tags":["bookings"],"summary":"Get booking sender details","description":"Returns the sender (pickup) address for a booking owned by the authenticated member. Requires an API key. Returns 400 when the booking has no sender address.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"responses":{"200":{"description":"Booking sender","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingSenderResponse"}}}},"400":{"description":"Sender address missing"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}}},"/api/v5/bookings/v4/{id}/sender":{"get":{"tags":["bookings"],"summary":"Get booking sender details through the legacy v4 alias","description":"Legacy \"/v4\" alias for the booking sender (pickup) address; behaves identically. Requires an API key. Returns 400 when the booking has no sender address.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"responses":{"200":{"description":"Booking sender","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingSenderResponse"}}}},"400":{"description":"Sender address missing"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}}},"/api/v5/bookings/{id}/receiver":{"get":{"tags":["bookings"],"summary":"Get booking receiver details","description":"Returns the receiver (delivery) address for a booking owned by the authenticated member. Requires an API key. Returns 400 when the booking has no receiver address.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"responses":{"200":{"description":"Booking receiver","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingReceiverResponse"}}}},"400":{"description":"Receiver address missing"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}}},"/api/v5/bookings/v4/{id}/receiver":{"get":{"tags":["bookings"],"summary":"Get booking receiver details through the legacy v4 alias","description":"Legacy \"/v4\" alias for the booking receiver (delivery) address; behaves identically. Requires an API key. Returns 400 when the booking has no receiver address.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"responses":{"200":{"description":"Booking receiver","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingReceiverResponse"}}}},"400":{"description":"Receiver address missing"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}}},"/api/v5/bookings/{id}/custom_declaration":{"get":{"tags":["custom-declarations"],"summary":"Get a booking custom declaration PDF","description":"Returns the international customs declaration for the booking as an inline PDF. Requires an API key and ownership of the booking.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"responses":{"200":{"description":"Binary custom declaration PDF response"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}},"post":{"tags":["custom-declarations"],"summary":"Create or update a booking custom declaration","description":"Creates or updates the customs declaration for an international booking (sending party details and per-item invoice lines). Requires an API key and booking ownership. Only valid for international couriers that require customs.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CustomsDeclaration"},{"type":"object","properties":{"custom_declaration":{"$ref":"#/components/schemas/CustomsDeclaration"}},"required":["custom_declaration"]}]}}}},"responses":{"200":{"description":"Custom declaration saved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomsDeclarationResponse"}}}},"400":{"description":"Invalid or unsupported custom declaration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomsDeclarationError"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}}},"/api/v5/bookings/v4/{id}/custom_declaration":{"get":{"tags":["custom-declarations"],"summary":"Get a booking custom declaration PDF through the legacy v4 alias","description":"Legacy \"/v4\" alias that returns the booking's international customs declaration as an inline PDF. Requires an API key and booking ownership.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"responses":{"200":{"description":"Binary custom declaration PDF response"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}},"post":{"tags":["custom-declarations"],"summary":"Create or update a booking custom declaration through the legacy v4 alias","description":"Legacy \"/v4\" alias that creates or updates an international booking's customs declaration. Requires an API key and booking ownership. Only valid for international couriers that require customs.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CustomsDeclaration"},{"type":"object","properties":{"custom_declaration":{"$ref":"#/components/schemas/CustomsDeclaration"}},"required":["custom_declaration"]}]}}}},"responses":{"200":{"description":"Custom declaration saved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomsDeclarationResponse"}}}},"400":{"description":"Invalid or unsupported custom declaration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomsDeclarationError"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}}},"/api/v5/bookings/{id}/confirm":{"post":{"tags":["bookings"],"summary":"Confirm a booking","description":"Confirms and pays for a booking, lodging it with the selected courier. Requires an API key and booking ownership. A payment-aware retry on an already-paid booking returns 204; returns 402 when payment is declined or fails.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingConfirmRequest"}}}},"responses":{"204":{"description":"Booking confirmed, or already-paid payment-aware confirmation retry accepted"},"400":{"description":"Invalid booking confirmation request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingConfirmPaymentError"}}}},"401":{"description":"Missing or invalid API key"},"402":{"description":"Payment declined or failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingConfirmPaymentError"}}}},"404":{"description":"Booking not found"},"500":{"description":"Unexpected confirmation failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingConfirmPaymentError"}}}}}}},"/api/v5/bookings/v4/{id}/confirm":{"post":{"tags":["bookings"],"summary":"Confirm a booking through the legacy v4 alias","description":"Legacy \"/v4\" alias that confirms and pays for a booking, lodging it with the selected courier. Requires an API key and booking ownership. A payment-aware retry on an already-paid booking returns 204; returns 402 when payment is declined.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingConfirmRequest"}}}},"responses":{"204":{"description":"Booking confirmed, or already-paid payment-aware confirmation retry accepted"},"400":{"description":"Invalid booking confirmation request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingConfirmPaymentError"}}}},"401":{"description":"Missing or invalid API key"},"402":{"description":"Payment declined or failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingConfirmPaymentError"}}}},"404":{"description":"Booking not found"},"500":{"description":"Unexpected confirmation failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingConfirmPaymentError"}}}}}}},"/api/v5/bookings/{id}/label":{"get":{"tags":["booking-pdf"],"summary":"Get a booking label PDF","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Binary label PDF response"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"},"409":{"description":"Label not ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDocumentError"}}}}}},"head":{"tags":["booking-pdf"],"summary":"Check whether a booking label PDF is ready","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Document is ready"},"400":{"description":"Label is not ready"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}},"description":"HEAD is handled by Hono via the corresponding GET route and returns the same readiness status without a response body."}},"/api/v5/bookings/v4/{id}/label":{"get":{"tags":["booking-pdf"],"summary":"Get a booking label PDF through the legacy v4 alias","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Binary label PDF response"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"},"409":{"description":"Label not ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDocumentError"}}}}}},"head":{"tags":["booking-pdf"],"summary":"Check whether a booking label PDF is ready through the legacy v4 alias","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Document is ready"},"400":{"description":"Label is not ready"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}},"description":"HEAD is handled by Hono via the corresponding GET route and returns the same readiness status without a response body."}},"/api/v5/bookings/{id}/a6label":{"get":{"tags":["booking-pdf"],"summary":"Get a booking A6 label PDF","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Binary A6 label PDF response"},"400":{"description":"Label not ready for HEAD readiness checks"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"},"409":{"description":"Label not ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDocumentError"}}}}}},"head":{"tags":["booking-pdf"],"summary":"Check whether a booking A6 label PDF is ready","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Document is ready"},"400":{"description":"A6 label is not ready"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}},"description":"HEAD is handled by Hono via the corresponding GET route and returns the same readiness status without a response body."}},"/api/v5/bookings/v4/{id}/a6label":{"get":{"tags":["booking-pdf"],"summary":"Get a booking A6 label PDF through the legacy v4 alias","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Binary A6 label PDF response"},"400":{"description":"Label not ready for HEAD readiness checks"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"},"409":{"description":"Label not ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDocumentError"}}}}}},"head":{"tags":["booking-pdf"],"summary":"Check whether a booking A6 label PDF is ready through the legacy v4 alias","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Document is ready"},"400":{"description":"A6 label is not ready"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}},"description":"HEAD is handled by Hono via the corresponding GET route and returns the same readiness status without a response body."}},"/api/v5/bookings/{id}/manifest":{"get":{"tags":["booking-pdf"],"summary":"Get a booking manifest PDF","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Binary manifest PDF response"},"400":{"description":"Manifest not ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDocumentError"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}}},"/api/v5/bookings/v4/{id}/manifest":{"get":{"tags":["booking-pdf"],"summary":"Get a booking manifest PDF through the legacy v4 alias","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Binary manifest PDF response"},"400":{"description":"Manifest not ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDocumentError"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}}},"/api/v5/bookings/{id}/tntregeneralabel":{"get":{"tags":["booking-pdf"],"summary":"Regenerate the TNT booking PDF label","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Binary document response"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}}},"/api/v5/bookings/v4/{id}/tntregeneralabel":{"get":{"tags":["booking-pdf"],"summary":"Regenerate the TNT booking PDF label through the legacy v4 alias","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Binary document response"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}}},"/api/v5/bookings/{id}/tgeregeneralabel":{"get":{"tags":["booking-pdf"],"summary":"Regenerate the Team Global Express booking PDF label","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Binary document response"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}}},"/api/v5/bookings/{id}/northlineregeneralabel":{"get":{"tags":["booking-pdf"],"summary":"Regenerate the Northline booking PDF label","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Binary document response"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}}},"/api/v5/bookings/{id}/invoice":{"get":{"tags":["booking-pdf"],"summary":"Get a booking invoice PDF","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Binary invoice PDF response"},"302":{"description":"Redirect to a V5-owned invoice URL"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"},"409":{"description":"Invoice not ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDocumentError"}}}}}}},"/api/v5/bookings/v4/{id}/invoice":{"get":{"tags":["booking-pdf"],"summary":"Get a booking invoice PDF through the legacy v4 alias","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Binary invoice PDF response"},"302":{"description":"Redirect to a V5-owned invoice URL"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"},"409":{"description":"Invoice not ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDocumentError"}}}}}}},"/api/v5/bookings/{id}/public_url":{"get":{"tags":["booking-pdf"],"summary":"Generate a signed public label URL","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Signed public label URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUrlResponse"}}}},"400":{"description":"Label not ready or collection-point state incomplete","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDocumentError"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}}},"/api/v5/bookings/v4/{id}/public_url":{"get":{"tags":["booking-pdf"],"summary":"Generate a signed public label URL through the legacy v4 alias","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Signed public label URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUrlResponse"}}}},"400":{"description":"Label not ready or collection-point state incomplete","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDocumentError"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}}},"/api/v5/bookings/labels/batch":{"post":{"tags":["booking-pdf"],"summary":"Generate a batch label PDF","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDocumentRequest"}}}},"responses":{"200":{"description":"Binary batch label PDF response"},"400":{"description":"No labels are ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDocumentError"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"One or more bookings do not belong to the caller","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDocumentError"}}}},"404":{"description":"No bookings found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDocumentError"}}}}}}},"/api/v5/bookings/manifests/batch":{"post":{"tags":["booking-pdf"],"summary":"Generate a batch manifest PDF","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"integer","minimum":0,"exclusiveMinimum":true},"minItems":1,"maxItems":50,"description":"Booking ids to include in the batch document (1-50)."}},"required":["ids"]}}}},"responses":{"200":{"description":"Binary batch manifest PDF response"},"400":{"description":"No manifests are ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDocumentError"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"One or more bookings do not belong to the caller","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDocumentError"}}}},"404":{"description":"No bookings found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingDocumentError"}}}}}}},"/api/v5/bookings/{id}/context":{"get":{"tags":["bookings"],"summary":"Get booking context","description":"Returns the full booking payload plus the member's recent paid-booking count, used to drive booking UI and eligibility checks. Requires an API key and booking ownership.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"responses":{"200":{"description":"Booking context with recent paid booking count","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"number","description":"Booking identifier."},"booked_at":{"type":"string","description":"ISO 8601 timestamp the booking was confirmed."},"booked_by":{"type":"string","nullable":true,"description":"Name of the user who confirmed the booking, if known."},"created_at":{"type":"string","description":"ISO 8601 timestamp the booking (or quote) was created."},"declared_value":{"type":"number","description":"Declared value of the goods in AUD."},"insured_value":{"type":"number","description":"Insured (transit cover) value in AUD."},"description":{"type":"string","nullable":true,"description":"Short booking description."},"items":{"type":"array","items":{"$ref":"#/components/schemas/BookingItem"},"description":"Items included in the booking."},"label":{"type":"string","description":"Shipping label reference or URL for the booking."},"notifications":{"type":"object","properties":{"email":{"type":"boolean","enum":[false],"description":"Email notifications flag (always false on this endpoint)."},"sms":{"type":"boolean","enum":[false],"description":"SMS notifications flag (always false on this endpoint)."}},"required":["email","sms"],"additionalProperties":false,"description":"Notification preferences for the booking."},"quote_errors":{"type":"array","items":{"type":"object","properties":{"courier":{"type":"string","description":"Courier string_id that failed to quote."},"code":{"type":"string","description":"Error code for the quote failure."},"serviceability":{"type":"string","description":"Canonical cross-courier serviceability code — see SERVICEABILITY_CODES."},"retryable":{"type":"boolean","description":"Whether the failure is transient and worth retrying."}},"required":["courier","code"],"additionalProperties":false},"description":"Per-courier errors encountered while quoting."},"status":{"type":"string","nullable":true,"description":"Booking status as a human label, not the stored machine code: v5 maps codes through a fixed lookup table, e.g. \"paid\" -> \"Paid\", \"pending_payment\" -> \"Pending Payment\", \"sending_to_courier\" -> \"Sending to Courier\", \"on_hold\" -> \"On hold\", \"cancelled_refund\" -> \"Cancel Refund\". The mapping is not title-casing and is not reversible - both \"pending_review\" and \"on_hold_suspicious\" return \"Pending Review\" - and a code with no label (\"from_on_hold\") is passed through unchanged. Note \"new\": this response returns \"New\", but POST /api/bookings/v4 returns the raw \"new\" on create. Match case-insensitively, or accept both forms."},"is_paid":{"type":"boolean","description":"Whether the booking has been paid."},"cost":{"anyOf":[{"type":"number"},{"type":"string"},{"nullable":true}],"description":"Total booking cost in AUD."},"additional_charges":{"type":"number","description":"Extra charges applied on top of the base cost, in AUD."},"courier":{"type":"string","nullable":true,"description":"Courier string_id selected for the booking."},"order":{"type":"object","properties":{"order_id":{"type":"number","description":"Transdirect order identifier linked to this booking."},"order_number":{"type":"string","nullable":true,"description":"External order number from the source platform."}},"required":["order_id","order_number"],"additionalProperties":false,"description":"Linked e-commerce order, if the booking came from one."},"receiver":{"anyOf":[{"$ref":"#/components/schemas/BookingAddress"},{"type":"string","enum":[""]}],"description":"Receiver (delivery) address, or \"\" if not yet set."},"sender":{"anyOf":[{"$ref":"#/components/schemas/BookingAddress"},{"type":"string","enum":[""]}],"description":"Sender (pickup) address, or \"\" if not yet set."},"pickup_window":{"type":"array","items":{"type":"string"},"description":"Confirmed pickup window as [start, end] time strings."},"connote":{"type":"string","nullable":true,"description":"Carrier consignment note / tracking number, once lodged."},"charged_weight":{"type":"number","description":"Weight the carrier charged on, in kg (may be volumetric)."},"scanned_weight":{"type":"number","description":"Actual weight scanned by the carrier, in kg."},"special_instructions":{"type":"string","description":"Free-text delivery instructions."},"updated_at":{"type":"string","description":"ISO 8601 timestamp the booking was last updated."},"pickup_instructions":{"type":"string","nullable":true,"description":"Free-text pickup instructions."},"tailgate_pickup":{"type":"boolean","description":"Whether tailgate assistance was requested at pickup."},"tailgate_delivery":{"type":"boolean","description":"Whether tailgate assistance was requested at delivery."},"collection_point":{"type":"object","properties":{"agent_id":{"type":"string","nullable":true,"description":"Collection point agent identifier."},"provider":{"type":"string","nullable":true,"description":"Collection point network provider."},"store_name":{"type":"string","nullable":true,"description":"Display name of the collection point store."},"address":{"anyOf":[{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}]}},{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}]}},{"type":"string"},{"nullable":true}],"description":"Collection point address (string, array, object, or null)."},"surcharge":{"type":"number","description":"Surcharge for using the collection point, in AUD."},"use_closest":{"type":"boolean","description":"Whether the closest collection point should be auto-selected."}},"required":["agent_id","provider","store_name","address","surcharge","use_closest"],"additionalProperties":false,"description":"Collection point (pickup from depot/store) details, when applicable."},"total_booking_count":{"type":"number","description":"Total number of bookings on the member account."}},"required":["id","booked_at","booked_by","created_at","declared_value","insured_value","description","items","label","notifications","receiver","sender","pickup_window","connote","charged_weight","scanned_weight","special_instructions","updated_at","pickup_instructions","tailgate_pickup","tailgate_delivery","total_booking_count"],"additionalProperties":false}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}}},"/api/v5/bookings/track/{id}":{"get":{"tags":["tracking"],"summary":"Track a booking (legacy API shape)","description":"Returns tracking events for a booking ID, consignment number or courier tracking reference, keyed by the supplied reference in the legacy v4 tracking-API shape. Requires an API key.","parameters":[{"schema":{"type":"string","example":"TD123"},"required":true,"name":"id","in":"path","description":"Booking ID, consignment number or courier tracking reference."}],"responses":{"200":{"description":"Tracking events keyed by the requested booking ID or reference","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/BookingTrackingEvent"}}}}}},"400":{"description":"Invalid tracking reference","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointError"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"No booking matched the supplied reference (empty event list for the reference)","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/BookingTrackingEvent"}}}}}}}}},"/api/v5/bookings/v4/track/{id}":{"get":{"tags":["tracking"],"summary":"Track a booking through the legacy v4 alias","description":"Legacy \"/v4\" alias of GET /track/{id}; returns tracking events keyed by the supplied reference in the legacy v4 tracking-API shape. Requires an API key.","parameters":[{"schema":{"type":"string","example":"TD123"},"required":true,"name":"id","in":"path","description":"Booking ID, consignment number or courier tracking reference."}],"responses":{"200":{"description":"Tracking events keyed by the requested booking ID or reference","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/BookingTrackingEvent"}}}}}},"400":{"description":"Invalid tracking reference","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointError"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"No booking matched the supplied reference (empty event list for the reference)","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/BookingTrackingEvent"}}}}}}}}},"/api/v5/bookings/track/v4/{id}":{"get":{"tags":["tracking"],"summary":"Track a booking through the legacy /track/v4 alias","description":"Legacy \"/track/v4\" alias of GET /track/{id}; returns tracking events keyed by the supplied reference in the legacy v4 tracking-API shape. Requires an API key.","parameters":[{"schema":{"type":"string","example":"TD123"},"required":true,"name":"id","in":"path","description":"Booking ID, consignment number or courier tracking reference."}],"responses":{"200":{"description":"Tracking events keyed by the requested booking ID or reference","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/BookingTrackingEvent"}}}}}},"400":{"description":"Invalid tracking reference","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointError"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"No booking matched the supplied reference (empty event list for the reference)","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/BookingTrackingEvent"}}}}}}}}},"/api/v5/bookings/{id}":{"get":{"tags":["bookings"],"summary":"Get a booking","description":"Returns a single booking (or quote) owned by the authenticated member, including sender, receiver, item lines and properties. Requires an API key.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"responses":{"200":{"description":"Booking response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Booking"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}},"put":{"tags":["bookings"],"summary":"Update a booking","description":"Replaces a draft booking's details, sender/receiver addresses and item lines, recalculating weights. Requires an API key and booking ownership. Rejected with 400 once the booking has been paid/processed.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingUpdateRequest"}}}},"responses":{"200":{"description":"Booking response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Booking"}}}},"400":{"description":"Invalid booking update","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingMutationError"}}}},"404":{"description":"Booking not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointError"}}}}}},"patch":{"tags":["bookings"],"summary":"Partially update a booking","description":"Partially updates a draft booking (same body as PUT; only the supplied fields change). Requires an API key and booking ownership. Rejected with 400 once the booking has been paid/processed.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingUpdateRequest"}}}},"responses":{"200":{"description":"Booking response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Booking"}}}},"400":{"description":"Invalid booking update","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingMutationError"}}}},"404":{"description":"Booking not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointError"}}}}}},"delete":{"tags":["bookings"],"summary":"Delete a draft booking","description":"Deletes an unpaid/unprocessed draft booking owned by the authenticated member, including its item lines and addresses. Requires an API key. Returns 204 on success and 500 when the booking has already been processed.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"responses":{"204":{"description":"Booking deleted"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"},"500":{"description":"Booking has already been processed and cannot be deleted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingMutationError"}}}}}}},"/api/v5/bookings/v4/{id}":{"get":{"tags":["bookings"],"summary":"Get a booking through the legacy v4 alias","description":"Legacy \"/v4\" alias that returns a single booking (or quote) owned by the member, including sender, receiver, items and properties. Requires an API key.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"responses":{"200":{"description":"Booking response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Booking"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"}}},"put":{"tags":["bookings"],"summary":"Update a booking through the legacy v4 alias","description":"Legacy \"/v4\" alias that replaces a draft booking's details, addresses and item lines. Requires an API key and booking ownership. Rejected once the booking has been paid/processed.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingUpdateRequest"}}}},"responses":{"200":{"description":"Booking response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Booking"}}}},"400":{"description":"Invalid booking update","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingMutationError"}}}},"404":{"description":"Booking not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointError"}}}}}},"patch":{"tags":["bookings"],"summary":"Partially update a booking through the legacy v4 alias","description":"Legacy \"/v4\" alias for a partial draft-booking update (only the supplied fields change). Requires an API key and booking ownership. Rejected once the booking has been paid/processed.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingUpdateRequest"}}}},"responses":{"200":{"description":"Booking response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Booking"}}}},"400":{"description":"Invalid booking update","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingMutationError"}}}},"404":{"description":"Booking not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointError"}}}}}},"delete":{"tags":["bookings"],"summary":"Delete a draft booking through the legacy v4 alias","description":"Legacy \"/v4\" alias that deletes an unpaid/unprocessed draft booking owned by the member, including its item lines and addresses. Requires an API key. Returns 204 on success and 500 when the booking has already been processed.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"623630"},"required":true,"name":"id","in":"path","description":"Numeric booking ID."}],"responses":{"204":{"description":"Booking deleted"},"401":{"description":"Missing or invalid API key"},"404":{"description":"Booking not found"},"500":{"description":"Booking has already been processed and cannot be deleted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingMutationError"}}}}}}},"/api/v5/locations":{"get":{"tags":["locations"],"summary":"List valid suburbs (paged)","description":"Returns a page of valid Australian suburb/postcode/state rows. When a `q` query is supplied the request is redirected to the location search endpoint.","parameters":[{"schema":{"type":"string","description":"When present, the request is redirected to the location search endpoint."},"required":false,"description":"When present, the request is redirected to the location search endpoint.","name":"q","in":"query"},{"schema":{"type":"string","description":"Maximum suburb rows per page (1-5000); defaults to 1000."},"required":false,"description":"Maximum suburb rows per page (1-5000); defaults to 1000.","name":"limit","in":"query"}],"responses":{"200":{"description":"Paged suburb list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardLocationsIndexResponse"}}}},"302":{"description":"Redirect to the location search endpoint when `q` is supplied"}}}},"/api/v5/locations/page/{page}":{"get":{"tags":["locations"],"summary":"List valid suburbs for a specific page","description":"Returns a specific page of valid Australian suburb/postcode/state rows.","parameters":[{"schema":{"type":"string","example":"2"},"required":true,"name":"page","in":"path","description":"Page number (1-based)."},{"schema":{"type":"string","description":"When present, the request is redirected to the location search endpoint."},"required":false,"description":"When present, the request is redirected to the location search endpoint.","name":"q","in":"query"},{"schema":{"type":"string","description":"Maximum suburb rows per page (1-5000); defaults to 1000."},"required":false,"description":"Maximum suburb rows per page (1-5000); defaults to 1000.","name":"limit","in":"query"}],"responses":{"200":{"description":"Paged suburb list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardLocationsIndexResponse"}}}},"400":{"description":"Invalid page number"}}}},"/api/v5/locations/states":{"get":{"tags":["locations"],"summary":"List states for a country","description":"Returns the states/territories for a country code, plus whether a state and/or postcode are required when addressing in that country.","parameters":[{"schema":{"type":"string","description":"Two-letter ISO country code (e.g. AU). Blank/unknown returns an empty list."},"required":false,"description":"Two-letter ISO country code (e.g. AU). Blank/unknown returns an empty list.","name":"countryCode","in":"query"}],"responses":{"200":{"description":"Country states response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryStatesResponse"}}}}}}},"/api/v5/locations/validate-route":{"post":{"tags":["locations"],"summary":"Validate a route and evaluate courier rules","description":"Validates an origin/destination/items route and returns, per courier, the rules that apply and whether the courier can quote the route. Requires an API key.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateRouteRequest"}}}},"responses":{"200":{"description":"Per-courier validation result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateRouteResponse"}}}},"401":{"description":"Missing or invalid API key"}}}},"/api/v5/orders":{"get":{"tags":["orders"],"summary":"List saved orders","description":"Lists the authenticated member's imported e-commerce orders (Shopify, WooCommerce, CSV and similar), newest first and capped at 50. Requires an API key. Optionally filter by import time and choose the sort column.","parameters":[{"schema":{"type":"string","description":"Only return orders imported at or after this time. Accepts an ISO 8601 datetime, or a \"YYYY-MM-DD HH:MM:SS\" value which is treated as UTC."},"required":false,"description":"Only return orders imported at or after this time. Accepts an ISO 8601 datetime, or a \"YYYY-MM-DD HH:MM:SS\" value which is treated as UTC.","name":"since","in":"query"},{"schema":{"type":"string","description":"Column to sort ascending by (e.g. id, imported_time, sale_price, buyer_name). Defaults to newest first (imported_time descending)."},"required":false,"description":"Column to sort ascending by (e.g. id, imported_time, sale_price, buyer_name). Defaults to newest first (imported_time descending).","name":"sort","in":"query"}],"responses":{"200":{"description":"Saved orders","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Order"}}}}},"400":{"description":"Invalid order query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderError"}}}},"401":{"description":"Missing or invalid API key"}}},"post":{"tags":["orders"],"summary":"Create or update a saved order","description":"Creates a saved order, or updates the existing one matching \"order_id\" (and import source). Either \"order_id\" or \"transdirect_order_id\" is required. Returns 201 when a new order is created and 200 when an existing order is returned or updated. Requires an API key.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedOrderInput"}}}},"responses":{"200":{"description":"Existing or updated saved order","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"201":{"description":"Created saved order","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"400":{"description":"Invalid order body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderError"}}}},"401":{"description":"Missing or invalid API key"},"500":{"description":"Booking-backed order create failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderError"}}}}}}},"/api/v5/orders/{id}":{"get":{"tags":["orders"],"summary":"Get a saved order","description":"Returns a single saved order owned by the authenticated member. Requires an API key. Returns 403 when the order does not belong to the member.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"88"},"required":true,"name":"id","in":"path","description":"Numeric ID of the saved order."}],"responses":{"200":{"description":"Saved order","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"400":{"description":"Invalid order id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderError"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Order not found for this member"}}},"put":{"tags":["orders"],"summary":"Update a saved order","description":"Updates a saved order. A body containing only \"transdirect_order_status\" performs a status-only change; otherwise order, buyer and delivery fields are updated. Supplying a courier plus transdirect_order_id links the order to a booking and stores the courier price. Requires an API key.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"88"},"required":true,"name":"id","in":"path","description":"Numeric ID of the saved order."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/OrderStatusUpdate"},{"$ref":"#/components/schemas/SavedOrderUpdateInput"}]}}}},"responses":{"200":{"description":"Updated saved order","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"400":{"description":"Invalid order id or body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderError"}}}},"401":{"description":"Missing or invalid API key"},"404":{"description":"Order not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderError"}}}},"500":{"description":"Booking-backed order update failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderError"}}}}}},"delete":{"tags":["orders"],"summary":"Delete a saved order","description":"Deletes a saved order owned by the authenticated member. Requires an API key. Returns 204 on success and 403 when the order is not found for the member.","parameters":[{"schema":{"type":"string","pattern":"^\\d+$","example":"88"},"required":true,"name":"id","in":"path","description":"Numeric ID of the saved order."}],"responses":{"204":{"description":"Order deleted"},"400":{"description":"Invalid order id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderError"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Order not found for this member"}}}},"/api/v5/orders/create-simple":{"post":{"tags":["orders"],"summary":"Create a simple saved order","description":"Creates a lightweight saved order from minimal fields (order_id, buyer and delivery details, goods summary). Returns the existing order if one already matches \"order_id\"; otherwise creates a new pending order and returns 201. Requires an API key.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimpleOrderInput"}}}},"responses":{"200":{"description":"Existing saved order","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"201":{"description":"Created simple saved order","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"400":{"description":"Invalid simple order body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderError"}}}},"401":{"description":"Missing or invalid API key"},"500":{"description":"Order create failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderError"}}}}}}},"/api/v5/quotes":{"post":{"tags":["quotes"],"summary":"Create a standard API quote","description":"Requests live courier rates for a shipment (pickup, delivery and item details) and creates a draft booking quote. Requires an API key and is rate-limited. Returns 201 with the ranked quote list.","security":[{"ApiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"sender":{"type":"object","properties":{"address":{"nullable":true},"address2":{"nullable":true},"company_name":{"nullable":true},"email":{"nullable":true},"name":{"nullable":true},"phone":{"nullable":true},"postcode":{"nullable":true},"suburb":{"nullable":true},"state":{"nullable":true},"country":{"nullable":true},"type":{"nullable":true},"residential":{"type":"boolean","nullable":true},"tailgate":{"type":"boolean","nullable":true,"default":false}}},"receiver":{"type":"object","properties":{"address":{"nullable":true},"address2":{"nullable":true},"company_name":{"nullable":true},"email":{"nullable":true},"name":{"nullable":true},"phone":{"nullable":true},"postcode":{"nullable":true},"suburb":{"nullable":true},"state":{"nullable":true},"country":{"nullable":true},"type":{"nullable":true},"residential":{"type":"boolean","nullable":true},"tailgate":{"type":"boolean","nullable":true,"default":false}}},"items":{"type":"array","nullable":true,"items":{"type":"object","nullable":true,"properties":{"length":{"nullable":true},"width":{"nullable":true},"height":{"nullable":true},"weight":{"nullable":true},"quantity":{"nullable":true},"description":{"nullable":true},"sku":{"nullable":true}}}},"declared_value":{"nullable":true},"insured_value":{"nullable":true},"include_warranty":{"type":"boolean","nullable":true},"whole_weight":{"type":"boolean","nullable":true},"cost":{"nullable":true},"description":{"nullable":true},"instructions":{"type":"object","nullable":true,"properties":{"delivery":{"nullable":true},"pickup":{"nullable":true}}},"referrer":{"nullable":true},"requesting_site":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}]},"timeout":{"nullable":true},"tailgate_pickup":{"type":"boolean","nullable":true},"tailgate_delivery":{"type":"boolean","nullable":true},"pickup_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"options":{"type":"object","properties":{"tailgate_pickup":{"type":"boolean","nullable":true},"tailgate_delivery":{"type":"boolean","nullable":true},"insurance_value":{"type":"number","nullable":true,"minimum":0},"authority_to_leave":{"type":"boolean","nullable":true},"disable_cache":{"type":"boolean","nullable":true},"multipickup":{"type":"object","properties":{"address_id":{"type":"integer","minimum":0,"exclusiveMinimum":true},"tier":{"type":"integer","minimum":1,"maximum":2}}}},"default":{}}},"required":["sender","receiver"]}}}},"responses":{"201":{"description":"Created booking quote response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"number","nullable":true},"booking_access_token":{"type":"string"},"booked_at":{"type":"string"},"booked_by":{"type":"string","nullable":true},"created_at":{"type":"string"},"declared_value":{"type":"number"},"insured_value":{"type":"number"},"description":{"type":"string","nullable":true},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"description":{"type":"string"},"weight":{"type":"number"},"length":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"},"quantity":{"type":"number"},"sku":{"nullable":true}},"required":["id","description","weight","length","width","height","quantity"]}},"label":{"type":"string"},"notifications":{"type":"object","properties":{"email":{"type":"boolean"},"sms":{"type":"boolean"}},"required":["email","sms"]},"quotes":{"type":"object","additionalProperties":{"type":"object","properties":{"total":{"type":"number"},"price_insurance_ex":{"type":"number"},"fee":{"type":"number"},"applied_gst":{"type":"number"},"insured_amount":{"type":"number"},"service":{"type":"string"},"transit_time":{"type":"string"},"transit":{"type":"object","properties":{"text":{"type":"string"},"type":{"type":"string","enum":["business_days","hours","same_day","overnight","date_time","unknown"]},"min_days":{"type":"number"},"max_days":{"type":"number"},"min_hours":{"type":"number"},"max_hours":{"type":"number"},"estimated_delivery_at":{"type":"string"}},"required":["text","type"]},"pickup_dates":{"type":"array","items":{"type":"string"}},"pickup_time":{"anyOf":[{"type":"string"},{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]}]},"pickupAvailability":{"type":"object","properties":{"dates":{"type":"array","items":{"type":"string"}},"dateLabels":{"type":"array","items":{"type":"string"}},"times":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]}},"earliest":{"type":"object","properties":{"day":{"type":"string"},"date":{"type":"string"},"time":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]},"times":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]}},"readyFromTimes":{"type":"array","items":{"type":"string"}},"lastAvailableTimes":{"type":"array","items":{"type":"string"}}},"required":["day","date","time"]},"pickupWindow":{"type":"object","properties":{"operatingStart":{"type":"string"},"operatingEnd":{"type":"string"},"displayStart":{"type":"string"},"displayEnd":{"type":"string"},"sameDayCutoff":{"type":"string"},"minWindowMinutes":{"type":"number"},"incrementMinutes":{"type":"number"},"fixed":{"type":"boolean"},"currentTimeInPickupTz":{"type":"string"},"senderUtcOffsetMinutes":{"type":"number","description":"The sender timezone's UTC offset in minutes when the quote was built."},"sameDayCutoffAtMs":{"type":"number","description":"Epoch ms at which today stops being an offered pickup date. Absent when there is none to expire."}},"required":["operatingStart","operatingEnd","displayStart","displayEnd","sameDayCutoff","minWindowMinutes","incrementMinutes","fixed"]},"readyFromTimes":{"type":"array","items":{"type":"string"}},"lastAvailableTimes":{"type":"array","items":{"type":"string"}},"todayReadyFromTimes":{"type":"array","items":{"type":"string"}},"fixedPickupTime":{"type":"boolean","enum":[true]}},"required":["dates","times"]},"pickup_cutoff":{"type":"string","nullable":true},"pickup_window":{"type":"object","properties":{"operatingStart":{"type":"string"},"operatingEnd":{"type":"string"},"displayStart":{"type":"string"},"displayEnd":{"type":"string"},"sameDayCutoff":{"type":"string"},"minWindowMinutes":{"type":"number"},"incrementMinutes":{"type":"number"},"fixed":{"type":"boolean"},"currentTimeInPickupTz":{"type":"string"},"senderUtcOffsetMinutes":{"type":"number","description":"The sender timezone's UTC offset in minutes when the quote was built."},"sameDayCutoffAtMs":{"type":"number","description":"Epoch ms at which today stops being an offered pickup date. Absent when there is none to expire."}},"required":["operatingStart","operatingEnd","displayStart","displayEnd","sameDayCutoff","minWindowMinutes","incrementMinutes","fixed"],"description":"Pickup-window rules driving the ready-from / last-available time picker."},"pickup_ready_from_times":{"type":"array","items":{"type":"string"},"description":"Selectable \"ready from\" pickup times (HH:mm), capped before the collection cutoff. The FULL business-day list — same-day narrowing is applied client-side per selected date via pickup_same_day_ready_from."},"pickup_last_available_times":{"type":"array","items":{"type":"string"},"description":"Selectable \"last available\" pickup times (HH:mm) at the uncapped business close."},"pickup_same_day_ready_from":{"type":"string","nullable":true,"description":"Earliest \"ready from\" time (HH:mm) selectable when the pickup date is today; the picker floors same-day pickups to this. Absent (or null) when today is not an offered pickup date."},"rate_card_code":{"type":"string","description":"Internal rate-card code used to price this quote."},"free_shipping":{"type":"boolean","enum":[true]},"courier":{"type":"string"},"surcharge":{"type":"number"},"tiers":{"type":"array","items":{"type":"object","properties":{"identifier":{"type":"number"},"description":{"type":"string"},"total":{"type":"number"},"price_insurance_ex":{"type":"number"},"fee":{"type":"number"},"applied_gst":{"type":"number"},"insured_amount":{"type":"number"}},"required":["identifier","description","total","price_insurance_ex","fee","applied_gst","insured_amount"]},"description":"Available insurance/service tiers for this quote."}},"required":["total","price_insurance_ex","fee","applied_gst","insured_amount","service","transit_time","transit","pickup_dates","pickup_time","pickupAvailability","rate_card_code"]},"description":"Map of carrier/service key to the quote returned for it."},"quote_errors":{"type":"array","items":{"type":"object","properties":{"courier":{"type":"string"},"code":{"type":"string"},"serviceability":{"type":"string"},"message":{"type":"string","default":""},"retryable":{"type":"boolean","default":false}},"required":["courier","code"]},"description":"Per-carrier errors for carriers that could not be quoted."},"receiver":{"type":"object","properties":{"id":{"type":"number"},"address":{"type":"string"},"address2":{"type":"string"},"company_name":{"type":"string"},"email":{"type":"string","nullable":true},"name":{"type":"string"},"postcode":{"type":"string"},"phone":{"type":"string"},"state":{"type":"string"},"suburb":{"type":"string"},"type":{"type":"string","enum":["business","residential"]},"country":{"type":"string"}},"required":["id","address","company_name","email","name","postcode","phone","state","suburb","type","country"],"description":"Delivery (destination) address on the quote."},"sender":{"type":"object","properties":{"id":{"type":"number"},"address":{"type":"string"},"address2":{"type":"string"},"company_name":{"type":"string"},"email":{"type":"string","nullable":true},"name":{"type":"string"},"postcode":{"type":"string"},"phone":{"type":"string"},"state":{"type":"string"},"suburb":{"type":"string"},"type":{"type":"string","enum":["business","residential"]},"country":{"type":"string"}},"required":["id","address","company_name","email","name","postcode","phone","state","suburb","type","country"],"description":"Pickup (origin) address on the quote."},"pickup_window":{"type":"array","items":{"type":"string"},"description":"Selected pickup window as a pair of time strings [from, to]."},"connote":{"type":"string","nullable":true,"description":"Carrier consignment (connote) number, once lodged, or null."},"charged_weight":{"type":"number","description":"Weight the carrier charged on, in kilograms (kg)."},"scanned_weight":{"type":"number","description":"Weight scanned by the carrier, in kilograms (kg)."},"special_instructions":{"type":"string","description":"Special handling instructions for the consignment."},"status":{"type":"string","description":"Booking status, e.g. \"new\"/\"pending_payment\" (quote) or a paid/confirmed state."},"cost":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"$ref":"#/components/schemas/ApiJsonValue"}},{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}}],"description":"Selected quote cost breakdown, when present."},"updated_at":{"type":"string","description":"Timestamp the quote/booking was last updated, as an ISO 8601 datetime."},"pickup_instructions":{"type":"string","nullable":true,"description":"Instructions for the driver at pickup, or null."},"tailgate_pickup":{"type":"boolean","description":"Whether a tailgate vehicle was requested at pickup."},"tailgate_delivery":{"type":"boolean","description":"Whether a tailgate vehicle was requested at delivery."},"pendingVisualChecks":{"type":"array","items":{"type":"object","properties":{"bookingCheckId":{"type":"integer"},"checkId":{"type":"integer"},"checkName":{"type":"string"},"checkDescription":{"type":"string","default":""},"formJson":{"type":"string","nullable":true},"timing":{"type":"string","nullable":true},"status":{"type":"string"},"createdAt":{"type":"string","nullable":true},"blocksStep":{"type":"boolean"}},"required":["bookingCheckId","checkId","checkName","status"]}},"service_notices":{"type":"array","items":{"type":"object","properties":{"courier":{"type":"string"},"kind":{"type":"string"},"message":{"type":"string"}},"required":["courier","kind","message"]},"description":"Informational, non-bookable carrier notices (e.g. a carrier whose quote API is temporarily down), shown as their own rows in the quote list."},"meta":{"type":"object","properties":{"api_version":{"type":"string","enum":["v5"]},"cache":{"type":"object","properties":{"status":{"type":"string","enum":["HIT","MISS","BYPASS"]},"original_duration_ms":{"type":"number"},"served_duration_ms":{"type":"number"}},"required":["status"]},"timing":{"type":"object","properties":{"duration_ms":{"type":"number"},"boxing_duration_ms":{"type":"number"},"carrier_timings_ms":{"type":"object","additionalProperties":{"type":"number"}}}},"anonymous":{"type":"boolean"},"quote_count":{"type":"number"},"warnings":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"input":{"type":"object","properties":{"postcode":{"type":"string"},"suburb":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"priority":{"type":"number","nullable":true}}},"inferred":{"type":"object","properties":{"postcode":{"type":"string"},"suburb":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"priority":{"type":"number","nullable":true}}},"suggestions":{"type":"array","items":{"type":"object","properties":{"postcode":{"type":"string"},"suburb":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"priority":{"type":"number","nullable":true}}}}},"required":["code","path","message"]}},"persistence":{"type":"object","properties":{"booking_write_mode":{"type":"string","enum":["disabled","enabled"]},"status":{"type":"string","enum":["disabled","written","failed"]},"via":{"type":"string","enum":["hyperdrive","remote-v5","php"]},"book_origin":{"type":"string"}},"required":["booking_write_mode","status"]},"parity":{"type":"object","properties":{"mode":{"type":"string","enum":["disabled","enabled"]},"status":{"type":"string","enum":["skipped","queued"]}},"required":["mode","status"]},"admin":{"type":"object","properties":{"calculations":{"type":"object","additionalProperties":{"type":"object","properties":{"courier":{"type":"string"},"pipeline":{"type":"string","enum":["default","family"]},"error":{"$ref":"#/components/schemas/ApiJsonValue"},"gstAlreadyIncluded":{"type":"boolean"},"fuelLevy":{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["static"]},"pct":{"type":"number"}},"required":["kind","pct"]},{"type":"object","properties":{"kind":{"type":"string","enum":["monthly-fetch"]},"surchargeKey":{"type":"string"}},"required":["kind","surchargeKey"]},{"type":"object","properties":{"kind":{"type":"string","enum":["in-response"]}},"required":["kind"]}]},"marginMultiplier":{"type":"number"},"memberDiscount":{"type":"number"},"courierRaw":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}]}},{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"nullable":true}]}}]},"carbonOffsetBase":{"type":"number"},"trace":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"atMs":{"type":"number"},"courier":{"type":"string"},"label":{"type":"string"},"cache":{"$ref":"#/components/schemas/ApiJsonValue"},"payload":{"$ref":"#/components/schemas/ApiJsonValue"}},"required":["kind","atMs","label"]}},"steps":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"before":{"type":"number"},"after":{"type":"number"},"delta":{"type":"number"},"rounding":{"type":"object","properties":{"preRound":{"type":"number"},"postRound":{"type":"number"},"precision":{"type":"integer","minimum":0}},"required":["preRound","postRound","precision"]}},"required":["key","label","after"]}}},"required":["courier","pipeline","fuelLevy","marginMultiplier","steps"]}},"upstreamErrors":{"type":"object","additionalProperties":{"type":"object","properties":{"kind":{"type":"string","enum":["upstream_status"]},"status":{"type":"number"},"reason":{"type":"string"},"body":{"type":"string"}},"required":["kind","status","reason"]}}}}},"required":["api_version","cache","timing"]}},"required":["id","booked_at","booked_by","created_at","declared_value","insured_value","description","items","label","notifications","quotes","quote_errors","receiver","sender","pickup_window","connote","charged_weight","scanned_weight","special_instructions","status","updated_at","pickup_instructions","tailgate_pickup","tailgate_delivery"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"member_id":{"anyOf":[{"type":"string"},{"type":"number"}]},"limit":{"type":"number"},"window_seconds":{"type":"number"},"upgrade":{"type":"object","properties":{"signup_endpoint":{"type":"string"},"signup_method":{"type":"string"},"quote_endpoint":{"type":"string"},"api_key_header":{"type":"string"},"docs":{"type":"string"}}}},"required":["error"]},{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}},"substituted_fields":{"type":"array","items":{"type":"string"},"description":"Validation paths whose rejected values were substituted by server-side module settings rather than supplied by the caller."}},"required":["errors"]},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}},"required":["status","message"]}]}}}},"401":{"description":"Invalid api key","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"member_id":{"anyOf":[{"type":"string"},{"type":"number"}]},"limit":{"type":"number"},"window_seconds":{"type":"number"},"upgrade":{"type":"object","properties":{"signup_endpoint":{"type":"string"},"signup_method":{"type":"string"},"quote_endpoint":{"type":"string"},"api_key_header":{"type":"string"},"docs":{"type":"string"}}}},"required":["error"]},{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}},"substituted_fields":{"type":"array","items":{"type":"string"},"description":"Validation paths whose rejected values were substituted by server-side module settings rather than supplied by the caller."}},"required":["errors"]},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}},"required":["status","message"]}]}}}},"404":{"description":"Member not found","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"member_id":{"anyOf":[{"type":"string"},{"type":"number"}]},"limit":{"type":"number"},"window_seconds":{"type":"number"},"upgrade":{"type":"object","properties":{"signup_endpoint":{"type":"string"},"signup_method":{"type":"string"},"quote_endpoint":{"type":"string"},"api_key_header":{"type":"string"},"docs":{"type":"string"}}}},"required":["error"]},{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}},"substituted_fields":{"type":"array","items":{"type":"string"},"description":"Validation paths whose rejected values were substituted by server-side module settings rather than supplied by the caller."}},"required":["errors"]},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}},"required":["status","message"]}]}}}},"429":{"description":"Rate-limited","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"member_id":{"anyOf":[{"type":"string"},{"type":"number"}]},"limit":{"type":"number"},"window_seconds":{"type":"number"},"upgrade":{"type":"object","properties":{"signup_endpoint":{"type":"string"},"signup_method":{"type":"string"},"quote_endpoint":{"type":"string"},"api_key_header":{"type":"string"},"docs":{"type":"string"}}}},"required":["error"]},{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}},"substituted_fields":{"type":"array","items":{"type":"string"},"description":"Validation paths whose rejected values were substituted by server-side module settings rather than supplied by the caller."}},"required":["errors"]},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}},"required":["status","message"]}]}}}}}}},"/api/v5/quotes/pickup-availability":{"post":{"tags":["quotes"],"summary":"Get pickup availability for a courier and sender address","description":"Returns the available pickup dates and time windows for a given courier and sender address. Requires an API key.","security":[{"ApiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickupAvailabilityRequest"}}}},"responses":{"200":{"description":"Pickup availability","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickupAvailabilityResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"member_id":{"anyOf":[{"type":"string"},{"type":"number"}]},"limit":{"type":"number"},"window_seconds":{"type":"number"},"upgrade":{"type":"object","properties":{"signup_endpoint":{"type":"string"},"signup_method":{"type":"string"},"quote_endpoint":{"type":"string"},"api_key_header":{"type":"string"},"docs":{"type":"string"}}}},"required":["error"]},{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}},"substituted_fields":{"type":"array","items":{"type":"string"},"description":"Validation paths whose rejected values were substituted by server-side module settings rather than supplied by the caller."}},"required":["errors"]},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}},"required":["status","message"]}]}}}},"401":{"description":"Invalid api key","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"member_id":{"anyOf":[{"type":"string"},{"type":"number"}]},"limit":{"type":"number"},"window_seconds":{"type":"number"},"upgrade":{"type":"object","properties":{"signup_endpoint":{"type":"string"},"signup_method":{"type":"string"},"quote_endpoint":{"type":"string"},"api_key_header":{"type":"string"},"docs":{"type":"string"}}}},"required":["error"]},{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ApiJsonValue"}},"substituted_fields":{"type":"array","items":{"type":"string"},"description":"Validation paths whose rejected values were substituted by server-side module settings rather than supplied by the caller."}},"required":["errors"]},{"type":"object","properties":{"status":{"type":"string","enum":["error"]},"message":{"type":"string"}},"required":["status","message"]}]}}}}}}},"/api/v5/member":{"get":{"tags":["members"],"summary":"Get the currently authenticated member","description":"Returns the member account tied to the API key, including company and contact details, address, credit limit, available credit and charge terms. Requires an API key.","responses":{"200":{"description":"Member response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Member"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointError"}}}},"404":{"description":"No member matched the API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointError"}}}}}}},"/api/v5/members/payment-methods":{"get":{"tags":["members"],"summary":"List saved payment methods for the authenticated member","description":"Lists the authenticated member's saved payment methods — NAB credit cards and PayPal billing agreements — with masked labels and a default flag. Requires an API key.","responses":{"200":{"description":"Saved payment methods","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SavedPaymentMethod"}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointError"}}}}}}},"/api/v5/couriers":{"get":{"tags":["couriers"],"summary":"List supported couriers","description":"Returns the static list of couriers supported by Transdirect. No authentication required.","responses":{"200":{"description":"Couriers response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouriersResponse"}}}}}}}}}