API Endpoints

Portal API reference — derived from the intent model

56 endpoints11 resources23 GET · 11 POST · 11 PUT · 11 DELETE
Filter by:
GET/api/hbls

List 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): stringFree-text search across the resource’s key identifiers
  • page (query): numberPage number for pagination
  • limit (query): numberItems per page
Auth: LSP, ACFSTables: hbls

Response: { data: House Bill of Lading (HBL)[], page, limit, total }

POST/api/hbls

Create a House Bill of Lading (HBL). Body is validated against the House Bill of Lading (HBL) schema.

Parameters:

  • hbl_number (body): stringPrimary identifier — lowest-level house bill number from Maximus.
  • alt_hbl_reference (body): stringAlternative/parent HBL reference (e.g. AGS master HBL). Optional — present when hierarchy exists. Relationship establis…
  • party_references (body): arrayPer-party HBL references. The same shipment is known by a different reference at each tier of the delegation chain (WFF…
  • container_number (body): stringContainer reference — ties HBL to the top-level container. Visible and sortable in the HBL list, which supports groupin…
  • ocean_bl (body): stringOcean bill of lading. Multiple containers may share one ocean BL.
  • vessel_id (body): stringMaximus VesselID. With voyage_no, disambiguates container_number — reused across voyages (the EDI→order join is Contain…
  • voyage_no (body): stringMaximus VoyageNo. Pairs with vessel_id to disambiguate a reused container_number.
  • consignee (body): stringNext party in the chain (the logistics provider who can see this HBL), identified by account name or code. NOT the raw …
  • weight_kg (body): numberGross weight measurement for fee calculation (EdiRequestedCargo.GrossWeight).
  • net_weight_kg (body): numberNet weight (EdiRequestedCargo.NetWeight). weight_kg is gross; net is one of the four fields the 1 Jul hierarchy-matchin…
  • volume_m3 (body): numberVolumetric measurement for fee calculation.
  • chargeable_weight (body): numberDerived: the greater of weight vs volume per HBL — max(weight_kg, volume_m3). Matt 7 Jul 2026: 1 CBM = 1 metric tonne (…
  • quantity (body): numberNumber of packages (e.g. 3 boxes). Optional — may not be required for decision-making.
  • pack_type (body): stringPackage type description. Optional — may not be required for decision-making.
  • un_code (body): stringUN dangerous-goods code (IntOrderItem.UNCode). OUT OF INITIAL RELEASE (1 Jul) — provisioned for the fast follow.
  • dangerous_goods (body): booleanDerived DG flag (IntContainer.CargoType + IntOrderItem.IMOCode/UNCode). OUT OF INITIAL RELEASE (1 Jul).
  • pallet_quantity (body): numberCHEP/pallet count (IntOrderItem.Quantity2). OUT OF INITIAL RELEASE (1 Jul).
  • pallet_type (body): stringPallet UOM/type (IntOrderItem.UOM2). OUT OF INITIAL RELEASE (1 Jul).
  • description (body): stringGoods description. Two source fields exist in Maximus: "description" and "marks and numbers" — may consolidate.
  • milestone (body): enumPhysical progress milestone. Linear progression. Sourced from Maximus in real time via MuleSoft. Authoritative tables (…
  • hbl_status (body): enumDelegation/booking status — a separate dimension from milestone. This is the CANONICAL (global) state of the HBL, NOT a…
  • customs_clearance_status (body): enumCustoms clearance state. CONFIRMED 3 Aug 2026 (Confluence LCBP 2760474628, "HBL Staging to Master Business Rules") — su…
  • under_bond (body): booleanFlag — NOT a lifecycle state. Goods moving between bonded facilities before customs clearance (Australian Border Force …
  • under_bond_verified (body): booleanWhether ACFS has verified the under-bond marking. Verification happens outside the portal; portal records the result. S…
  • last_free_storage_date (body): stringLFD (Last Free Day) — last date of free storage. After this date, storage fees apply (computed on read, not stored as a…
  • ffo_flag (body): booleanNew (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): enumNew (BRD V2.0 §6.1). Derived from ffo_flag: "lowest_level" when the FFO flag is absent, "intermediate" when present. TH…
  • release_status (body): enumNew (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): enumDO-path field — applies ONLY to lowest-level HBLs (hbl_level_indicator === "lowest_level"); has no meaning for intermed…
  • free_release_verified (body): booleanWhether ACFS has verified the free_release marking. Mirrors under_bond_verified — LSPs cannot self-set release_type; AC…
  • do_waived (body): booleanDO-path field (lowest-level HBLs only). Derived: true when release_type is "free_release" AND free_release_verified is …
  • assigned_lsp (body): stringLSP 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): stringPhysical site/warehouse where this HBL will be picked up (references site entity). Critical for LSP dispatch planning -…
  • import_ref (body): stringImport reference from Maximus. Optional field for data matching and integration.
  • container_key (body): stringMaximus container key (OrderNo-NNN). The join key for milestones (EDICommon events) and container holds (IntContainerHo…
  • cargo_key (body): stringMaximus CargoKey — the per-HBL spine (unique per HBL, via IntOrderItem/CfsCargo). THE key for the collected milestone (…
  • collected_by_code (body): stringCollecting carrier code (cfsTallyOutHed.ContractorCode), populated at the collected milestone (Tally Out).
  • parent_hbl_id (body): stringResolved parent (upper-level) HBL. Written by the ingestion hierarchy-matching pass, not sourced directly (BR-034). Pre…
  • parent_company_id (body): stringProduction ERD HBLS.ParentCompanyId (Companies FK). SEMANTICS UNCONFIRMED — this field appears NOWHERE in the architect…
  • relationship_type (body): stringOutcome of hierarchy matching for this HBL (production ERD HBLS.RelationshipTypeId → HBLRelationshipType). Includes the…
  • match_level (body): stringConfidence band assigned by the hierarchy-matching pass (production ERD HBLS.MatchLevelId → HBLMatchLevel). Bands are 1…
  • needs_manual_review (body): booleanSet by ingestion when hierarchy matching or party mapping did not produce a reliable result — weak match (50%), no matc…
  • is_manually_updated (body): booleanWhether an ACFS admin has hand-corrected this HBL after a manual review. Production ERD HBLS.IsManuallyUpdated. Matters…
  • exception_id (body): stringLink to the recorded ingestion exception for this HBL (production ERD HBLS.ExceptionId → ExceptionType). Exception kind…
  • original_msg_ref (body): stringEDI message reference (EdiRequestedCargo.OriginalMsgRef). Used for de-duplication: where a container has multiple cargo…
  • cargo_hold_status (body): stringCargo-level hold status carried on the HBL (production ERD HBLS.CargoHoldStatus → AQISHoldStatus). The per-hold history…
  • maximus_updated_at (body): stringSource-side last-updated timestamp from Maximus, for sync/CDC change detection (OQ-063/064/065). Distinct from the port…
  • related_bookings (body): arrayBookings this HBL has been included in. Many-to-many relationship via booking_hbls junction table supports rebooking sc…
  • dos_fully_validated (body): booleanDerived rollup flag — true when every DO in this HBL's REQUIRED SET is validated by ACFS: its own DO PLUS all inherited…
Auth: ACFSTables: hbls

Response: { data: House Bill of Lading (HBL) } (201) · 400 { error: 'validation_failed' } on a bad body

GET/api/hbls/:id

Get a single House Bill of Lading (HBL) by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSP, ACFSTables: hbls

Response: { data: House Bill of Lading (HBL) } · 404 { error: 'not_found' }

PUT/api/hbls/:id

Update 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 record
Auth: ACFSTables: hbls

Response: { data: House Bill of Lading (HBL) } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }

DELETE/api/hbls/:id

Delete a House Bill of Lading (HBL) by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: ACFSTables: hbls

Response: { success: true } · 404 { error: 'not_found' }

GET/api/bookings

List 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): stringFree-text search across the resource’s key identifiers
  • page (query): numberPage number for pagination
  • limit (query): numberItems per page
Auth: LSP, ACFSTables: bookings

Response: { data: Booking[], page, limit, total }

POST/api/bookings

Create a Booking. Body is validated against the Booking schema.

Parameters:

  • booking_id (body): stringSystem-generated unique reference number.
  • pickup_window (body): stringSelected 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): arrayHBLs included in this booking. Can span multiple LSPs. Each HBL is assigned to exactly one truck within the booking via…
  • truck_count (body): numberNew (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): numberSingle consolidated total across all trucks (FR-LSP-36): sum of (chargeable_weight × rate) per HBL + minimum charge. Ba…
  • booking_party (body): stringLSP or P4TC who created the booking.
  • tc_accepted (body): booleanWhether the booking party accepted the booking terms and conditions (accepted once per booking). Driver site induction …
  • minimum_charge_applied (body): booleanWhether the configured minimum charge was applied to this booking (BRD V2.0 §6.1). True when the sum of per-HBL chargea…
Auth: LSP, ACFSTables: bookings

Response: { data: Booking } (201) · 400 { error: 'validation_failed' } on a bad body

GET/api/bookings/:id

Get a single Booking by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSP, ACFSTables: bookings

Response: { data: Booking } · 404 { error: 'not_found' }

PUT/api/bookings/:id

Update a Booking — partial body, any subset of the fields accepted by POST /api/bookings.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSP, ACFSTables: bookings

Response: { data: Booking } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }

DELETE/api/bookings/:id

Delete a Booking by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSP, ACFSTables: bookings

Response: { success: true } · 404 { error: 'not_found' }

GET/api/trucks

List Per-truck driver/vehicle records attached to a booking (BR-039) (paginated, filterable).

Parameters:

  • q (query): stringFree-text search across the resource’s key identifiers
  • page (query): numberPage number for pagination
  • limit (query): numberItems per page
Auth: LSP, ACFSTables: trucks

Response: { data: Truck[], page, limit, total }

POST/api/trucks

Create a Truck. Body is validated against the Truck schema.

Parameters:

  • truck_id (body): stringSystem-generated unique ID.
  • booking_id (body): stringParent booking this truck belongs to. NOT PRESENT IN PRODUCTION (2026-08-20): the booking ERD gives Truck no booking FK…
  • truck_rego (body): stringTruck Registration (rego).
  • driver_name (body): stringDriver performing this truck's pickup.
  • driver_license (body): stringDriver licence number.
  • site_induction_flag (body): booleanWhether the driver has completed site induction (Yes/No). When No, the driver site induction T&C acknowledgement is req…
  • tc_acceptance_timestamp (body): stringTimestamp the driver site induction T&C was accepted for this truck.
Auth: LSP, ACFSTables: trucks

Response: { data: Truck } (201) · 400 { error: 'validation_failed' } on a bad body

GET/api/trucks/:id

Get a single Truck by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSP, ACFSTables: trucks

Response: { data: Truck } · 404 { error: 'not_found' }

PUT/api/trucks/:id

Update a Truck — partial body, any subset of the fields accepted by POST /api/trucks.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSP, ACFSTables: trucks

Response: { data: Truck } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }

DELETE/api/trucks/:id

Delete a Truck by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSP, ACFSTables: trucks

Response: { success: true } · 404 { error: 'not_found' }

GET/api/slots

List Bookable pickup time windows per site (paginated, filterable). Configured by ACFS one site at a time (acfs:r3).

Parameters:

  • q (query): stringFree-text search across the resource’s key identifiers
  • page (query): numberPage number for pagination
  • limit (query): numberItems per page
Auth: LSP, ACFSTables: slots

Response: { data: Pickup Slot[], page, limit, total }

POST/api/slots

Create a Pickup Slot. Body is validated against the Pickup Slot schema.

Parameters:

  • slot_id (body): stringSystem-generated unique ID.
  • site (body): stringPhysical site/location for pickup (references site entity).
  • days_of_week (body): arrayDays this slot template applies to (e.g. Monday-Friday).
  • start_time (body): stringSlot 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): stringSlot window end (AM/PM half-day bound for Phase 1).
  • booking_cutoff (body): stringBooking cutoff — relative day (e.g. "previous_working_day", "same_day") + time (e.g. "16:00"). Bookings not accepted af…
  • change_cutoff (body): stringChange cutoff — same format as booking cutoff. Changes to slot/date/HBLs not allowed after this point (truck/driver cha…
  • heat_map_threshold (body): numberOptional 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): numberDERIVED, per (slot, date) — NOT stored on the slot template. Number of trucks already booked on this slot for a given c…
  • is_blocked (body): booleanWhether slot is blocked due to holiday/blackout date.
Auth: ACFSTables: slots

Response: { data: Pickup Slot } (201) · 400 { error: 'validation_failed' } on a bad body

GET/api/slots/:id

Get a single Pickup Slot by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSP, ACFSTables: slots

Response: { data: Pickup Slot } · 404 { error: 'not_found' }

PUT/api/slots/:id

Update a Pickup Slot — partial body, any subset of the fields accepted by POST /api/slots.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: ACFSTables: slots

Response: { data: Pickup Slot } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }

DELETE/api/slots/:id

Delete a Pickup Slot by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: ACFSTables: slots

Response: { success: true } · 404 { error: 'not_found' }

GET/api/slots/available

List 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 for
  • date (query): stringSingle calendar date (YYYY-MM-DD); takes precedence over the week range
  • week_start (query): stringInclusive start of a week range (YYYY-MM-DD); requires week_end
  • week_end (query): stringInclusive end of a week range (YYYY-MM-DD); requires week_start
  • exclude_booking_id (query): stringDrop the caller’s own in-progress booking so the count reads as OTHER trucks
Auth: LSP, ACFSTables: slots, bookings

Response: { 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

GET/api/sites

List ACFS facilities; DB-seeded for Phase 1 (C-006) (paginated, filterable).

Parameters:

  • q (query): stringFree-text search across the resource’s key identifiers
  • page (query): numberPage number for pagination
  • limit (query): numberItems per page
Auth: LSP, ACFSTables: sites

Response: { data: Site[], page, limit, total }

POST/api/sites

Create a Site. Body is validated against the Site schema.

Parameters:

  • site_name (body): stringHuman-readable site name (e.g. "Port Botany Warehouse").
  • branch_code (body): stringBranch code (e.g. "SY", "MB", "BR"). The mapping key from branch → physical site (FR-INT-06). Multiple sites can share …
  • warehouse_code (body): stringMaximus WHCode (IntOrderHd.WarehouseCode). Future-proofing (B5) — branch_code is the live mapping key while there is on…
Auth: ACFSTables: sites

Response: { data: Site } (201) · 400 { error: 'validation_failed' } on a bad body

GET/api/sites/:id

Get a single Site by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSP, ACFSTables: sites

Response: { data: Site } · 404 { error: 'not_found' }

PUT/api/sites/:id

Update a Site — partial body, any subset of the fields accepted by POST /api/sites.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: ACFSTables: sites

Response: { data: Site } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }

