Fulfil Docs

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 🔗

Text
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

JSON
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 🔗

Text
1
GET /v1/outbound-transfers/count.json

Returns {"count": <n>}.

Acknowledge 🔗

Text
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

JSON
1
{ "shipments": [{ "id": 40012 }] }

Response

JSON
1
2
3
4
5
{
  "shipments": [
    { "id": 40012, "acknowledged_at": "2026-06-17T18:33:00+00:00" }
  ]
}

Mark shipped 🔗

Text
1
PUT /v1/outbound-transfers/ship.json

Mark transfers as shipped, attaching carrier, service, and tracking. Fails fast on any item error.

Request body

JSON
1
2
3
4
5
6
7
8
9
10
{
  "shipments": [
    {
      "id": 40012,
      "carrier": "fedex",
      "carrier_service": "ground",
      "tracking_number": "774899999999"
    }
  ]
}

Response

JSON
1
2
3
4
5
{
  "shipments": [
    { "id": 40012, "shipped_at": "2026-06-17T20:00:00+00:00" }
  ]
}

Inbound transfers 🔗

List 🔗

Text
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 3PL
  • open — acknowledged, still being received
  • all (default) — both done and shipped transfers

Response

JSON
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 🔗

Text
1
GET /v1/inbound-transfers/count.json

Returns {"count": <n>}.

Acknowledge 🔗

Text
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

JSON
1
{ "shipments": [{ "id": 40098 }] }

Response

JSON
1
2
3
4
5
{
  "shipments": [
    { "id": 40098, "acknowledged_at": "2026-06-17T18:33:00+00:00" }
  ]
}

Receive 🔗

Text
1
PUT /v1/inbound-transfers/receive.json

Mark inbound transfers as received and post per-SKU quantities.

Request body

JSON
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

JSON
1
2
3
4
5
{
  "shipments": [
    { "id": 40098, "state": "done" }
  ]
}

Fails fast on any item error.