# Stock Transfer Batch Feasibility Evidence (`h_murdock/stock-transfer-plan-evidence`) Actor

Check proposed stock transfers against supplied snapshots, exact SKU/location/unit balances and reserve floors. Detect shared-source oversubscription, ordered prefix deficits, missing or duplicate stock evidence and unresolved transfer propagation. JSON or mapped CSV.

- **URL**: https://apify.com/h_murdock/stock-transfer-plan-evidence.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

## Stock Transfer Batch Feasibility Evidence

Review a proposed inventory-transfer batch before rekeying it or importing it into another system. This Actor checks supplied arithmetic across exact SKU, location and unit keys, keeps reserve floors explicit, and records why a transfer cannot be resolved. It accepts authorized snapshot and transfer exports as JSON arrays or mapped CSV. It does not connect to an ERP, reserve stock, approve a shipment or move inventory.

The report is useful when several outlets draw from the same source, when one proposed transfer is intended to fund a later transfer, or when exported snapshots contain missing, duplicate or mismatched records. One report covers the complete supplied batch. A successful Actor run means the evidence report was produced; it does not mean every proposed transfer is feasible.

### Choose the execution model

- **simultaneous-outbound:** All outgoing quantities for a source key are aggregated and compared with its starting available quantity minus reserve floor. Incoming stock cannot fund outgoing stock in this model. Two individually small transfers can both be flagged when their shared source is oversubscribed. Cycles cannot create starting stock.
- **ordered-immediate:** Transfers are evaluated in ascending, unique integer sequence. Each feasible leg immediately debits its source and credits its destination in the supplied model. An invalid, insufficient or unresolved leg makes both touched balances unknown. Later dependent legs remain unresolved; the Actor never assumes a failed movement was simply skipped. Unrelated stock keys can retain known evidence.

The model is your explicit assumption. Neither model establishes actual transaction timing, warehouse concurrency, reservations or physical availability.

### Input

Set `snapshotId`, `snapshotCoverage` (`complete` or `partial`) and `executionModel`. Coverage is a caller declaration; a missing stock key remains unknown even when you declare complete coverage.

Inventory rows contain `rowId`, `sku`, `locationId`, `unit`, `availableQuantity`, `reserveFloor` and `snapshotId`. Proposed transfer rows contain `rowId`, `sku`, `fromLocationId`, `toLocationId`, `unit`, `quantity` and `sequence`. Both models require unique integer sequences; only the ordered model uses them to update balances. Keep identifiers as exact strings: `001` differs from `1`, and units or case are never converted. Identifiers cannot have control characters or leading/trailing whitespace. Row IDs must be unique within each table. Duplicate current-snapshot stock keys are unresolved even when their quantities agree. Other-snapshot or other-unit records are retained as related evidence and never substituted.

Quantities are decimal strings with up to 18 integer digits and six decimal places, such as `0`, `12` or `0.125`. Use no commas, exponent notation, signs or leading zero padding. Transfer quantities must be positive. Invalid bounded quantity strings appear as findings; numeric JSON quantities and malformed row structures fail input validation. Arithmetic uses exact six-place decimal integers, without floating-point rounding. Values are never totaled across unlike SKUs or units.

For CSV, remove the corresponding array and supply nonempty `inventoryCsv` or `transfersCsv`. Canonical headers match the row fields above. Optional `inventoryColumns` and `transferColumns` map every field to a distinct header. BOMs and quoted cells are supported; missing, duplicate or extra headers and irregular rows are rejected. A header-only CSV is an explicit empty table. The total input limit is 4 MB and 2,000 combined inventory and transfer rows. Dense evidence can reach output limits sooner; split such batches.

### Reading the output

The default dataset has one complete report with retained inputs, `rows`, `balances`, `findings`, scope and summary. Transfer rows are `feasible`, `infeasible`, `unresolved` or `invalid`. A feasible row describes that leg's supplied arithmetic, not approval of the whole batch; check `reviewRequired` and all ending balances. Simultaneous ending balances at failed or uncertain legs are unknown because no actual execution subset is established. Ordered row balances describe that sequence prefix; the final balance table reflects later taint as well. Empty transfer input produces `no_transfers`, never a clean-stock conclusion.