DELETE/api/sites/:id

Delete a Site by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: ACFSTables: sites

Response: { success: true } · 404 { error: 'not_found' }

GET/api/delivery-orders

List DOs uploaded against lowest-level HBLs, validated by ACFS (paginated, filterable).

Parameters:

  • q (query): stringFree-text search across the resource’s key identifiers
  • page (query): numberPage number for pagination
  • limit (query): numberItems per page
Auth: LSP, ACFSTables: delivery_orders

Response: { data: Delivery Order (DO)[], page, limit, total }

POST/api/delivery-orders

Create a Delivery Order (DO). Body is validated against the Delivery Order (DO) schema.

Parameters:

  • do_id (body): stringSystem-generated unique ID.
  • hbl_id (body): stringHBL this DO belongs to.
  • uploaded_by (body): stringLSP or P4TC who uploaded the document.
  • upload_date (body): stringWhen the DO was uploaded.
  • document_url (body): stringStored document reference/URL.
  • tier_level (body): stringWhich level in the HBL hierarchy this DO covers. Each tier uploads its own; child HBLs inherit all ancestor-tier DOs fo…
  • flag_reason (body): stringOptional comment captured when ACFS flags/invalidates a DO — why it was flagged (wrong DO, wrong content, unreadable up…
Auth: LSP, ACFSTables: delivery_orders

Response: { data: Delivery Order (DO) } (201) · 400 { error: 'validation_failed' } on a bad body

GET/api/delivery-orders/:id

Get a single Delivery Order (DO) by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSP, ACFSTables: delivery_orders

Response: { data: Delivery Order (DO) } · 404 { error: 'not_found' }

PUT/api/delivery-orders/:id

Update 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 record
Auth: LSP, ACFSTables: delivery_orders

Response: { data: Delivery Order (DO) } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }

