Portal API reference — derived from the intent model
/api/hblsList House Bills of Lading — the core shipment entity (paginated, filterable). LSPs are auto-scoped to their assigned HBLs (BR-009); ACFS sees all.
Parameters:
q (query): string — Free-text search across the resource’s key identifierspage (query): number — Page number for paginationlimit (query): number — Items per pageResponse: { data: House Bill of Lading (HBL)[], page, limit, total }
/api/hblsCreate a House Bill of Lading (HBL). Body is validated against the House Bill of Lading (HBL) schema.
Parameters:
hbl_number (body): string — Primary identifier — lowest-level house bill number from Maximus.alt_hbl_reference (body): string — Alternative/parent HBL reference (e.g. AGS master HBL). Optional — present when hierarchy exists. Relationship establis…party_references (body): array — Per-party HBL references. The same shipment is known by a different reference at each tier of the delegation chain (WFF…container_number (body): string — Container reference — ties HBL to the top-level container. Visible and sortable in the HBL list, which supports groupin…ocean_bl (body): string — Ocean bill of lading. Multiple containers may share one ocean BL.vessel_id (body): string — Maximus VesselID. With voyage_no, disambiguates container_number — reused across voyages (the EDI→order join is Contain…voyage_no (body): string — Maximus VoyageNo. Pairs with vessel_id to disambiguate a reused container_number.consignee (body): string — Next party in the chain (the logistics provider who can see this HBL), identified by account name or code. NOT the raw …weight_kg (body): number — Gross weight measurement for fee calculation (EdiRequestedCargo.GrossWeight).net_weight_kg (body): number — Net weight (EdiRequestedCargo.NetWeight). weight_kg is gross; net is one of the four fields the 1 Jul hierarchy-matchin…volume_m3 (body): number — Volumetric measurement for fee calculation.chargeable_weight (body): number — Derived: the greater of weight vs volume per HBL — max(weight_kg, volume_m3). Matt 7 Jul 2026: 1 CBM = 1 metric tonne (…quantity (body): number — Number of packages (e.g. 3 boxes). Optional — may not be required for decision-making.pack_type (body): string — Package type description. Optional — may not be required for decision-making.un_code (body): string — UN dangerous-goods code (IntOrderItem.UNCode). OUT OF INITIAL RELEASE (1 Jul) — provisioned for the fast follow.dangerous_goods (body): boolean — Derived DG flag (IntContainer.CargoType + IntOrderItem.IMOCode/UNCode). OUT OF INITIAL RELEASE (1 Jul).pallet_quantity (body): number — CHEP/pallet count (IntOrderItem.Quantity2). OUT OF INITIAL RELEASE (1 Jul).pallet_type (body): string — Pallet UOM/type (IntOrderItem.UOM2). OUT OF INITIAL RELEASE (1 Jul).description (body): string — Goods description. Two source fields exist in Maximus: "description" and "marks and numbers" — may consolidate.milestone (body): enum — Physical progress milestone. Linear progression. Sourced from Maximus in real time via MuleSoft. Authoritative tables (…hbl_status (body): enum — Delegation/booking status — a separate dimension from milestone. This is the CANONICAL (global) state of the HBL, NOT a…customs_clearance_status (body): enum — Customs clearance state. CONFIRMED 3 Aug 2026 (Confluence LCBP 2760474628, "HBL Staging to Master Business Rules") — su…under_bond (body): boolean — Flag — NOT a lifecycle state. Goods moving between bonded facilities before customs clearance (Australian Border Force …under_bond_verified (body): boolean — Whether ACFS has verified the under-bond marking. Verification happens outside the portal; portal records the result. S…last_free_storage_date (body): string — LFD (Last Free Day) — last date of free storage. After this date, storage fees apply (computed on read, not stored as a…ffo_flag (body): boolean — New (BRD V2.0 §3, FR-ADM-17). FFO flag from the EDI Requested Cargo table — the authoritative classifier of HBL hierarc…hbl_level_indicator (body): enum — New (BRD V2.0 §6.1). Derived from ffo_flag: "lowest_level" when the FFO flag is absent, "intermediate" when present. TH…release_status (body): enum — New (BRD V2.0 §6.1, FR-LSP-02). Phase 1 HBL-level summary of whether release authority is VALIDATED/granted. Intended s…release_type (body): enum — DO-path field — applies ONLY to lowest-level HBLs (hbl_level_indicator === "lowest_level"); has no meaning for intermed…free_release_verified (body): boolean — Whether ACFS has verified the free_release marking. Mirrors under_bond_verified — LSPs cannot self-set release_type; AC…do_waived (body): boolean — DO-path field (lowest-level HBLs only). Derived: true when release_type is "free_release" AND free_release_verified is …assigned_lsp (body): string — LSP this HBL is currently allocated to — always the LAST hop in the chain (VBS daily standup 2026-06-04). Set by ACFS d…pickup_site (body): string — Physical site/warehouse where this HBL will be picked up (references site entity). Critical for LSP dispatch planning -…import_ref (body): string — Import reference from Maximus. Optional field for data matching and integration.container_key (body): string — Maximus container key (OrderNo-NNN). The join key for milestones (EDICommon events) and container holds (IntContainerHo…cargo_key (body): string — Maximus CargoKey — the per-HBL spine (unique per HBL, via IntOrderItem/CfsCargo). THE key for the collected milestone (…collected_by_code (body): string — Collecting carrier code (cfsTallyOutHed.ContractorCode), populated at the collected milestone (Tally Out).parent_hbl_id (body): string — Resolved parent (upper-level) HBL. Written by the ingestion hierarchy-matching pass, not sourced directly (BR-034). Pre…parent_company_id (body): string — Production ERD HBLS.ParentCompanyId (Companies FK). SEMANTICS UNCONFIRMED — this field appears NOWHERE in the architect…relationship_type (body): string — Outcome of hierarchy matching for this HBL (production ERD HBLS.RelationshipTypeId → HBLRelationshipType). Includes the…match_level (body): string — Confidence band assigned by the hierarchy-matching pass (production ERD HBLS.MatchLevelId → HBLMatchLevel). Bands are 1…needs_manual_review (body): boolean — Set by ingestion when hierarchy matching or party mapping did not produce a reliable result — weak match (50%), no matc…is_manually_updated (body): boolean — Whether an ACFS admin has hand-corrected this HBL after a manual review. Production ERD HBLS.IsManuallyUpdated. Matters…exception_id (body): string — Link to the recorded ingestion exception for this HBL (production ERD HBLS.ExceptionId → ExceptionType). Exception kind…original_msg_ref (body): string — EDI message reference (EdiRequestedCargo.OriginalMsgRef). Used for de-duplication: where a container has multiple cargo…cargo_hold_status (body): string — Cargo-level hold status carried on the HBL (production ERD HBLS.CargoHoldStatus → AQISHoldStatus). The per-hold history…maximus_updated_at (body): string — Source-side last-updated timestamp from Maximus, for sync/CDC change detection (OQ-063/064/065). Distinct from the port…related_bookings (body): array — Bookings this HBL has been included in. Many-to-many relationship via booking_hbls junction table supports rebooking sc…dos_fully_validated (body): boolean — Derived rollup flag — true when every DO in this HBL's REQUIRED SET is validated by ACFS: its own DO PLUS all inherited…Response: { data: House Bill of Lading (HBL) } (201) · 400 { error: 'validation_failed' } on a bad body
/api/hbls/:idGet a single House Bill of Lading (HBL) by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: House Bill of Lading (HBL) } · 404 { error: 'not_found' }
/api/hbls/:idUpdate a House Bill of Lading (HBL) — partial body, any subset of the fields accepted by POST /api/hbls. Note: milestone and customs_clearance_status are sourced read-only from Maximus and cannot be edited here (acfs:r14 re-pulls them).
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: House Bill of Lading (HBL) } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }
/api/hbls/:idDelete a House Bill of Lading (HBL) by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { success: true } · 404 { error: 'not_found' }
/api/bookingsList Pickup bookings across one or more trucks (paginated, filterable). Searchable by booking reference, HBL reference, or truck/driver details (lsp:r9, acfs:r4).
Parameters:
q (query): string — Free-text search across the resource’s key identifierspage (query): number — Page number for paginationlimit (query): number — Items per pageResponse: { data: Booking[], page, limit, total }
/api/bookingsCreate a Booking. Body is validated against the Booking schema.
Parameters:
booking_id (body): string — System-generated unique reference number.pickup_window (body): string — Selected date/time slot. One slot applies to the entire booking (all trucks share the same slot, BRD V2.0 §8.1). NOT EN…hbl_ids (body): array — HBLs included in this booking. Can span multiple LSPs. Each HBL is assigned to exactly one truck within the booking via…truck_count (body): number — New (BRD V2.0 §6.1). Number of trucks assigned to this booking. Driver/truck details live on the truck entity, one row …fee_amount (body): number — Single consolidated total across all trucks (FR-LSP-36): sum of (chargeable_weight × rate) per HBL + minimum charge. Ba…booking_party (body): string — LSP or P4TC who created the booking.tc_accepted (body): boolean — Whether the booking party accepted the booking terms and conditions (accepted once per booking). Driver site induction …minimum_charge_applied (body): boolean — Whether the configured minimum charge was applied to this booking (BRD V2.0 §6.1). True when the sum of per-HBL chargea…Response: { data: Booking } (201) · 400 { error: 'validation_failed' } on a bad body
/api/bookings/:idGet a single Booking by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: Booking } · 404 { error: 'not_found' }
/api/bookings/:idUpdate a Booking — partial body, any subset of the fields accepted by POST /api/bookings.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: Booking } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }
/api/bookings/:idDelete a Booking by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { success: true } · 404 { error: 'not_found' }
/api/trucksList Per-truck driver/vehicle records attached to a booking (BR-039) (paginated, filterable).
Parameters:
q (query): string — Free-text search across the resource’s key identifierspage (query): number — Page number for paginationlimit (query): number — Items per pageResponse: { data: Truck[], page, limit, total }
/api/trucksCreate a Truck. Body is validated against the Truck schema.
Parameters:
truck_id (body): string — System-generated unique ID.booking_id (body): string — Parent booking this truck belongs to. NOT PRESENT IN PRODUCTION (2026-08-20): the booking ERD gives Truck no booking FK…truck_rego (body): string — Truck Registration (rego).driver_name (body): string — Driver performing this truck's pickup.driver_license (body): string — Driver licence number.site_induction_flag (body): boolean — Whether the driver has completed site induction (Yes/No). When No, the driver site induction T&C acknowledgement is req…tc_acceptance_timestamp (body): string — Timestamp the driver site induction T&C was accepted for this truck.Response: { data: Truck } (201) · 400 { error: 'validation_failed' } on a bad body
/api/trucks/:idGet a single Truck by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: Truck } · 404 { error: 'not_found' }
/api/trucks/:idUpdate a Truck — partial body, any subset of the fields accepted by POST /api/trucks.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: Truck } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }
/api/trucks/:idDelete a Truck by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { success: true } · 404 { error: 'not_found' }
/api/slotsList Bookable pickup time windows per site (paginated, filterable). Configured by ACFS one site at a time (acfs:r3).
Parameters:
q (query): string — Free-text search across the resource’s key identifierspage (query): number — Page number for paginationlimit (query): number — Items per pageResponse: { data: Pickup Slot[], page, limit, total }
/api/slotsCreate a Pickup Slot. Body is validated against the Pickup Slot schema.
Parameters:
slot_id (body): string — System-generated unique ID.site (body): string — Physical site/location for pickup (references site entity).days_of_week (body): array — Days this slot template applies to (e.g. Monday-Friday).start_time (body): string — Slot window start. For Phase 1 these bound the AM or PM half-day window rather than an arbitrary hourly slot (VBS daily…end_time (body): string — Slot window end (AM/PM half-day bound for Phase 1).booking_cutoff (body): string — Booking cutoff — relative day (e.g. "previous_working_day", "same_day") + time (e.g. "16:00"). Bookings not accepted af…change_cutoff (body): string — Change cutoff — same format as booking cutoff. Changes to slot/date/HBLs not allowed after this point (truck/driver cha…heat_map_threshold (body): number — Optional busyness-band threshold(s) per slot. Since 2026-07-09 (OQ-065) the slot card reveals the actual booked_truck_c…booked_truck_count (body): number — DERIVED, per (slot, date) — NOT stored on the slot template. Number of trucks already booked on this slot for a given c…is_blocked (body): boolean — Whether slot is blocked due to holiday/blackout date.Response: { data: Pickup Slot } (201) · 400 { error: 'validation_failed' } on a bad body
/api/slots/:idGet a single Pickup Slot by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: Pickup Slot } · 404 { error: 'not_found' }
/api/slots/:idUpdate a Pickup Slot — partial body, any subset of the fields accepted by POST /api/slots.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: Pickup Slot } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }
/api/slots/:idDelete a Pickup Slot by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { success: true } · 404 { error: 'not_found' }
/api/slots/availableList a site’s available slots for a date (or week), each annotated with booked_truck_count — the actual number of trucks already booked on that slot for that calendar date (OQ-065 / FR-LSP-14). Count = SUM(bookings.truck_count) over non-draft/non-cancelled bookings; it is informational and never blocks booking (BR-005).
Parameters:
site_id (query): string* — Site to list slots fordate (query): string — Single calendar date (YYYY-MM-DD); takes precedence over the week rangeweek_start (query): string — Inclusive start of a week range (YYYY-MM-DD); requires week_endweek_end (query): string — Inclusive end of a week range (YYYY-MM-DD); requires week_startexclude_booking_id (query): string — Drop the caller’s own in-progress booking so the count reads as OTHER trucksResponse: { data: AvailableSlot[] } where each slot carries slot_date + booked_truck_count · 400 { error: 'validation_failed' } when neither date nor a full week range is given
/api/sitesList ACFS facilities; DB-seeded for Phase 1 (C-006) (paginated, filterable).
Parameters:
q (query): string — Free-text search across the resource’s key identifierspage (query): number — Page number for paginationlimit (query): number — Items per pageResponse: { data: Site[], page, limit, total }
/api/sitesCreate a Site. Body is validated against the Site schema.
Parameters:
site_name (body): string — Human-readable site name (e.g. "Port Botany Warehouse").branch_code (body): string — Branch code (e.g. "SY", "MB", "BR"). The mapping key from branch → physical site (FR-INT-06). Multiple sites can share …warehouse_code (body): string — Maximus WHCode (IntOrderHd.WarehouseCode). Future-proofing (B5) — branch_code is the live mapping key while there is on…Response: { data: Site } (201) · 400 { error: 'validation_failed' } on a bad body
/api/sites/:idGet a single Site by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: Site } · 404 { error: 'not_found' }
/api/sites/:idUpdate a Site — partial body, any subset of the fields accepted by POST /api/sites.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: Site } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }
/api/sites/:idDelete a Site by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { success: true } · 404 { error: 'not_found' }
/api/delivery-ordersList DOs uploaded against lowest-level HBLs, validated by ACFS (paginated, filterable).
Parameters:
q (query): string — Free-text search across the resource’s key identifierspage (query): number — Page number for paginationlimit (query): number — Items per pageResponse: { data: Delivery Order (DO)[], page, limit, total }
/api/delivery-ordersCreate a Delivery Order (DO). Body is validated against the Delivery Order (DO) schema.
Parameters:
do_id (body): string — System-generated unique ID.hbl_id (body): string — HBL this DO belongs to.uploaded_by (body): string — LSP or P4TC who uploaded the document.upload_date (body): string — When the DO was uploaded.document_url (body): string — Stored document reference/URL.tier_level (body): string — Which level in the HBL hierarchy this DO covers. Each tier uploads its own; child HBLs inherit all ancestor-tier DOs fo…flag_reason (body): string — Optional comment captured when ACFS flags/invalidates a DO — why it was flagged (wrong DO, wrong content, unreadable up…Response: { data: Delivery Order (DO) } (201) · 400 { error: 'validation_failed' } on a bad body
/api/delivery-orders/:idGet a single Delivery Order (DO) by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: Delivery Order (DO) } · 404 { error: 'not_found' }
/api/delivery-orders/:idUpdate a Delivery Order (DO) — partial body, any subset of the fields accepted by POST /api/delivery-orders.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: Delivery Order (DO) } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }
/api/delivery-orders/:idDelete a Delivery Order (DO) by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { success: true } · 404 { error: 'not_found' }
/api/delegationsList Chain-of-custody records when an HBL is passed to the next hop (paginated, filterable).
Parameters:
q (query): string — Free-text search across the resource’s key identifierspage (query): number — Page number for paginationlimit (query): number — Items per pageResponse: { data: Delegation[], page, limit, total }
/api/delegationsCreate a Delegation. Body is validated against the Delegation schema.
Parameters:
delegation_id (body): string — System-generated unique ID.delegator (body): string — LSP or P4TC who initiated the delegation.delegatee (body): string — Target party — existing LSP (by ID). The "new P4TC (by email)" path is DEFERRED with the p4tc actor and is NOT surfaced…delegation_method (body): enum — Whether delegating to a registered LSP or creating a one-off P4TC. For Phase 1 only "existing_lsp" is surfaced — the on…hbl_ids (body): array — HBLs included in this delegation.created_at (body): string — When the delegation was created.Response: { data: Delegation } (201) · 400 { error: 'validation_failed' } on a bad body
/api/delegations/:idGet a single Delegation by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: Delegation } · 404 { error: 'not_found' }
/api/delegations/:idUpdate a Delegation — partial body, any subset of the fields accepted by POST /api/delegations.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: Delegation } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }
/api/delegations/:idDelete a Delegation by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { success: true } · 404 { error: 'not_found' }
/api/release_authoritiesList Digital-release acts against intermediate HBLs (BR-041) (paginated, filterable).
Parameters:
q (query): string — Free-text search across the resource’s key identifierspage (query): number — Page number for paginationlimit (query): number — Items per pageResponse: { data: Release Authority[], page, limit, total }
/api/release_authoritiesCreate a Release Authority. Body is validated against the Release Authority schema.
Parameters:
release_id (body): string — System-generated unique ID.hbl_id (body): string — HBL against which release authority is provided.release_mechanism (body): enum — FUTURE target enum for the form of a release act (distinct from hbl.release_type). "digital_release" represents an inte…acting_lsp_id (body): string — The LSP (or NVOCC such as AGS) that provided the release.release_timestamp (body): string — When the release was provided.status (body): enum — "provided" once recorded; "superseded" if a later release/reassignment replaces it (e.g. delegation revoked or HBL reas…Response: { data: Release Authority } (201) · 400 { error: 'validation_failed' } on a bad body
/api/release_authorities/:idGet a single Release Authority by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: Release Authority } · 404 { error: 'not_found' }
/api/release_authorities/:idUpdate a Release Authority — partial body, any subset of the fields accepted by POST /api/release_authorities.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: Release Authority } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }
/api/release_authorities/:idDelete a Release Authority by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { success: true } · 404 { error: 'not_found' }
/api/paymentsList Booking fee payments via the Compay gateway (paginated, filterable).
Parameters:
q (query): string — Free-text search across the resource’s key identifierspage (query): number — Page number for paginationlimit (query): number — Items per pageResponse: { data: Payment[], page, limit, total }
/api/paymentsCreate a Payment. Body is validated against the Payment schema.
Parameters:
payment_id (body): string — System-generated unique payment reference.booking_id (body): string — Booking this payment is for.amount (body): number — Total amount charged.payment_gateway (body): string — Gateway used. Compay for Phase 1 (managed by One Stop; Jason has requested a technical contact for integration). Abstra…payment_status (body): enum — Transaction status. Refunds are processed outside VBS but status may be updated by ACFS.payment_timestamp (body): string — When the payment was processed.Response: { data: Payment } (201) · 400 { error: 'validation_failed' } on a bad body
/api/payments/:idGet a single Payment by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: Payment } · 404 { error: 'not_found' }
/api/payments/:idUpdate a Payment — partial body, any subset of the fields accepted by POST /api/payments.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: Payment } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }
/api/payments/:idDelete a Payment by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { success: true } · 404 { error: 'not_found' }
/api/usersList Portal user accounts; lifecycle managed by ACFS (BR-014) (paginated, filterable).
Parameters:
q (query): string — Free-text search across the resource’s key identifierspage (query): number — Page number for paginationlimit (query): number — Items per pageResponse: { data: User / Account[], page, limit, total }
/api/usersCreate a User / Account. Body is validated against the User / Account schema.
Parameters:
user_id (body): string — System-generated unique ID.username (body): string — For ACFS users: username / SSO identifier. For LSP company accounts there is no username — the company email is the log…company_name (body): string — LSP company accounts only: the company name (this is the account identity, not an individual person's name). Null/ACFS …email (body): string — LSP company accounts: the login + notification email. ACFS users: contact email.branch (body): string — LSP company accounts: branch. One of the three fields captured when creating an LSP account (company name, email, branc…role (body): enum — For ACFS users this is the Admin/User dropdown selection with backend-preconfigured permissions. LSP company accounts a…linked_lsp_id (body): string — For LSP users: the LSP company this account belongs to. Null for ACFS users.status (body): enum — Account status. Inactive = soft-deleted (archived). Access and notifications disabled.Response: { data: User / Account } (201) · 400 { error: 'validation_failed' } on a bad body
/api/users/:idGet a single User / Account by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: User / Account } · 404 { error: 'not_found' }
/api/users/:idUpdate a User / Account — partial body, any subset of the fields accepted by POST /api/users.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: User / Account } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }
/api/users/:idDelete a User / Account by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { success: true } · 404 { error: 'not_found' }
/api/booking-hbl-linksList Join records mapping which HBLs (and trucks) belong to a booking (paginated, filterable).
Parameters:
q (query): string — Free-text search across the resource’s key identifierspage (query): number — Page number for paginationlimit (query): number — Items per pageResponse: { data: Booking–HBL Link[], page, limit, total }
/api/booking-hbl-linksCreate a Booking–HBL Link. Body is validated against the Booking–HBL Link schema.
Parameters:
booking_id (body): string — Parent booking reference.hbl_id (body): string — Linked HBL reference.truck_id (body): string — New (BRD V2.0 §6.1). The truck (within the parent booking) assigned to collect this HBL.chargeable_weight (body): number — Chargeable weight for this HBL at time of booking (max of weight vs volume).rate (body): number — Rate applied to this HBL at time of booking.per_hbl_fee (body): number — Calculated fee for this HBL (chargeable_weight × rate).Response: { data: Booking–HBL Link } (201) · 400 { error: 'validation_failed' } on a bad body
/api/booking-hbl-links/:idGet a single Booking–HBL Link by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: Booking–HBL Link } · 404 { error: 'not_found' }
/api/booking-hbl-links/:idUpdate a Booking–HBL Link — partial body, any subset of the fields accepted by POST /api/booking-hbl-links.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { data: Booking–HBL Link } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }
/api/booking-hbl-links/:idDelete a Booking–HBL Link by id.
Parameters:
id (path): string* — Opaque string identifier for the recordResponse: { success: true } · 404 { error: 'not_found' }