Download full JSON, transfer evidence CSV, exact-key balances CSV, findings CSV and standalone HTML. Source references such as `inventory[0]` and `transfers[0]` point to the retained original zero-based positions. JSON retains exact identifiers. CSV neutralizes spreadsheet formulas; HTML escapes supplied text, has no scripts or external resources, and should be downloaded using the attachment link.

### Price, recovery and limits

The Store configuration is **$0.25 per completed report**, with platform usage included, charged once through `report-completed`. Invalid input, insufficient report budget or an oversized report produces no completed-report charge. Downloads are written before publication. Resurrecting a run verifies its saved report and input fingerprint, restores missing exports, and keeps one dataset item and one charge. A new run is a new billable report. Partial files left by an interrupted uncharged run can be overwritten on recovery; they are not a delivered report by themselves.

Use only authorized, opaque identifiers. Raw inputs and results are stored in Apify and can expose operational quantities; do not provide contact details or secrets. This tool makes no live-stock, demand-forecasting, optimization, unit-conversion, shipping, valuation, compliance or platform-import acceptance claim. It produces bounded supplied-data evidence for your review.

# Actor input Schema

## `snapshotId` (type: `string`):

Exact opaque snapshot ID used for all balances. Other-snapshot records are retained as evidence and never substituted. IDs are case-sensitive strings,1–160 characters, no controls or leading/trailing whitespace; leading zeros remain.

## `snapshotCoverage` (type: `string`):

Your declaration of snapshot coverage. Neither choice proves physical/live stock; missing exact keys remain unresolved even when complete is declared.

## `executionModel` (type: `string`):

simultaneous-outbound aggregates outgoing against starting stock minus reserve; inbound cannot fund outgoing. ordered-immediate uses unique explicit ascending sequences and immediate debit/credit. Failed/unknown legs taint both touched keys and later dependents. Neither model proves actual movement.

## `inventory` (type: `array`):

Rows: rowId,sku,locationId,unit,availableQuantity,reserveFloor,snapshotId. All IDs/units exact strings. Quantity strings: nonnegative canonical decimal with up to18 integer digits and6 decimal places (e.g.0,1.25), no separators/exponent/leading zero. Invalid bounded strings yield unresolved row evidence. Duplicate exact snapshot SKU/location/unit keys are unresolved even if values agree. Unique rowIds. Use array OR nonemptyinventoryCsv. TotalJSON<=4MB and2000 combined rows.

## `inventoryCsv` (type: `string`):

Remove inventory array when using nonemptyCSV. Canonical headers: rowId,sku,locationId,unit,availableQuantity,reserveFloor,snapshotId. BOM and quoted fields accepted; mapped headers must be unique and exact, extra columns/irregular rows rejected. Header-onlyCSV is explicit empty inventory; missing stock never becomes zero.

## `inventoryColumns` (type: `object`):

Optional exact mapping from each canonical inventory field to one distinct CSV header. All seven headers required. A canonical mapping is harmless with arrays; custom mapping requiresCSV.

## `transfers` (type: `array`):

Rows: unique rowId,sku,fromLocationId,toLocationId,unit,quantity decimal-string,sequence integer1–1000000000. quantity must be positive and use the inventory decimal format; invalid bounded strings are flagged and taint touched balances. Same-location transfer invalid. No unit conversions. Both models require unique sequences. Supply array OR nonemptytransfersCsv. Empty array produces no_transfers, no clean-stock conclusion. Output caps may require smaller batches.

## `transfersCsv` (type: `string`):

Remove transfers array when using nonemptyCSV. Canonical headers: rowId,sku,fromLocationId,toLocationId,unit,quantity,sequence. All seven headers required; sequence must be a canonical integer. BOM/quoted cells accepted, duplicate or extra headers and irregular rows rejected.

## `transferColumns` (type: `object`):

Optional mapping from every canonical transfer field to a distinct required CSV header. Custom mappings requireCSV. Exact identifiers retain case and leading zeros.

## Actor input object example