DELETE/api/delivery-orders/:id

Delete a Delivery Order (DO) by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSP, ACFSTables: delivery_orders

Response: { success: true } · 404 { error: 'not_found' }

GET/api/delegations

List Chain-of-custody records when an HBL is passed to the next hop (paginated, filterable).

Parameters:

  • q (query): stringFree-text search across the resource’s key identifiers
  • page (query): numberPage number for pagination
  • limit (query): numberItems per page
Auth: LSP, ACFSTables: delegations

Response: { data: Delegation[], page, limit, total }

POST/api/delegations

Create a Delegation. Body is validated against the Delegation schema.

Parameters:

  • delegation_id (body): stringSystem-generated unique ID.
  • delegator (body): stringLSP or P4TC who initiated the delegation.
  • delegatee (body): stringTarget party — existing LSP (by ID). The "new P4TC (by email)" path is DEFERRED with the p4tc actor and is NOT surfaced…
  • delegation_method (body): enumWhether delegating to a registered LSP or creating a one-off P4TC. For Phase 1 only "existing_lsp" is surfaced — the on…
  • hbl_ids (body): arrayHBLs included in this delegation.
  • created_at (body): stringWhen the delegation was created.
Auth: LSP, ACFSTables: delegations

Response: { data: Delegation } (201) · 400 { error: 'validation_failed' } on a bad body

