API Docs

Shipments

scope: shipments

Shipments represent the movement of goods in and out of warehouses. This page covers the shared read endpoints that work across all shipment types. For creating and managing specific shipment types, see Pick & Pack and Small Parcel (SPD).

When is inventory deducted?

Pick & Pack

Opens cartons, picks individual units, repacks. Per-unit labor fees.

submitpendingforwarded ← deducted

SPD

Ships full cartons as-is. No opening or repacking.

submit ← deductedpendingforwarded

Endpoints

GET
/v0/shipments

List all shipments (paginated, filterable by status and type)

GET
/v0/shipments/:shipmentId

Get full details of a single shipment

Shipment Types

Every shipment has a type that determines its workflow, required fields, and available operations.

Outbound

outbound-pickpackDocs →

Customer orders — warehouse opens cartons, picks individual units, repacks and ships to a customer address. Incurs per-unit labor fees.

outbound-spdDocs →

Small parcel delivery — ships full cartons as-is (no opening or repacking). Attach shipping labels and ship to Amazon FBA or similar.

outbound-ltl

Less-than-truckload outbound freight shipments.

Inbound

inbound-container

Receiving shipping containers into the warehouse.

inbound-spd

Small parcel inbound deliveries.

inbound-ltl

Less-than-truckload inbound freight shipments.

Status Lifecycle

All shipment types follow the same status progression. The API exposes normalized status names regardless of the internal representation.

Outbound (SPD, Pick & Pack, LTL)

draftpendingprocessingforwarded

Inbound (Container, SPD, LTL)

draftpendingconfirmedprocessingreceived

Cancellation & Rejection

pendingpending_cancelcancelled
pendingrejected(inbound only)
StatusDescriptionMutable?
draftInitial state. Items, labels, notes, and addresses can be modified.Yes
pendingSubmitted and awaiting warehouse action. For outbound SPD, inventory is deducted at this stage.No
confirmedInbound only. The warehouse has approved the inbound shipment and is ready to receive it.No
processingWarehouse is actively working on the shipment (picking, packing, labeling, or receiving).No
receivedInbound only. Goods have been received into the warehouse. Terminal state.No
forwardedOutbound only. Shipped out. Terminal state. For Pick & Pack, inventory is deducted at this stage.No
rejectedInbound only. The warehouse has rejected the inbound shipment. Terminal state.No
pending_cancelCancellation requested. Waiting for warehouse confirmation.No
cancelledCancelled by the warehouse. Inventory restored if applicable. Terminal state.No

Draft is the only mutable state

Once a shipment is submitted (moves past draft), its items, labels, and configuration can no longer be changed. Make sure everything is correct before submitting.

List Shipments

Returns a paginated list of all shipments across all types for your organization. Use the query parameters to filter by status or type.

Query Parameters

ParameterTypeDescription
statusenumFilter by status: draft, pending, confirmed, processing, received, forwarded, rejected, pending_cancel, cancelled
typeenumFilter by type: outbound-pickpack, outbound-spd, outbound-ltl, inbound-container, inbound-spd, inbound-ltl
skipnumberNumber of records to skip (default: 0)
takenumberNumber of records to return (default: 10, max: 50)
curl
curl "https://api.3plguys.com/v0/shipments?type=outbound-spd&status=pending" \
-H "Authorization: Bearer <token>"
Node.js
const res = await fetch(
"https://api.3plguys.com/v0/shipments?type=outbound-spd&status=pending",
{ headers: { Authorization: `Bearer ${token}` } }
);
const shipments = await res.json();
Python
res = httpx.get(
"https://api.3plguys.com/v0/shipments",
params={"type": "outbound-spd", "status": "pending"},
headers={"Authorization": f"Bearer {token}"},
)
shipments = res.json()
Response
[
{
"id": "22",
"status": "pending",
"type": "outbound-spd",
"warehouse": {
"id": "1",
"name": "Main Warehouse"
},
"notes": "FBA shipment for Q1 restock",
"cartons": [
{
"id": "1",
"name": "10-Pack Case",
"quantity": 5,
"contents": [
{
"productId": "1",
"sku": "ABC123",
"productName": "Egg Shells",
"quantity": 10
}
]
}
],
"totalCartonQuantity": 5,
"totalProductQuantity": 50,
"invoiceId": null,
"workflowId": null,
"createdAt": "2026-02-26T13:22:08.514Z",
"updatedAt": "2026-02-26T13:22:22.000Z"
}
]

Get Shipment

Retrieve the full details of a single shipment by its ID. Returns 404 if the shipment does not exist or belongs to another organization.

GET /v0/shipments/22
{
"id": "22",
"status": "pending",
"type": "outbound-spd",
"warehouse": {
"id": "1",
"name": "Main Warehouse"
},
"notes": "FBA shipment for Q1 restock",
"cartons": [
{
"id": "1",
"name": "10-Pack Case",
"quantity": 5,
"contents": [
{
"productId": "1",
"sku": "ABC123",
"productName": "Egg Shells",
"quantity": 10
}
]
},
{
"id": "2",
"name": "24-Pack Case",
"quantity": 3,
"contents": [
{
"productId": "1",
"sku": "ABC123",
"productName": "Egg Shells",
"quantity": 24
}
]
}
],
"totalCartonQuantity": 8,
"totalProductQuantity": 122,
"invoiceId": "5",
"workflowId": null,
"createdAt": "2026-02-26T13:22:08.514Z",
"updatedAt": "2026-02-26T13:22:22.000Z"
}

Response Fields

ParameterTypeDescription
id*stringUnique shipment ID
status*enumCurrent status (see lifecycle above)
type*enumShipment type (see types above)
warehouse*objectThe warehouse handling this shipment
warehouse.id*stringWarehouse ID
warehouse.name*stringWarehouse name
notesstringFree-text notes attached to the shipment
cartonsarrayCartons included in this shipment (may be empty for drafts)
cartons[].idstringCarton type ID
cartons[].namestringCarton type name
cartons[].quantitynumberNumber of cartons of this type
cartons[].contentsarrayProducts inside this carton type
cartons[].contents[].productIdstringProduct ID
cartons[].contents[].skustringProduct SKU
cartons[].contents[].productNamestringProduct name
cartons[].contents[].quantitynumberUnits of this product per carton
totalCartonQuantitynumberTotal number of cartons across all carton types
totalProductQuantitynumberTotal number of product units across all cartons
invoiceIdstring | nullInvoice ID if the shipment has been invoiced, null otherwise
workflowIdstring | nullWorkflow ID linking grouped shipments, null if not part of a workflow
createdAt*ISO 8601Timestamp when the shipment was created
updatedAt*ISO 8601Timestamp of the last update

Error Responses

404Shipment not found

The shipment ID does not exist or does not belong to your organization.

Creating Shipments

The endpoints above are read-only. To create and manage shipments, use the type-specific endpoints: