Internal Shipments
Transfers move stock between Fulfil-managed warehouses. Outbound transfers leave the 3PL's warehouse; inbound transfers arrive at it. The two flows have symmetric endpoints — the 3PL acknowledges what it will do, then reports completion (shipped or received).
Outbound transfers 🔗
List 🔗
1
GET /v1/outbound-transfers.json
Query parameters
| Name | Type | Description |
|---|---|---|
status |
string | pending (default), open, done |
page |
integer | 1-indexed page number (100 records per page) |
ids |
string | Comma-separated internal ids |
numbers |
string | Comma-separated transfer numbers |
planned_date_min |
date | Lower bound on planned_date |
planned_date_max |
date | Upper bound on planned_date |
updated_at_min |
datetime | Lower bound on last modification time |
updated_at_max |
datetime | Upper bound on last modification time |
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"data": [
{
"id": 40012,
"number": "OT-40012",
"company_code": "ACME",
"warehouse": { "id": 3, "code": "LAX", "name": "Los Angeles" },
"planned_date": "2026-06-22",
"delivery_address": {
"address1": "500 Warehouse Way",
"city": "Dallas",
"zip": "75201",
"country_code": "US",
"subdivision_code": "TX"
},
"carrier_code": "fedex",
"service_code": "ground",
"reference": "IT-INT-42",
"lines": [
{
"id": 7001,
"product": { "code": "SKU-100", "name": "Widget" },
"quantity": 50,
"uom": "u",
"customs_value": null,
"currency": "USD"
}
],
"request_confirmation": false,
"shipping_instructions": null
}
],
"has_more": false
}
Count 🔗
1
GET /v1/outbound-transfers/count.json
Returns {"count": <n>}.
Acknowledge 🔗
1
PUT /v1/outbound-transfers/acknowledge.json
Acknowledge that the 3PL is committed to shipping the transfer. This endpoint
fails fast: if any item has a problem, the whole request returns 400
and no transfers are acknowledged.
Request body
1
{ "shipments": [{ "id": 40012 }] }
Response
1
2
3
4
5
{
"shipments": [
{ "id": 40012, "acknowledged_at": "2026-06-17T18:33:00+00:00" }
]
}
Mark shipped 🔗
1
PUT /v1/outbound-transfers/ship.json
Mark transfers as shipped, attaching carrier, service, and tracking. Fails fast on any item error.
Request body
1
2
3
4
5
6
7
8
9
10
{
"shipments": [
{
"id": 40012,
"carrier": "fedex",
"carrier_service": "ground",
"tracking_number": "774899999999"
}
]
}
Response
1
2
3
4
5
{
"shipments": [
{ "id": 40012, "shipped_at": "2026-06-17T20:00:00+00:00" }
]
}
Inbound transfers 🔗
List 🔗
1
GET /v1/inbound-transfers.json
Query parameters
| Name | Type | Description |
|---|---|---|
status |
string | all (default — done + shipped), pending, open |
page |
integer | 1-indexed page number (100 records per page) |
ids |
string | Comma-separated internal ids |
numbers |
string | Comma-separated transfer numbers |
planned_date_min |
date | Lower bound on planned_date |
planned_date_max |
date | Upper bound on planned_date |
At least one query parameter is required — a bare request returns 400.
Status meanings
pending— shipped by the sending warehouse, not yet acknowledged by the receiving 3PLopen— acknowledged, still being receivedall(default) — bothdoneandshippedtransfers
Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"data": [
{
"id": 40098,
"number": "IT-40098",
"company_code": "ACME",
"warehouse": { "id": 3, "code": "LAX", "name": "Los Angeles" },
"planned_date": "2026-06-22",
"from_address": {
"address1": "1 Origin Rd",
"city": "Dallas",
"zip": "75201",
"country_code": "US",
"subdivision_code": "TX"
},
"carrier_code": "fedex",
"service_code": "ground",
"reference": "IT-INT-42",
"lines": [
{
"id": 7101,
"product": { "code": "SKU-100", "name": "Widget" },
"quantity": 50,
"uom": "u",
"lot": null,
"outbound_allocations": []
}
],
"shipping_instructions": null,
"packages": []
}
],
"has_more": false
}
Count 🔗
1
GET /v1/inbound-transfers/count.json
Returns {"count": <n>}.
Acknowledge 🔗
1
PUT /v1/inbound-transfers/acknowledge.json
Acknowledge that the receiving 3PL will process the inbound transfer. The
transfer must be in the shipped state and not already acknowledged. Fails
fast on any item error.
Request body
1
{ "shipments": [{ "id": 40098 }] }
Response
1
2
3
4
5
{
"shipments": [
{ "id": 40098, "acknowledged_at": "2026-06-17T18:33:00+00:00" }
]
}
Receive 🔗
1
PUT /v1/inbound-transfers/receive.json
Mark inbound transfers as received and post per-SKU quantities.
Request body
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"shipments": [
{
"id": 40098,
"tpl_reference": "WH-RCPT-3344",
"lines": [
{
"sku": "SKU-100",
"received_quantity": 50,
"lot_number": "LOT-B",
"effective_date": "2026-06-22"
}
]
}
]
}
Line fields
| Field | Type | Notes |
|---|---|---|
sku |
string | Required |
received_quantity |
number | At least one of received_quantity or damaged_quantity is required. Legacy quantity accepted as alias. |
damaged_quantity |
number | See above |
lot_number |
string | Required for lot-tracked SKUs |
effective_date |
date | Optional receipt date |
tpl_reference |
string | Optional per-line 3PL reference |
Response
1
2
3
4
5
{
"shipments": [
{ "id": 40098, "state": "done" }
]
}
Fails fast on any item error.