GET/api/delegations/:id

Get a single Delegation by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSP, ACFSTables: delegations

Response: { data: Delegation } · 404 { error: 'not_found' }

PUT/api/delegations/:id

Update a Delegation — partial body, any subset of the fields accepted by POST /api/delegations.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSP, ACFSTables: delegations

Response: { data: Delegation } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }

DELETE/api/delegations/:id

Delete a Delegation by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSP, ACFSTables: delegations

Response: { success: true } · 404 { error: 'not_found' }

GET/api/release_authorities

List Digital-release acts against intermediate HBLs (BR-041) (paginated, filterable).

Parameters:

  • q (query): stringFree-text search across the resource’s key identifiers
  • page (query): numberPage number for pagination
  • limit (query): numberItems per page
Auth: LSP, ACFSTables: release_authorities

Response: { data: Release Authority[], page, limit, total }

POST/api/release_authorities

Create a Release Authority. Body is validated against the Release Authority schema.

Parameters:

  • release_id (body): stringSystem-generated unique ID.
  • hbl_id (body): stringHBL against which release authority is provided.
  • release_mechanism (body): enumFUTURE target enum for the form of a release act (distinct from hbl.release_type). "digital_release" represents an inte…
  • acting_lsp_id (body): stringThe LSP (or NVOCC such as AGS) that provided the release.
  • release_timestamp (body): stringWhen 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…
Auth: LSP, ACFSTables: release_authorities

Response: { data: Release Authority } (201) · 400 { error: 'validation_failed' } on a bad body

GET/api/release_authorities/:id

Get a single Release Authority by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSP, ACFSTables: release_authorities

Response: { data: Release Authority } · 404 { error: 'not_found' }

PUT/api/release_authorities/:id

Update 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 record
Auth: LSP, ACFSTables: release_authorities

Response: { data: Release Authority } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }

DELETE/api/release_authorities/:id

Delete a Release Authority by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSP, ACFSTables: release_authorities

Response: { success: true } · 404 { error: 'not_found' }

GET/api/payments

List Booking fee payments via the Compay gateway (paginated, filterable).

Parameters:

  • q (query): stringFree-text search across the resource’s key identifiers
  • page (query): numberPage number for pagination
  • limit (query): numberItems per page
Auth: LSP, ACFSTables: payments

Response: { data: Payment[], page, limit, total }

POST/api/payments

Create a Payment. Body is validated against the Payment schema.

Parameters:

  • payment_id (body): stringSystem-generated unique payment reference.
  • booking_id (body): stringBooking this payment is for.
  • amount (body): numberTotal amount charged.
  • payment_gateway (body): stringGateway used. Compay for Phase 1 (managed by One Stop; Jason has requested a technical contact for integration). Abstra…
  • payment_status (body): enumTransaction status. Refunds are processed outside VBS but status may be updated by ACFS.
  • payment_timestamp (body): stringWhen the payment was processed.
