Injection is when another party hands you shipments to move. A marketplace pushes orders that a 3PL must label and ship. A cross-border carrier injects pre-labeled parcels into a domestic last-mile partner. A consolidator delivers a trailer of parcels to a postal operator’s facility. In every case three things happen:
  1. Data arrives first. The upstream party creates the shipments in the receiving network, individually or in bulk.
  2. Goods arrive later, usually together, announced by an advance shipping notice (ASN) and checked in at a facility.
  3. Status flows back. The upstream party needs tracking for the shipments it handed over, usually under its own tracking numbers.
This chapter reuses the shipment, tracker, facility and account objects. It adds an injection group on the shipment, and one new resource, asn. Injection is required in 3PL mode, and optional in Carrier and Fleet modes (chapter 12).

1. Who injects, and how they authenticate

An injecting party is an account of type: "partner" (a carrier or consolidator) or type: "merchant" (a shipper or e-commerce platform) in the receiving implementer (chapter 19). Partners authenticate with their own API keys or OAuth client credentials, scoped to injection:write. A partner that is itself a spec implementer can be connected through federation (chapter 09 §6) in both directions: it injects into you, and you push tracking back to it. An e-commerce platform (a Shopify app, a marketplace) usually acts on behalf of many merchants. It uses OAuth with Shipping-Account: acct_... per merchant (chapter 00 §3.3), so each injected shipment belongs to the right merchant.

2. The injection group on a shipment

An injected shipment is an ordinary shipment with one extra group:
injection is null for shipments created by the shipper directly.

3. Injecting shipments

3.1 One at a time

  • The presence of injection makes the create an injection. The receiving network validates serviceability, the service, the limits, and compliance (when trade is implemented). It responds 200 with injection.status set to accepted, on_hold (accepted pending a fix, such as missing customs data), or rejected.
  • label_mode: label_required behaves like a normal create with a purchase. The partner may include a purchase instruction, and otherwise the receiving network labels it at receipt.
  • Upsert by upstream reference. Repeating a create with the same (partner, upstream_reference) returns the existing shipment and applies any changed fields while it is still submitted or on_hold. That makes order-sync loops from e-commerce platforms safe without client-side bookkeeping.

3.2 In bulk

Most carrier injections arrive as an ASN with its shipments inline. Platform order syncs typically use batches.

3.3 Updating and cancelling

  • POST /v1/shipments/{id} with injection.expected_at, contacts or handling units, until the shipment is received.
  • POST /v1/shipments/{id}/cancel_injection with { reason } sets injection.status: "cancelled" before receipt. After receipt, the receiving network handles it as a return to the partner (chapter 03 §6).

4. Advance shipping notices

An ASN announces a physical delivery of injected shipments to a facility: one trailer, one air pallet, one van load.
(purpose is injection, for shipments to move onward, or stock_receipt, for inventory to store. Stock receipts list lines: [{ product, quantity, lot?, serials? }] instead of shipments, and receive scans write receive stock movements, chapter 29 §3.)

Endpoints

Filters: partner, facility, status, expected_at[gte|lte]. The receiving flow at the facility: Receiving rules.
  • Each scan matches by tracking_number (upstream or local) or SSCC. A match sets injection.status: "received", fills injection.received, and appends a tracking event (in_transit / accepted, source: "implementer").
  • A scan that matches no shipment on the ASN is recorded as unexpected. If it matches a shipment on another open ASN from the same partner, the implementer moves it and records misrouted_asn.
  • relabel shipments get their label at receipt. The new label is appended to documents[], and tracking.number changes to the local number, with the upstream number kept in injection.upstream_tracking_number.
  • On close, every shipment not received becomes missing, and fires shipment.injection_missing. Late scans after close reopen nothing. They are recorded as unexpected on a new ASN created automatically.

5. Injection status

injection.status is a third, independent lifecycle, alongside status (commercial) and tracking.status (physical). Once received, the shipment follows the normal lifecycle in the receiving network.

6. Billing the partner

  • The receiving network prices injected shipments from its own rate sheets (chapter 15), with the partner’s account-specific pricing_rules and rate sheet assignments.
  • Measured weight and dimensions at receipt can re-price a shipment. The difference is recorded as purchase.charges[] with kind: "adjustment", and shipment.charges_adjusted fires, which matches the carrier reweigh flow in reverse.
  • Injection fees (handling, relabelling, customs brokerage) are surcharges with conditions: { channels: ["carrier"], label_modes: ["relabel"] }.

7. Tracking feedback upstream

  • With number: "upstream", events sent upstream carry upstream_tracking_number, so the partner’s customers keep the tracking number printed on their label.
  • Federated feedback uses the partner’s own canonical inbound injection endpoint (chapter 08 §7). Two spec implementers chain tracking with no custom integration.

8. Events

asn.created, asn.updated, asn.dispatched, asn.arrived, asn.closed, asn.cancelled, shipment.injection_accepted, shipment.injection_on_hold, shipment.injection_rejected, shipment.injection_received, shipment.injection_missing, shipment.injection_cancelled. Events are delivered to the receiving network’s own endpoints, and to the partner account’s endpoints for its own shipments.