```json
{
  "snapshotId": "demo-2026-10-04",
  "snapshotCoverage": "partial",
  "executionModel": "simultaneous-outbound",
  "inventory": [
    {
      "rowId": "i-a",
      "sku": "001",
      "locationId": "A",
      "unit": "each",
      "availableQuantity": "10",
      "reserveFloor": "3",
      "snapshotId": "demo-2026-10-04"
    },
    {
      "rowId": "i-b",
      "sku": "001",
      "locationId": "B",
      "unit": "each",
      "availableQuantity": "0",
      "reserveFloor": "0",
      "snapshotId": "demo-2026-10-04"
    },
    {
      "rowId": "i-c",
      "sku": "001",
      "locationId": "C",
      "unit": "each",
      "availableQuantity": "0",
      "reserveFloor": "0",
      "snapshotId": "demo-2026-10-04"
    },
    {
      "rowId": "i-d",
      "sku": "002",
      "locationId": "D",
      "unit": "each",
      "availableQuantity": "7.25",
      "reserveFloor": "1",
      "snapshotId": "demo-2026-10-04"
    },
    {
      "rowId": "i-e",
      "sku": "002",
      "locationId": "E",
      "unit": "each",
      "availableQuantity": "0",
      "reserveFloor": "0",
      "snapshotId": "demo-2026-10-04"
    },
    {
      "rowId": "i-f-case",
      "sku": "003",
      "locationId": "F",
      "unit": "case",
      "availableQuantity": "15",
      "reserveFloor": "0",
      "snapshotId": "demo-2026-10-04"
    },
    {
      "rowId": "i-g",
      "sku": "003",
      "locationId": "G",
      "unit": "each",
      "availableQuantity": "0",
      "reserveFloor": "0",
      "snapshotId": "demo-2026-10-04"
    },
    {
      "rowId": "i-n",
      "sku": "004",
      "locationId": "N",
      "unit": "each",
      "availableQuantity": "0",
      "reserveFloor": "0",
      "snapshotId": "demo-2026-10-04"
    },
    {
      "rowId": "i-m-old",
      "sku": "004",
      "locationId": "M",
      "unit": "each",
      "availableQuantity": "99",
      "reserveFloor": "0",
      "snapshotId": "previous-snapshot"
    },
    {
      "rowId": "i-z",
      "sku": "005",
      "locationId": "Z",
      "unit": "kg",
      "availableQuantity": "4.5",
      "reserveFloor": "0.5",
      "snapshotId": "demo-2026-10-04"
    }
  ],
  "inventoryColumns": {
    "rowId": "rowId",
    "sku": "sku",
    "locationId": "locationId",
    "unit": "unit",
    "availableQuantity": "availableQuantity",
    "reserveFloor": "reserveFloor",
    "snapshotId": "snapshotId"
  },
  "transfers": [
    {
      "rowId": "t-shared-1",
      "sku": "001",
      "fromLocationId": "A",
      "toLocationId": "B",
      "unit": "each",
      "quantity": "4",
      "sequence": 1
    },
    {
      "rowId": "t-shared-2",
      "sku": "001",
      "fromLocationId": "A",
      "toLocationId": "C",
      "unit": "each",
      "quantity": "4",
      "sequence": 2
    },
    {
      "rowId": "t-valid",
      "sku": "002",
      "fromLocationId": "D",
      "toLocationId": "E",
      "unit": "each",
      "quantity": "2.125",
      "sequence": 3
    },
    {
      "rowId": "t-unit",
      "sku": "003",
      "fromLocationId": "F",
      "toLocationId": "G",
      "unit": "each",
      "quantity": "1",
      "sequence": 4
    },
    {
      "rowId": "t-missing",
      "sku": "004",
      "fromLocationId": "M",
      "toLocationId": "N",
      "unit": "each",
      "quantity": "2",
      "sequence": 5
    }
  ],
  "transferColumns": {
    "rowId": "rowId",
    "sku": "sku",
    "fromLocationId": "fromLocationId",
    "toLocationId": "toLocationId",
    "unit": "unit",
    "quantity": "quantity",
    "sequence": "sequence"
  }
}
```

# Actor output Schema

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

One complete report with transfer rows, exact-key balances, findings and retained inputs.

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

No description

## `evidence` (type: `string`):

No description

## `balances` (type: `string`):

No description

## `findings` (type: `string`):

No description

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

Escaped standalone document; download and open locally.