Auth: LSPTables: payments

Response: { data: Payment } (201) · 400 { error: 'validation_failed' } on a bad body

GET/api/payments/:id

Get a single Payment by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSP, ACFSTables: payments

Response: { data: Payment } · 404 { error: 'not_found' }

PUT/api/payments/:id

Update a Payment — partial body, any subset of the fields accepted by POST /api/payments.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSPTables: payments

Response: { data: Payment } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }

DELETE/api/payments/:id

Delete a Payment by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSPTables: payments

Response: { success: true } · 404 { error: 'not_found' }

GET/api/users

List Portal user accounts; lifecycle managed by ACFS (BR-014) (paginated, filterable).

Parameters:

  • q (query): stringFree-text search across the resource’s key identifiers
  • page (query): numberPage number for pagination
  • limit (query): numberItems per page
Auth: ACFSTables: users

Response: { data: User / Account[], page, limit, total }

POST/api/users

Create a User / Account. Body is validated against the User / Account schema.

Parameters:

  • user_id (body): stringSystem-generated unique ID.
  • username (body): stringFor ACFS users: username / SSO identifier. For LSP company accounts there is no username — the company email is the log…
  • company_name (body): stringLSP company accounts only: the company name (this is the account identity, not an individual person's name). Null/ACFS …
  • email (body): stringLSP company accounts: the login + notification email. ACFS users: contact email.
  • branch (body): stringLSP company accounts: branch. One of the three fields captured when creating an LSP account (company name, email, branc…
  • role (body): enumFor ACFS users this is the Admin/User dropdown selection with backend-preconfigured permissions. LSP company accounts a…
  • linked_lsp_id (body): stringFor LSP users: the LSP company this account belongs to. Null for ACFS users.
  • status (body): enumAccount status. Inactive = soft-deleted (archived). Access and notifications disabled.
Auth: ACFSTables: users

Response: { data: User / Account } (201) · 400 { error: 'validation_failed' } on a bad body

GET/api/users/:id

Get a single User / Account by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: ACFSTables: users

Response: { data: User / Account } · 404 { error: 'not_found' }

PUT/api/users/:id

Update a User / Account — partial body, any subset of the fields accepted by POST /api/users.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: ACFSTables: users

Response: { data: User / Account } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }

DELETE/api/users/:id

Delete a User / Account by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: ACFSTables: users

Response: { success: true } · 404 { error: 'not_found' }

GET/api/booking-hbl-links

List Join records mapping which HBLs (and trucks) belong to a booking (paginated, filterable).

Parameters:

  • q (query): stringFree-text search across the resource’s key identifiers
  • page (query): numberPage number for pagination
  • limit (query): numberItems per page
Auth: LSP, ACFSTables: booking_hbls

Response: { data: Booking–HBL Link[], page, limit, total }

POST/api/booking-hbl-links

Create a Booking–HBL Link. Body is validated against the Booking–HBL Link schema.

Parameters:

  • booking_id (body): stringParent booking reference.
  • hbl_id (body): stringLinked HBL reference.
  • truck_id (body): stringNew (BRD V2.0 §6.1). The truck (within the parent booking) assigned to collect this HBL.
  • chargeable_weight (body): numberChargeable weight for this HBL at time of booking (max of weight vs volume).
  • rate (body): numberRate applied to this HBL at time of booking.
  • per_hbl_fee (body): numberCalculated fee for this HBL (chargeable_weight × rate).
Auth: ACFSTables: booking_hbls

Response: { data: Booking–HBL Link } (201) · 400 { error: 'validation_failed' } on a bad body

GET/api/booking-hbl-links/:id

Get a single Booking–HBL Link by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: LSP, ACFSTables: booking_hbls

Response: { data: Booking–HBL Link } · 404 { error: 'not_found' }

PUT/api/booking-hbl-links/:id

Update 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 record
Auth: ACFSTables: booking_hbls

Response: { data: Booking–HBL Link } · 404 { error: 'not_found' } · 400 { error: 'validation_failed' }

DELETE/api/booking-hbl-links/:id

Delete a Booking–HBL Link by id.

Parameters:

  • id (path): string*Opaque string identifier for the record
Auth: ACFSTables: booking_hbls

Response: { success: true } · 404 { error: 'not_found' }