Get Fulfillment Order Detail
GET/api/fulfillment-orders/:fulfillmentOrder
Returns a single FulfillmentOrder with its lines and warehouse eager-loaded. Each line exposes its quantity (the original budget) and remaining_quantity (the over-fulfilment backstop — units still available to consume via a SalesOrderFulfillmentLine).
orders:readGrant this scope to your token under Settings → Developer → Personal Access Tokens.
Returns 404 if the feature flag is off or the FO does not exist.
Fulfillability: each line carries fulfillable_quantity and unfulfillable_quantity, computed against the FulfillmentOrder's own (intent) warehouse — not the SalesOrderLine's warehouse_id. The warehouse block's tracks_inventory flag is false for externally-managed warehouses (Amazon FBA/AWD). The sibling channel_fulfilled flag answers a different question — whether the sales channel ships THIS ORDER from its own fulfillment centre: a native Amazon order at an FBA warehouse, or any order at AWD / Walmart WFS / Fulfilled-by-Faire. It is an order-level answer, not a warehouse-type one — a Walmart or Shopify order routed to an FBA warehouse is an Amazon Multi-Channel Fulfillment order that SKU.io submits itself, so it reads false there and keeps its submit / cancel / move actions. The two can disagree: Fulfilled-by-Faire stock is counted in SKU.io (tracks_inventory true) but shipped by Faire (channel_fulfilled true), and an order routed to such a warehouse cannot be dispatched through the API.
Line field executed_quantity (per FO line): the physically-executed quantity — the sum of non-voided child SalesOrderFulfillmentLine quantities. Distinct from the accounting figure quantity - remaining_quantity; when the two disagree the line carries a masked shortfall (e.g. a bundle line grown to its component quantity with remaining_quantity = 0 though fewer component units actually shipped).
provider_order_link (object|null): INTERNAL cross-link to this FO's registered shipping-provider order detail page inside SKU — { link_reference, link_type_label, link_id, link_route }. Distinct from the EXTERNAL provider_order_url. Populated for providers with an in-app per-order page (ShipStation, ShipHero, Starshipit, Trackstar, VeraCore, Shipfusion); null for providers with no detail page (ShipMyOrders), for pre-submit FOs, and for FBA/Manual FOs with no provider order. link_route is a application UI path, e.g. /integrations/shipstation/4/orders/92532.
Line field sales_order_fulfillment_lines (per FO line): the child SalesOrderFulfillmentLine (execution) records for this FOL — a debug aid so support can trace SOL → FOL → SOFL on any line. Each entry is { id, sales_order_fulfillment_id, voided }; voided reflects the parent SalesOrderFulfillment's voided_at (a voided SOFL can pin its FOL at quantity 0). Empty array until the FO is submitted into a carrier shipment. Example populated value: [{ "id": 1194390, "sales_order_fulfillment_id": 685484, "voided": false }].
ShipBob submit pre-flight fields (present on every fulfillment order; null unless the order dispatches via ShipBob):
shipbob_fulfillment_center_mapped(bool|null) — true when the order's warehouse is mapped to a ShipBob fulfillment center.shipbob_integration_instance_id(int|null) — the ShipBob integration instance owning that mapped fulfillment center.has_shipping_address(bool|null) — true when the order resolves a shipping address with an ISO-2 country code (required to ship with ShipBob).
Serial fields. Each line's product includes tracks_serials (boolean) and serial_generation_mode (none, manual or auto); with serials on the line, that tells a client which lines take serials on submit.
resolved_provider (object): which shipping provider this fulfillment order dispatches to, and why — { integration_instance_id, name, fulfillment_type, source, routing_rule_id }. source names the step that decided it, in precedence order: fba / wfs (Amazon FBA / Walmart WFS warehouse), pickup (Click & Collect method), dispatched (the order has been submitted — the provider it was actually sent to wins over any override, routing rule or default configured since), override (per-order provider override), force_manual (per-order Manual override), routing_rule (the warehouse's shipping-method routing rule — routing_rule_id identifies it; see /api/warehouses/{warehouse}/provider-routing-rules), warehouse_default (the warehouse's default provider), or manual_backstop (nothing configured — ships Manually). integration_instance_id is null for Manual, FBA, WFS and pickup. When a routing rule decides the provider, effective_fulfillment_provider and effective_integration_instance_name reflect the rule too.
pinnacle_order (object, present only when the fulfillment order has a registered Pinnacle (Metro White Glove) delivery order): a delivery-status summary — id, integration_instance_id, tracking_number, pon, reference, status (registered, pickup_scheduled, picked_up, at_hub, scheduled, delivered, cancelled, closed, exception, registration_failed), status_label, status_color, delivery_type (e.g. WG-RESI) and delivery_type_label, last_event_code, last_event_label, last_event_at, scheduled_delivery_at, actual_delivery_at, has_exception, cancel_refusal_code, cancel_refusal_label, registration_error, shipped_event_code / shipped_at / sales_order_fulfillment_id (the tracking event that marked the order shipped, and the resulting fulfillment — null until shipped), link_route (the in-app Pinnacle order page path), can_download_documents (whether the order's labels and bill of lading can be re-downloaded through the Pinnacle order label and bill-of-lading download endpoints) and documents_unavailable_reason (why not — the order was never registered with Pinnacle, or Pinnacle cancelled or closed it; null when available), and recent_events (the 5 most recent tracking events, newest first: { id, event_id, event_code, label, description, location, occurred_at, is_exception }). Omitted for fulfillment orders with no Pinnacle order.
pinnacle_delivery_type ({code, label} or null): when the order resolves to Pinnacle, the delivery type that dispatch will send — the shipping method's mapped type, else the connection's default. Null for other providers or when no type can be resolved.
Each line includes requires_pallet_delivery (bool): the buyer chose pallet (freight/LTL) delivery for that line, so it should ship by freight, not parcel.
Provider warning: provider_warning (string, nullable) is a persistent, operator-facing warning from the shipping provider that SKU.io cannot resolve on its own — e.g. ShipBob only partly honoured a cancellation and names shipments that may still ship. Null for almost every FO; the FO detail page and the sales order's fulfillment cards show it as a warning banner.
Required permission: fulfillment_orders.index (Fulfillment Orders → View). A token also needs its orders scope.
Request
Responses
- 200
- 401
- 403
- 404
- 429
OK
Response Headers
Unauthenticated — the bearer token is missing, revoked, expired, or malformed. Never retry automatically; fix the credential. See the Errors guide.
Forbidden
Response Headers
Not found — no record with the given identifier (or the route does not exist). Verify the ID before retrying.
Rate limited — platform limit is 1,000 requests/min; individual tokens may carry lower limits. Honor the Retry-After header before retrying. See the Rate Limits guide.