# 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 = {
    "snapshotId": "demo-2026-10-04",
    "snapshotCoverage": "partial",
    "executionModel": "simultaneous-outbound",
    "inventory": [
        {
            "rowId": "i-a",
            "sku": "001",
            "locationId": "A",
            "unit": "each",
            "availableQuantity": "10",
            "reserveFloor": "3",
            "snapshotId": "demo-2026-10-04"
        },
        {
            "rowId": "i-b",
            "sku": "001",
            "locationId": "B",
            "unit": "each",
            "availableQuantity": "0",
            "reserveFloor": "0",
            "snapshotId": "demo-2026-10-04"
        },
        {
            "rowId": "i-c",
            "sku": "001",
            "locationId": "C",
            "unit": "each",
            "availableQuantity": "0",
            "reserveFloor": "0",
            "snapshotId": "demo-2026-10-04"
        },
        {
            "rowId": "i-d",
            "sku": "002",
            "locationId": "D",
            "unit": "each",
            "availableQuantity": "7.25",
            "reserveFloor": "1",
            "snapshotId": "demo-2026-10-04"
        },
        {
            "rowId": "i-e",
            "sku": "002",
            "locationId": "E",
            "unit": "each",
            "availableQuantity": "0",
            "reserveFloor": "0",
            "snapshotId": "demo-2026-10-04"
        },
        {
            "rowId": "i-f-case",
            "sku": "003",
            "locationId": "F",
            "unit": "case",
            "availableQuantity": "15",
            "reserveFloor": "0",
            "snapshotId": "demo-2026-10-04"
        },
        {
            "rowId": "i-g",
            "sku": "003",
            "locationId": "G",
            "unit": "each",
            "availableQuantity": "0",
            "reserveFloor": "0",
            "snapshotId": "demo-2026-10-04"
        },
        {
            "rowId": "i-n",
            "sku": "004",
            "locationId": "N",
            "unit": "each",
            "availableQuantity": "0",
            "reserveFloor": "0",
            "snapshotId": "demo-2026-10-04"
        },
        {
            "rowId": "i-m-old",
            "sku": "004",
            "locationId": "M",
            "unit": "each",
            "availableQuantity": "99",
            "reserveFloor": "0",
            "snapshotId": "previous-snapshot"
        },
        {
            "rowId": "i-z",
            "sku": "005",
            "locationId": "Z",
            "unit": "kg",
            "availableQuantity": "4.5",
            "reserveFloor": "0.5",
            "snapshotId": "demo-2026-10-04"
        }
    ],
    "inventoryCsv": "",
    "inventoryColumns": {
        "rowId": "rowId",
        "sku": "sku",
        "locationId": "locationId",
        "unit": "unit",
        "availableQuantity": "availableQuantity",
        "reserveFloor": "reserveFloor",
        "snapshotId": "snapshotId"
    },
    "transfers": [
        {
            "rowId": "t-shared-1",
            "sku": "001",
            "fromLocationId": "A",
            "toLocationId": "B",
            "unit": "each",
            "quantity": "4",
            "sequence": 1
        },
        {
            "rowId": "t-shared-2",
            "sku": "001",
            "fromLocationId": "A",
            "toLocationId": "C",
            "unit": "each",
            "quantity": "4",
            "sequence": 2
        },
        {
            "rowId": "t-valid",
            "sku": "002",
            "fromLocationId": "D",
            "toLocationId": "E",
            "unit": "each",
            "quantity": "2.125",
            "sequence": 3
        },
        {
            "rowId": "t-unit",
            "sku": "003",
            "fromLocationId": "F",
            "toLocationId": "G",
            "unit": "each",
            "quantity": "1",
            "sequence": 4
        },
        {
            "rowId": "t-missing",
            "sku": "004",
            "fromLocationId": "M",
            "toLocationId": "N",
            "unit": "each",
            "quantity": "2",
            "sequence": 5
        }
    ],
    "transfersCsv": "",
    "transferColumns": {
        "rowId": "rowId",
        "sku": "sku",
        "fromLocationId": "fromLocationId",
        "toLocationId": "toLocationId",
        "unit": "unit",
        "quantity": "quantity",
        "sequence": "sequence"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("h_murdock/stock-transfer-plan-evidence").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 = {
    "snapshotId": "demo-2026-10-04",
    "snapshotCoverage": "partial",
    "executionModel": "simultaneous-outbound",
    "inventory": [
        {
            "rowId": "i-a",
            "sku": "001",
            "locationId": "A",
            "unit": "each",
            "availableQuantity": "10",
            "reserveFloor": "3",
            "snapshotId": "demo-2026-10-04",
        },
        {
            "rowId": "i-b",
            "sku": "001",
            "locationId": "B",
            "unit": "each",
            "availableQuantity": "0",
            "reserveFloor": "0",
            "snapshotId": "demo-2026-10-04",
        },
        {
            "rowId": "i-c",
            "sku": "001",
            "locationId": "C",
            "unit": "each",
            "availableQuantity": "0",
            "reserveFloor": "0",
            "snapshotId": "demo-2026-10-04",
        },
        {
            "rowId": "i-d",
            "sku": "002",
            "locationId": "D",
            "unit": "each",
            "availableQuantity": "7.25",
            "reserveFloor": "1",
            "snapshotId": "demo-2026-10-04",
        },
        {
            "rowId": "i-e",
            "sku": "002",
            "locationId": "E",
            "unit": "each",
            "availableQuantity": "0",
            "reserveFloor": "0",
            "snapshotId": "demo-2026-10-04",
        },
        {
            "rowId": "i-f-case",
            "sku": "003",
            "locationId": "F",
            "unit": "case",
            "availableQuantity": "15",
            "reserveFloor": "0",
            "snapshotId": "demo-2026-10-04",
        },
        {
            "rowId": "i-g",
            "sku": "003",
            "locationId": "G",
            "unit": "each",
            "availableQuantity": "0",
            "reserveFloor": "0",
            "snapshotId": "demo-2026-10-04",
        },
        {
            "rowId": "i-n",
            "sku": "004",
            "locationId": "N",
            "unit": "each",
            "availableQuantity": "0",
            "reserveFloor": "0",
            "snapshotId": "demo-2026-10-04",
        },
        {
            "rowId": "i-m-old",
            "sku": "004",
            "locationId": "M",
            "unit": "each",
            "availableQuantity": "99",
            "reserveFloor": "0",
            "snapshotId": "previous-snapshot",
        },
        {
            "rowId": "i-z",
            "sku": "005",
            "locationId": "Z",
            "unit": "kg",
            "availableQuantity": "4.5",
            "reserveFloor": "0.5",
            "snapshotId": "demo-2026-10-04",
        },
    ],
    "inventoryCsv": "",
    "inventoryColumns": {
        "rowId": "rowId",
        "sku": "sku",
        "locationId": "locationId",
        "unit": "unit",
        "availableQuantity": "availableQuantity",
        "reserveFloor": "reserveFloor",
        "snapshotId": "snapshotId",
    },
    "transfers": [
        {
            "rowId": "t-shared-1",
            "sku": "001",
            "fromLocationId": "A",
            "toLocationId": "B",
            "unit": "each",
            "quantity": "4",
            "sequence": 1,
        },
        {
            "rowId": "t-shared-2",
            "sku": "001",
            "fromLocationId": "A",
            "toLocationId": "C",
            "unit": "each",
            "quantity": "4",
            "sequence": 2,
        },
        {
            "rowId": "t-valid",
            "sku": "002",
            "fromLocationId": "D",
            "toLocationId": "E",
            "unit": "each",
            "quantity": "2.125",
            "sequence": 3,
        },
        {
            "rowId": "t-unit",
            "sku": "003",
            "fromLocationId": "F",
            "toLocationId": "G",
            "unit": "each",
            "quantity": "1",
            "sequence": 4,
        },
        {
            "rowId": "t-missing",
            "sku": "004",
            "fromLocationId": "M",
            "toLocationId": "N",
            "unit": "each",
            "quantity": "2",
            "sequence": 5,
        },
    ],
    "transfersCsv": "",
    "transferColumns": {
        "rowId": "rowId",
        "sku": "sku",
        "fromLocationId": "fromLocationId",
        "toLocationId": "toLocationId",
        "unit": "unit",
        "quantity": "quantity",
        "sequence": "sequence",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("h_murdock/stock-transfer-plan-evidence").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 '{
  "snapshotId": "demo-2026-10-04",
  "snapshotCoverage": "partial",
  "executionModel": "simultaneous-outbound",
  "inventory": [
    {
      "rowId": "i-a",
      "sku": "001",
      "locationId": "A",
      "unit": "each",
      "availableQuantity": "10",
      "reserveFloor": "3",
      "snapshotId": "demo-2026-10-04"
    },
    {
      "rowId": "i-b",
      "sku": "001",
      "locationId": "B",
      "unit": "each",
      "availableQuantity": "0",
      "reserveFloor": "0",
      "snapshotId": "demo-2026-10-04"
    },
    {
      "rowId": "i-c",
      "sku": "001",
      "locationId": "C",
      "unit": "each",
      "availableQuantity": "0",
      "reserveFloor": "0",
      "snapshotId": "demo-2026-10-04"
    },
    {
      "rowId": "i-d",
      "sku": "002",
      "locationId": "D",
      "unit": "each",
      "availableQuantity": "7.25",
      "reserveFloor": "1",
      "snapshotId": "demo-2026-10-04"
    },
    {
      "rowId": "i-e",
      "sku": "002",
      "locationId": "E",
      "unit": "each",
      "availableQuantity": "0",
      "reserveFloor": "0",
      "snapshotId": "demo-2026-10-04"
    },
    {
      "rowId": "i-f-case",
      "sku": "003",
      "locationId": "F",
      "unit": "case",
      "availableQuantity": "15",
      "reserveFloor": "0",
      "snapshotId": "demo-2026-10-04"
    },
    {
      "rowId": "i-g",
      "sku": "003",
      "locationId": "G",
      "unit": "each",
      "availableQuantity": "0",
      "reserveFloor": "0",
      "snapshotId": "demo-2026-10-04"
    },
    {
      "rowId": "i-n",
      "sku": "004",
      "locationId": "N",
      "unit": "each",
      "availableQuantity": "0",
      "reserveFloor": "0",
      "snapshotId": "demo-2026-10-04"
    },
    {
      "rowId": "i-m-old",
      "sku": "004",
      "locationId": "M",
      "unit": "each",
      "availableQuantity": "99",
      "reserveFloor": "0",
      "snapshotId": "previous-snapshot"
    },
    {
      "rowId": "i-z",
      "sku": "005",
      "locationId": "Z",
      "unit": "kg",
      "availableQuantity": "4.5",
      "reserveFloor": "0.5",
      "snapshotId": "demo-2026-10-04"
    }
  ],
  "inventoryCsv": "",
  "inventoryColumns": {
    "rowId": "rowId",
    "sku": "sku",
    "locationId": "locationId",
    "unit": "unit",
    "availableQuantity": "availableQuantity",
    "reserveFloor": "reserveFloor",
    "snapshotId": "snapshotId"
  },
  "transfers": [
    {
      "rowId": "t-shared-1",
      "sku": "001",
      "fromLocationId": "A",
      "toLocationId": "B",
      "unit": "each",
      "quantity": "4",
      "sequence": 1
    },
    {
      "rowId": "t-shared-2",
      "sku": "001",
      "fromLocationId": "A",
      "toLocationId": "C",
      "unit": "each",
      "quantity": "4",
      "sequence": 2
    },
    {
      "rowId": "t-valid",
      "sku": "002",
      "fromLocationId": "D",
      "toLocationId": "E",
      "unit": "each",
      "quantity": "2.125",
      "sequence": 3
    },
    {
      "rowId": "t-unit",
      "sku": "003",
      "fromLocationId": "F",
      "toLocationId": "G",
      "unit": "each",
      "quantity": "1",
      "sequence": 4
    },
    {
      "rowId": "t-missing",
      "sku": "004",
      "fromLocationId": "M",
      "toLocationId": "N",
      "unit": "each",
      "quantity": "2",
      "sequence": 5
    }
  ],
  "transfersCsv": "",
  "transferColumns": {
    "rowId": "rowId",
    "sku": "sku",
    "fromLocationId": "fromLocationId",
    "toLocationId": "toLocationId",
    "unit": "unit",
    "quantity": "quantity",
    "sequence": "sequence"
  }
}' |
apify call h_murdock/stock-transfer-plan-evidence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,h_murdock/stock-transfer-plan-evidence"
        }
    }
}
```

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/NNwmCOtrmnqSSBqwP/builds/jecYMAuflTiVqRsxM/openapi.json
