# Order Shipment Reconciliation (`h_murdock/order-shipment-reconciliation`) Actor

Reconcile supplied order lines and split shipment exports. Flag remaining units, over-shipments, cancelled quantities, duplicates, orphans and ambiguous matches. JSON, CSV and HTML reports.

- **URL**: https://apify.com/h\_murdock/order-shipment-reconciliation.md
- **Developed by:** [Gilad Ronen](https://apify.com/h_murdock) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.25 / completed report

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Order Shipment Reconciliation do?

**Reconcile order-line quantities against supplied shipment records**, including split dispatches from multiple warehouses. Upload CSV text or JSON arrays and receive an evidence report showing remaining units, over-shipments, cancellation overlap, duplicate shipment lines, orphan references and ambiguous matches.

This is a read-only report for an operations handoff. It uses your supplied data and does not connect to stores, carriers or warehouse accounts, change fulfillment status, or send customer messages. Use it through [Apify](https://apify.com), its API, or a saved task when you have a new comparable snapshot.

### Why use a shipment reconciliation report?

A line ordered for ten units may be dispatched as four units from warehouse A and six from warehouse B. Both records should count once. A repeated export row must not create another shipment. The report retains source references so a reviewer can trace a quantity back to the original data records and resolve exceptions with the warehouse team.

The included sample has seven order lines and nine shipment rows. It counts five shipment rows totaling nineteen units, isolates four rows, and reports ten remaining units, one over-shipped unit and one unit of inferred cancellation overlap. Remaining totals can include incomplete lines; review their `accountingComplete` field before acting.

### How to use it

1. Export complete comparable order lines and shipment lines. Supply cumulative shipments for each order snapshot, including prior split dispatches where applicable. A daily-only shipment file compared with lifetime orders would overstate remaining quantities.
2. Remove names, addresses, payment details and other unnecessary columns. Preserve identifiers as text, including leading zeros.
3. Enter exactly one of `orders` or `ordersCsv`, and exactly one of `shipments` or `shipmentsCsv`. An empty JSON shipment array is valid.
4. Map differing column names with `orderMapping` and `shipmentMapping`, then run the Actor.
5. Review isolated shipment rows first. Download the JSON, flat CSV or standalone HTML report from the Output tab.

### Input and matching rules

See the Input tab for all settings. `examples/input.json` is a worked two-warehouse sample and `examples/csv-input.json` demonstrates column mapping. A mapping reads from the named source column: `{"orderId":"Order Number","orderedQty":"Quantity"}`. Mapping applies to JSON keys as well as CSV headers. Unmapped canonical fields retain their default names. Additional scalar source columns are ignored and omitted from the report; they remain part of your stored Actor input.

Order fields are `orderId`, `lineId`, optional `sku`, explicit `orderedQty`, explicit `cancelledQty`, and optional `dueAt`. Shipment fields are `shipmentId`, `shipmentLineId`, `orderId`, `lineId`, optional `sku`, explicit `shippedQty`, optional `shipmentNamespace`, and optional informational `warehouseId`.

Identifiers must be strings, no more than 128 characters, without surrounding whitespace or control characters. They are case-sensitive and never trimmed, numerically converted or filled from another row. Missing identity fields appear as report findings. Quantities must be nonnegative safe integers, supplied as JSON numbers or plain digit strings; no decimals, grouping commas, signs or units. Cancellation cannot exceed ordered quantity. Use the same base unit on both sides: the Actor performs no carton-to-piece conversion.

Exact `orderId + lineId` is the default join. With `allowSkuFallback:true`, a shipment **without** a line ID may use exact `orderId + sku`, only when that pair identifies exactly one supplied order row. A supplied unknown line ID never falls back to SKU. Conflicting supplied SKUs, duplicate order identities and ambiguous fallback matches are isolated. No fuzzy matching or proportional allocation occurs.

Duplicate shipment identity is `shipmentNamespace + shipmentId + shipmentLineId`. Every occurrence of a repeated key is excluded, even identical copies. The default namespace is an empty shared namespace. Use explicit stable namespaces for genuinely independent 3PL systems that reuse shipment IDs; use the same namespace for repeat exports from one system. `warehouseId` is evidence only and does not establish an independent shipment identity. Do not change namespaces merely to make a duplicate pass.

UTF-8 comma-delimited CSV supports BOMs, quoted commas and quoted multiline fields. Duplicate or blank headers, irregular record lengths and malformed quoting fail the run. Blank lines are skipped. Source references count data records, beginning at one and excluding the header. Shopify exports can have blank continuation cells, according to [Shopify's export documentation](https://help.shopify.com/en/manual/fulfillment/managing-orders/exporting-orders); prepare explicit stable keys before submitting them. Order status and generic fulfillment-status fields are never used to infer shipped quantities.

### Quantity and date interpretation

For each valid order identity, expected quantity is `orderedQty - cancelledQty`. Counted shipments are summed, remaining is `max(expected - shipped, 0)`, and over-shipped quantity is `max(shipped - expected, 0)`. `cancelledShippedQty` is `min(cancelledQty, overShippedQty)`: inferred quantity overlap, **not evidence that shipping happened after cancellation**. Cancellation chronology is unavailable.

Any isolated shipment carrying an order ID marks all reconciled lines on that order incomplete, conservatively. Other allocatable shipments still count. Duplicate or missing order identities have null remaining/over quantities and are excluded from those totals. An orphan with an unknown order ID cannot establish which existing order is affected.

Optional `asOf` is an explicit snapshot comparison time. `dueAt` requires it. Both require a valid ISO timestamp with seconds and `Z` or a numeric offset, for example `2026-09-28T18:00:00+03:00`. A line is flagged `overdue` only if it has positive remaining quantity and its due time is strictly before `asOf`. Equality is not overdue. The Actor does not filter shipments by date or read the current clock: you must supply the snapshot appropriate to `asOf`. The flag describes unaccounted quantity at a supplied deadline, not carrier lateness or delivery failure.

### Output

The default dataset contains **one complete report**, with `summary` and a `rows` array covering every order and shipment record. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. For a flat table, use the dedicated `reconciliation.csv` download; it contains one evidence row per source record.

| Field | Meaning |
|---|---|
| `rowId`, `sourceRef` | Stable input-position reference such as `orders:1` |
| `kind`, `status`, `severity` | Order or shipment evidence and review priority |
| `shippedQty` | Counted total on order rows; submitted quantity on shipment rows, including isolated ones |
| `remainingQty`, `overShippedQty` | Difference from non-cancelled entitlement; null for unreconciled orders |
| `cancelledShippedQty` | Inferred overlap with cancelled units; chronology unknown |
| `accountingComplete` | Whether supplied evidence was fully allocatable for that row/order |
| `issues`, `reason` | Explicit finding codes and explanation |
| `matchedOrderRef`, `shipmentRefs` | Traceable links between counted records |

Full JSON is saved as `OUTPUT`; downloads are `reconciliation.csv` and `report.html`. HTML has no scripts or external resources. CSV cells that could be interpreted as formulas receive a leading apostrophe. Import identifier columns as text in spreadsheet software to preserve zeros; full JSON retains original identifiers exactly.

### Price and limits

The listed price is **$0.25 per completed report**, with platform usage included and one `report-completed` event. There is no separate startup or dataset-row charge. Each new run is billable again. Insufficient event budget, invalid input, arithmetic overflow or oversized exports stop before the report event is charged.

Limits are 10,000 combined order and shipment rows and 4 MB of encoded JSON input. JSON output must stay below 8 MB, and every download below 9 MB; unusually long identifiers or escaping can require a smaller batch. Do not split shipments for the same order across runs unless you also provide the necessary cumulative records for each comparison.

The complete dataset report is delivered before charging. Convenience file writes follow. If export writing is interrupted, the charged dataset report remains the primary deliverable. Resurrecting that same run verifies the saved result and repairs exports without a second event. A charged run whose dataset was deleted cannot recover automatically. No claim of atomic billing and storage across all platform failures is made.

### Make, n8n and privacy

In Make's HTTP module or n8n's HTTP Request node, POST your input object to `https://api.apify.com/v2/acts/ACTOR_ID/runs`, using your own Apify authentication configuration. Poll the returned run ID until it succeeds, then read `/v2/datasets/DATASET_ID/items` or the output store records. Keep credentials in the automation platform's secret store. This recipe does not require a store token and does not send messages.

Only submit exports you are authorized to process. Input and results are held in your Apify run storage under your account's retention settings; the Actor does not delete them automatically. It does not log raw rows or need personal customer details. No tracking truth, delivery proof, returns, refunds, reservation changes, fractional units, cancellation history or operational write-back is supported. A balanced report means the supplied quantities balance, not that goods arrived. Report reproducible problems through the Issues tab, using synthetic examples without customer information.

# Actor input Schema

## `orders` (type: `array`):

JSON data records. Supply exactly one of orders and ordersCsv. Identifiers must be strings; quantities explicit nonnegative integers.

## `ordersCsv` (type: `string`):

Alternative UTF-8 comma-delimited CSV text; duplicate headers and irregular records are rejected.

## `shipments` (type: `array`):

JSON data records. Supply exactly one of shipments and shipmentsCsv. Identifiers must be strings; quantities explicit nonnegative integers.

## `shipmentsCsv` (type: `string`):

Alternative UTF-8 comma-delimited CSV text; duplicate headers and irregular records are rejected.

## `orderMapping` (type: `object`):

Canonical fields to exact source headers: orderId, lineId, sku, orderedQty, cancelledQty, dueAt.

## `shipmentMapping` (type: `object`):

Canonical fields to exact source headers: shipmentNamespace, shipmentId, shipmentLineId, orderId, lineId, sku, shippedQty, warehouseId.

## `allowSkuFallback` (type: `boolean`):

Only used when shipment lineId is missing; exact order and SKU must identify one order row.

## `asOf` (type: `string`):

ISO timestamp with Z or explicit offset. Required with dueAt. Used only for comparing remaining quantity with dueAt; supplied records are assumed to describe this snapshot.

## Actor input object example

```json
{
  "orders": [
    {
      "orderId": "0001",
      "lineId": "01",
      "sku": "MUG",
      "orderedQty": 10,
      "cancelledQty": 0
    },
    {
      "orderId": "0002",
      "lineId": "01",
      "sku": "BOWL",
      "orderedQty": 6,
      "cancelledQty": 2
    },
    {
      "orderId": "0003",
      "lineId": "01",
      "sku": "PLATE",
      "orderedQty": 5,
      "cancelledQty": 0,
      "dueAt": "2026-09-28T12:00:00Z"
    },
    {
      "orderId": "0004",
      "lineId": "01",
      "sku": "FORK",
      "orderedQty": 3,
      "cancelledQty": 0
    },
    {
      "orderId": "0005",
      "lineId": "01",
      "sku": "SPOON",
      "orderedQty": 2,
      "cancelledQty": 0
    },
    {
      "orderId": "0005",
      "lineId": "02",
      "sku": "SPOON",
      "orderedQty": 2,
      "cancelledQty": 0
    },
    {
      "orderId": "0006",
      "lineId": "01",
      "sku": "CUP",
      "orderedQty": 2,
      "cancelledQty": 0
    }
  ],
  "shipments": [
    {
      "shipmentId": "WH-A-001",
      "shipmentLineId": "01",
      "orderId": "0001",
      "lineId": "01",
      "sku": "MUG",
      "shippedQty": 4,
      "warehouseId": "A"
    },
    {
      "shipmentId": "WH-B-001",
      "shipmentLineId": "01",
      "orderId": "0001",
      "lineId": "01",
      "sku": "MUG",
      "shippedQty": 6,
      "warehouseId": "B"
    },
    {
      "shipmentId": "WH-A-002",
      "shipmentLineId": "01",
      "orderId": "0002",
      "lineId": "01",
      "shippedQty": 5,
      "warehouseId": "A"
    },
    {
      "shipmentId": "WH-B-003",
      "shipmentLineId": "01",
      "orderId": "0003",
      "lineId": "01",
      "shippedQty": 2,
      "warehouseId": "B"
    },
    {
      "shipmentId": "WH-A-004",
      "shipmentLineId": "01",
      "orderId": "0004",
      "lineId": "01",
      "shippedQty": 3,
      "warehouseId": "A"
    },
    {
      "shipmentId": "WH-A-004",
      "shipmentLineId": "01",
      "orderId": "0004",
      "lineId": "01",
      "shippedQty": 3,
      "warehouseId": "A"
    },
    {
      "shipmentId": "WH-B-005",
      "shipmentLineId": "01",
      "orderId": "MISSING",
      "lineId": "01",
      "shippedQty": 1,
      "warehouseId": "B"
    },
    {
      "shipmentId": "WH-A-006",
      "shipmentLineId": "01",
      "orderId": "0005",
      "sku": "SPOON",
      "shippedQty": 2,
      "warehouseId": "A"
    },
    {
      "shipmentId": "WH-B-007",
      "shipmentLineId": "01",
      "orderId": "0006",
      "sku": "CUP",
      "shippedQty": 2,
      "warehouseId": "B"
    }
  ],
  "orderMapping": {},
  "shipmentMapping": {},
  "allowSkuFallback": true,
  "asOf": "2026-09-28T18:00:00+03:00"
}
```

# Actor output Schema

## `dataset` (type: `string`):

One report item with summary and evidence rows; primary paid deliverable.

## `json` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `html` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "orders": [
        {
            "orderId": "0001",
            "lineId": "01",
            "sku": "MUG",
            "orderedQty": 10,
            "cancelledQty": 0
        },
        {
            "orderId": "0002",
            "lineId": "01",
            "sku": "BOWL",
            "orderedQty": 6,
            "cancelledQty": 2
        },
        {
            "orderId": "0003",
            "lineId": "01",
            "sku": "PLATE",
            "orderedQty": 5,
            "cancelledQty": 0,
            "dueAt": "2026-09-28T12:00:00Z"
        },
        {
            "orderId": "0004",
            "lineId": "01",
            "sku": "FORK",
            "orderedQty": 3,
            "cancelledQty": 0
        },
        {
            "orderId": "0005",
            "lineId": "01",
            "sku": "SPOON",
            "orderedQty": 2,
            "cancelledQty": 0
        },
        {
            "orderId": "0005",
            "lineId": "02",
            "sku": "SPOON",
            "orderedQty": 2,
            "cancelledQty": 0
        },
        {
            "orderId": "0006",
            "lineId": "01",
            "sku": "CUP",
            "orderedQty": 2,
            "cancelledQty": 0
        }
    ],
    "shipments": [
        {
            "shipmentId": "WH-A-001",
            "shipmentLineId": "01",
            "orderId": "0001",
            "lineId": "01",
            "sku": "MUG",
            "shippedQty": 4,
            "warehouseId": "A"
        },
        {
            "shipmentId": "WH-B-001",
            "shipmentLineId": "01",
            "orderId": "0001",
            "lineId": "01",
            "sku": "MUG",
            "shippedQty": 6,
            "warehouseId": "B"
        },
        {
            "shipmentId": "WH-A-002",
            "shipmentLineId": "01",
            "orderId": "0002",
            "lineId": "01",
            "shippedQty": 5,
            "warehouseId": "A"
        },
        {
            "shipmentId": "WH-B-003",
            "shipmentLineId": "01",
            "orderId": "0003",
            "lineId": "01",
            "shippedQty": 2,
            "warehouseId": "B"
        },
        {
            "shipmentId": "WH-A-004",
            "shipmentLineId": "01",
            "orderId": "0004",
            "lineId": "01",
            "shippedQty": 3,
            "warehouseId": "A"
        },
        {
            "shipmentId": "WH-A-004",
            "shipmentLineId": "01",
            "orderId": "0004",
            "lineId": "01",
            "shippedQty": 3,
            "warehouseId": "A"
        },
        {
            "shipmentId": "WH-B-005",
            "shipmentLineId": "01",
            "orderId": "MISSING",
            "lineId": "01",
            "shippedQty": 1,
            "warehouseId": "B"
        },
        {
            "shipmentId": "WH-A-006",
            "shipmentLineId": "01",
            "orderId": "0005",
            "sku": "SPOON",
            "shippedQty": 2,
            "warehouseId": "A"
        },
        {
            "shipmentId": "WH-B-007",
            "shipmentLineId": "01",
            "orderId": "0006",
            "sku": "CUP",
            "shippedQty": 2,
            "warehouseId": "B"
        }
    ],
    "allowSkuFallback": true,
    "asOf": "2026-09-28T18:00:00+03:00"
};

// Run the Actor and wait for it to finish
const run = await client.actor("h_murdock/order-shipment-reconciliation").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "orders": [
        {
            "orderId": "0001",
            "lineId": "01",
            "sku": "MUG",
            "orderedQty": 10,
            "cancelledQty": 0,
        },
        {
            "orderId": "0002",
            "lineId": "01",
            "sku": "BOWL",
            "orderedQty": 6,
            "cancelledQty": 2,
        },
        {
            "orderId": "0003",
            "lineId": "01",
            "sku": "PLATE",
            "orderedQty": 5,
            "cancelledQty": 0,
            "dueAt": "2026-09-28T12:00:00Z",
        },
        {
            "orderId": "0004",
            "lineId": "01",
            "sku": "FORK",
            "orderedQty": 3,
            "cancelledQty": 0,
        },
        {
            "orderId": "0005",
            "lineId": "01",
            "sku": "SPOON",
            "orderedQty": 2,
            "cancelledQty": 0,
        },
        {
            "orderId": "0005",
            "lineId": "02",
            "sku": "SPOON",
            "orderedQty": 2,
            "cancelledQty": 0,
        },
        {
            "orderId": "0006",
            "lineId": "01",
            "sku": "CUP",
            "orderedQty": 2,
            "cancelledQty": 0,
        },
    ],
    "shipments": [
        {
            "shipmentId": "WH-A-001",
            "shipmentLineId": "01",
            "orderId": "0001",
            "lineId": "01",
            "sku": "MUG",
            "shippedQty": 4,
            "warehouseId": "A",
        },
        {
            "shipmentId": "WH-B-001",
            "shipmentLineId": "01",
            "orderId": "0001",
            "lineId": "01",
            "sku": "MUG",
            "shippedQty": 6,
            "warehouseId": "B",
        },
        {
            "shipmentId": "WH-A-002",
            "shipmentLineId": "01",
            "orderId": "0002",
            "lineId": "01",
            "shippedQty": 5,
            "warehouseId": "A",
        },
        {
            "shipmentId": "WH-B-003",
            "shipmentLineId": "01",
            "orderId": "0003",
            "lineId": "01",
            "shippedQty": 2,
            "warehouseId": "B",
        },
        {
            "shipmentId": "WH-A-004",
            "shipmentLineId": "01",
            "orderId": "0004",
            "lineId": "01",
            "shippedQty": 3,
            "warehouseId": "A",
        },
        {
            "shipmentId": "WH-A-004",
            "shipmentLineId": "01",
            "orderId": "0004",
            "lineId": "01",
            "shippedQty": 3,
            "warehouseId": "A",
        },
        {
            "shipmentId": "WH-B-005",
            "shipmentLineId": "01",
            "orderId": "MISSING",
            "lineId": "01",
            "shippedQty": 1,
            "warehouseId": "B",
        },
        {
            "shipmentId": "WH-A-006",
            "shipmentLineId": "01",
            "orderId": "0005",
            "sku": "SPOON",
            "shippedQty": 2,
            "warehouseId": "A",
        },
        {
            "shipmentId": "WH-B-007",
            "shipmentLineId": "01",
            "orderId": "0006",
            "sku": "CUP",
            "shippedQty": 2,
            "warehouseId": "B",
        },
    ],
    "allowSkuFallback": True,
    "asOf": "2026-09-28T18:00:00+03:00",
}

# Run the Actor and wait for it to finish
run = client.actor("h_murdock/order-shipment-reconciliation").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "orders": [
    {
      "orderId": "0001",
      "lineId": "01",
      "sku": "MUG",
      "orderedQty": 10,
      "cancelledQty": 0
    },
    {
      "orderId": "0002",
      "lineId": "01",
      "sku": "BOWL",
      "orderedQty": 6,
      "cancelledQty": 2
    },
    {
      "orderId": "0003",
      "lineId": "01",
      "sku": "PLATE",
      "orderedQty": 5,
      "cancelledQty": 0,
      "dueAt": "2026-09-28T12:00:00Z"
    },
    {
      "orderId": "0004",
      "lineId": "01",
      "sku": "FORK",
      "orderedQty": 3,
      "cancelledQty": 0
    },
    {
      "orderId": "0005",
      "lineId": "01",
      "sku": "SPOON",
      "orderedQty": 2,
      "cancelledQty": 0
    },
    {
      "orderId": "0005",
      "lineId": "02",
      "sku": "SPOON",
      "orderedQty": 2,
      "cancelledQty": 0
    },
    {
      "orderId": "0006",
      "lineId": "01",
      "sku": "CUP",
      "orderedQty": 2,
      "cancelledQty": 0
    }
  ],
  "shipments": [
    {
      "shipmentId": "WH-A-001",
      "shipmentLineId": "01",
      "orderId": "0001",
      "lineId": "01",
      "sku": "MUG",
      "shippedQty": 4,
      "warehouseId": "A"
    },
    {
      "shipmentId": "WH-B-001",
      "shipmentLineId": "01",
      "orderId": "0001",
      "lineId": "01",
      "sku": "MUG",
      "shippedQty": 6,
      "warehouseId": "B"
    },
    {
      "shipmentId": "WH-A-002",
      "shipmentLineId": "01",
      "orderId": "0002",
      "lineId": "01",
      "shippedQty": 5,
      "warehouseId": "A"
    },
    {
      "shipmentId": "WH-B-003",
      "shipmentLineId": "01",
      "orderId": "0003",
      "lineId": "01",
      "shippedQty": 2,
      "warehouseId": "B"
    },
    {
      "shipmentId": "WH-A-004",
      "shipmentLineId": "01",
      "orderId": "0004",
      "lineId": "01",
      "shippedQty": 3,
      "warehouseId": "A"
    },
    {
      "shipmentId": "WH-A-004",
      "shipmentLineId": "01",
      "orderId": "0004",
      "lineId": "01",
      "shippedQty": 3,
      "warehouseId": "A"
    },
    {
      "shipmentId": "WH-B-005",
      "shipmentLineId": "01",
      "orderId": "MISSING",
      "lineId": "01",
      "shippedQty": 1,
      "warehouseId": "B"
    },
    {
      "shipmentId": "WH-A-006",
      "shipmentLineId": "01",
      "orderId": "0005",
      "sku": "SPOON",
      "shippedQty": 2,
      "warehouseId": "A"
    },
    {
      "shipmentId": "WH-B-007",
      "shipmentLineId": "01",
      "orderId": "0006",
      "sku": "CUP",
      "shippedQty": 2,
      "warehouseId": "B"
    }
  ],
  "allowSkuFallback": true,
  "asOf": "2026-09-28T18:00:00+03:00"
}' |
apify call h_murdock/order-shipment-reconciliation --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,h_murdock/order-shipment-reconciliation"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/UzPvq7hO94Q8Vbp40/builds/PpfCpv2MzctE0ADx2/openapi.json
