# Shopify Inventory CSV Preflight (`h_murdock/shopify-inventory-preflight`) Actor

Review Shopify All states inventory CSV changes, snapshot differences, bypassed safety checks, read-only states and packed dimensions. JSON, CSV and HTML reports.

- **URL**: https://apify.com/h\_murdock/shopify-inventory-preflight.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 Shopify Inventory CSV Preflight do?

**Review a Shopify All states inventory CSV before a bulk import.** This Actor creates a row-by-row change preview and an evidence queue for malformed quantities, ambiguous identities, skipped safety comparisons, snapshot differences, read-only state edits, and packed dimensions. Supply CSV text directly; no Shopify connection or credentials are needed.

Shopify already validates inventory imports. This report provides an earlier review artifact for merchants, agencies, and automated file-preparation workflows. It never certifies that a file is safe to import, changes a store, or produces a corrected import file. The rules follow [Shopify’s inventory CSV documentation](https://help.shopify.com/en/manual/products/inventory/setup/inventory-csv).

### Why use an inventory CSV preflight?

Use the same check before each inventory update, attach the evidence CSV to an internal review, or call the Actor from an Apify API workflow. A reviewer can see the exact proposed record and original physical CSV lines behind each finding. An optional earlier export adds snapshot comparisons without giving an integration access to the store.

**A baseline is a snapshot, not live concurrency protection.** Inventory may change after either supplied file was exported. A populated `On hand (current)` value lets Shopify perform its own comparison at import time. Clearing that value removes the comparison; this Actor explicitly flags it.

### How to use it

1. Export inventory from Shopify using the **All states** option.
2. Prepare the proposed changes, keeping the identifying columns intact.
3. Paste the file into `proposedCsv` and provide an `asOf` timestamp with an explicit timezone offset.
4. Optionally paste a comparable recent export into `baselineCsv` and supply its `baselineAsOf` timestamp.
5. Optionally set a large-change threshold in units, percent, or both. Run the Actor and download the preview, evidence queue, or HTML report.
6. Review the findings, confirm details in Shopify, and use Shopify’s own import workflow independently.

The included example contains six proposed rows and six baseline rows. It demonstrates a valid negative-to-positive adjustment, a blank new quantity, `not stocked`, a blank current value, a changed read-only state, and inconsistent dimensions across two locations.

### Input and supported CSV format

The required JSON properties are `proposedCsv` and `asOf`. CSV is supplied as a string, not a URL or uploaded file reference. `baselineCsv` and `baselineAsOf` must be supplied together; the baseline timestamp cannot be later than `asOf`. Both timestamps use ISO 8601 with `Z` or a numeric offset, for example `2026-09-29T09:00:00Z`.

Both CSVs need `Handle`, `Option1 Value`, `Location`, `On hand (current)`, and `On hand (new)` headers. Option 2 and 3 values are necessary when the variant uses them. The spaced aliases `Option 1 Value`, `Option 2 Value`, `Option 3 Value`, and corresponding option-name aliases are accepted. The state names `Incoming`, `Unavailable`, `Committed`, and `Available` are also recognized as aliases for their `(not editable)` headers. All other names are case sensitive. Unknown columns receive an explicit scope finding.

The downloadable Shopify sample observed during implementation still used the older `On hand` header. This Actor requires the current/new pair from the current documented format. Available matrix exports, legacy `On hand` files, and product CSV files are unsupported. Structural problems with readable data rows can produce a paid report marked `incomplete`, with those rows explicitly invalid. This explains the unsupported file; it does not assess its inventory changes successfully.

Supported inventory rules:

- Identity is the exact handle, all option values, and location. SKU is optional metadata. String identifiers and leading zeros are preserved; no fuzzy joins or automatic trimming occur.
- Positive and negative whole quantities and zero are accepted within the safe integer range, ±9,007,199,254,740,991. Decimals, exponents, plus signs, grouping separators, and surrounding whitespace are flagged.
- `not stocked` is recognized case insensitively and never treated as zero. Its original text remains in the report.
- Empty `On hand (new)` means **no inventory change**. Empty current is a review finding even if the new cell is also blank.
- Read-only states are compared only against an exact, unambiguous supplied baseline identity. Differences are evidence of snapshot differences, not proof of a deliberate edit.
- The four packed-dimension columns must be omitted together, filled together, or blank together. Blank cells in all four columns mean clearing dimensions. Positive decimal lengths use `cm` or `in`; no unit conversion occurs. Decimal equality is checked losslessly, including numbers beyond floating-point precision.
- Packed dimensions belong to a variant. Blank versus populated dimensions, or differing dimensions across supplied locations, are flagged for every affected proposed row.

`largeChangeUnits` flags an absolute numeric delta **strictly greater** than your threshold. `largeChangePercent` uses `abs(new − current) / abs(current) × 100`. Percentage changes from zero and nonnumeric state transitions are explicitly reported as unevaluated. The defaults do not impose a business threshold.

Limits are 5,000 nonblank data rows per CSV, 4,000,000 UTF-8 bytes for the complete JSON input, 32 columns per CSV, 2,048 characters per cell, and 20,000 physical lines per CSV. CSV supports a UTF-8 BOM, quoted fields, commas inside quotes, and embedded newlines. Entirely blank records are counted and ignored. Malformed quoting, empty data, oversize input, and structurally unusable supplied baselines stop the run before publication or charging.

### Output

One dataset item contains the complete report. Its `rows` array has one preview per nonblank proposed record; `findings` includes proposed, baseline, and file-level evidence. Error rows have `action: "invalid"`; their values describe submitted cells, not an approved update. A zero-finding result means only that the implemented checks found no issue in the supplied files.

| Download | Contents |
| --- | --- |
| `OUTPUT` | Complete compact JSON, including summary, previews, evidence, policy and limitations |
| `change-preview.csv` | Flat row-level preview with quantities, action, delta, safety-check status and evidence IDs |
| `evidence-queue.csv` | Flat findings with source file, CSV record, physical line range, column and comparison coordinates |
| `report.html` | Standalone downloadable report that opens without external scripts or services |

The dataset can also be downloaded using Apify’s usual export formats. Prefer the dedicated CSV downloads for flattened review data. Spreadsheet formula prefixes are neutralized in CSV, including negative numeric text; original values remain unchanged in JSON. The report CSVs are review artifacts and must not be imported into Shopify.

For example, a row changing current `-2` to new `1` has `action: "set-quantity"` and `deltaUnits: 3`. A current value of `not stocked` with new `50` has a nonnumeric state transition, so its `deltaUnits` is `null` rather than an invented 50-unit difference.

### Pricing and recovery

The price is **$0.25 per completed report**, including platform usage. The single paid event is `report-completed`; there is no startup or per-row charge. Reports containing findings are still completed reports. Malformed or empty inputs that cannot produce a usable report, size-limit failures, and insufficient budgets do not publish or charge a report.

Full dataset JSON is the primary deliverable. Every export is generated and checked against its size limit before publication and charging. If a convenience export write is interrupted after the dataset and charge succeed, the dataset remains available. Resuming that same run verifies the input fingerprint, report integrity, deterministic analysis, and persisted charge count, then retries exports without another report event. A saved report interrupted before charging is charged once on recovery. Do not manually edit or remove a saved dataset before resurrection. Starting a new run produces a new billable report.

### Limits and support

There is no store access, inventory write, forecasting, automatic correction, customs advice, or verification of actual location and variant existence. The Actor cannot know omitted option values when no supplied record demonstrates them. Bin names, HS codes, and country of origin are recognized but not validated. Extra baseline rows do not mean deletions. Not all Shopify import checks are reproduced.

Use authorized exports and omit personal data. Input and output remain in the run’s Apify storage under your account’s access and retention settings. Customer CSV contents are not logged. For a format problem, use the Actor’s Issues tab and provide a small redacted reproduction with the finding code and original header names.

# Actor input Schema

## `proposedCsv` (type: `string`):

Paste current-format CSV text with Handle, Option1 Value, Location, On hand (current), and On hand (new). Preserve blank new cells. Legacy On hand and Available matrix formats are unsupported.

## `baselineCsv` (type: `string`):

Optional comparable All states snapshot CSV. Must also supply baselineAsOf. This does not protect against live inventory changes.

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

Explicit ISO 8601 timestamp with Z or a numeric timezone offset.

## `baselineAsOf` (type: `string`):

Required with baselineCsv; explicit offset, no later than asOf.

## `largeChangeUnits` (type: `integer`):

Optional nonnegative threshold. Flag absolute numeric deltas strictly greater than this value.

## `largeChangePercent` (type: `number`):

Optional threshold for abs(new-current)/abs(current)\*100. Zero current is explicitly undefined.

## Actor input object example

```json
{
  "proposedCsv": "\"Handle\",\"Option1 Value\",\"Option2 Value\",\"Option3 Value\",\"SKU\",\"Location\",\"Incoming (not editable)\",\"Unavailable (not editable)\",\"Committed (not editable)\",\"Available (not editable)\",\"On hand (current)\",\"On hand (new)\",\"Variant Packed Length\",\"Variant Packed Width\",\"Variant Packed Height\",\"Variant Packed Dimension Unit\"\r\n\"mug\",\"Blue\",\"\",\"\",\"0001\",\"Warehouse\",\"0\",\"0\",\"0\",\"10\",\"10\",\"12\",\"10\",\"8\",\"5\",\"cm\"\r\n\"mug\",\"Blue\",\"\",\"\",\"0001\",\"Store\",\"0\",\"0\",\"0\",\"5\",\"5\",\"\",\"11\",\"8\",\"5\",\"cm\"\r\n\"notebook\",\"Default Title\",\"\",\"\",\"0002\",\"Warehouse\",\"0\",\"0\",\"0\",\"-2\",\"-2\",\"1\",\"10\",\"8\",\"5\",\"cm\"\r\n\"candle\",\"Lavender\",\"\",\"\",\"0003\",\"Store\",\"0\",\"0\",\"0\",\"not stocked\",\"Not stocked\",\"50\",\"10\",\"8\",\"5\",\"cm\"\r\n\"case\",\"Black\",\"\",\"\",\"0004\",\"Warehouse\",\"0\",\"0\",\"0\",\"20\",\"\",\"\",\"10\",\"8\",\"5\",\"cm\"\r\n\"lamp\",\"White\",\"\",\"\",\"0005\",\"Warehouse\",\"0\",\"0\",\"0\",\"11\",\"11\",\"100\",\"10\",\"8\",\"5\",\"cm\"",
  "baselineCsv": "\"Handle\",\"Option1 Value\",\"Option2 Value\",\"Option3 Value\",\"SKU\",\"Location\",\"Incoming (not editable)\",\"Unavailable (not editable)\",\"Committed (not editable)\",\"Available (not editable)\",\"On hand (current)\",\"On hand (new)\",\"Variant Packed Length\",\"Variant Packed Width\",\"Variant Packed Height\",\"Variant Packed Dimension Unit\"\r\n\"mug\",\"Blue\",\"\",\"\",\"0001\",\"Warehouse\",\"0\",\"0\",\"0\",\"10\",\"10\",\"\",\"10\",\"8\",\"5\",\"cm\"\r\n\"mug\",\"Blue\",\"\",\"\",\"0001\",\"Store\",\"0\",\"0\",\"0\",\"5\",\"5\",\"\",\"10\",\"8\",\"5\",\"cm\"\r\n\"notebook\",\"Default Title\",\"\",\"\",\"0002\",\"Warehouse\",\"0\",\"0\",\"0\",\"-2\",\"-2\",\"\",\"10\",\"8\",\"5\",\"cm\"\r\n\"candle\",\"Lavender\",\"\",\"\",\"0003\",\"Store\",\"0\",\"0\",\"0\",\"not stocked\",\"not stocked\",\"\",\"10\",\"8\",\"5\",\"cm\"\r\n\"case\",\"Black\",\"\",\"\",\"0004\",\"Warehouse\",\"0\",\"0\",\"0\",\"20\",\"20\",\"\",\"10\",\"8\",\"5\",\"cm\"\r\n\"lamp\",\"White\",\"\",\"\",\"0005\",\"Warehouse\",\"0\",\"0\",\"0\",\"10\",\"10\",\"\",\"10\",\"8\",\"5\",\"cm\"",
  "asOf": "2026-09-29T09:00:00Z",
  "baselineAsOf": "2026-09-29T08:00:00Z",
  "largeChangeUnits": 20,
  "largeChangePercent": 200
}
```

# Actor output Schema

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

One complete report item, including preview rows and findings.

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

Full report download.

## `preview` (type: `string`):

One row per proposed record; this is a review artifact, not an import CSV.

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

Findings with original source coordinates.

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

Download and open the self-contained HTML report.

# 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 = {
    "proposedCsv": `"Handle","Option1 Value","Option2 Value","Option3 Value","SKU","Location","Incoming (not editable)","Unavailable (not editable)","Committed (not editable)","Available (not editable)","On hand (current)","On hand (new)","Variant Packed Length","Variant Packed Width","Variant Packed Height","Variant Packed Dimension Unit"
"mug","Blue","","","0001","Warehouse","0","0","0","10","10","12","10","8","5","cm"
"mug","Blue","","","0001","Store","0","0","0","5","5","","11","8","5","cm"
"notebook","Default Title","","","0002","Warehouse","0","0","0","-2","-2","1","10","8","5","cm"
"candle","Lavender","","","0003","Store","0","0","0","not stocked","Not stocked","50","10","8","5","cm"
"case","Black","","","0004","Warehouse","0","0","0","20","","","10","8","5","cm"
"lamp","White","","","0005","Warehouse","0","0","0","11","11","100","10","8","5","cm"`,
    "baselineCsv": `"Handle","Option1 Value","Option2 Value","Option3 Value","SKU","Location","Incoming (not editable)","Unavailable (not editable)","Committed (not editable)","Available (not editable)","On hand (current)","On hand (new)","Variant Packed Length","Variant Packed Width","Variant Packed Height","Variant Packed Dimension Unit"
"mug","Blue","","","0001","Warehouse","0","0","0","10","10","","10","8","5","cm"
"mug","Blue","","","0001","Store","0","0","0","5","5","","10","8","5","cm"
"notebook","Default Title","","","0002","Warehouse","0","0","0","-2","-2","","10","8","5","cm"
"candle","Lavender","","","0003","Store","0","0","0","not stocked","not stocked","","10","8","5","cm"
"case","Black","","","0004","Warehouse","0","0","0","20","20","","10","8","5","cm"
"lamp","White","","","0005","Warehouse","0","0","0","10","10","","10","8","5","cm"`,
    "asOf": "2026-09-29T09:00:00Z",
    "baselineAsOf": "2026-09-29T08:00:00Z",
    "largeChangeUnits": 20,
    "largeChangePercent": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("h_murdock/shopify-inventory-preflight").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 = {
    "proposedCsv": """\"Handle\",\"Option1 Value\",\"Option2 Value\",\"Option3 Value\",\"SKU\",\"Location\",\"Incoming (not editable)\",\"Unavailable (not editable)\",\"Committed (not editable)\",\"Available (not editable)\",\"On hand (current)\",\"On hand (new)\",\"Variant Packed Length\",\"Variant Packed Width\",\"Variant Packed Height\",\"Variant Packed Dimension Unit\"\r
\"mug\",\"Blue\",\"\",\"\",\"0001\",\"Warehouse\",\"0\",\"0\",\"0\",\"10\",\"10\",\"12\",\"10\",\"8\",\"5\",\"cm\"\r
\"mug\",\"Blue\",\"\",\"\",\"0001\",\"Store\",\"0\",\"0\",\"0\",\"5\",\"5\",\"\",\"11\",\"8\",\"5\",\"cm\"\r
\"notebook\",\"Default Title\",\"\",\"\",\"0002\",\"Warehouse\",\"0\",\"0\",\"0\",\"-2\",\"-2\",\"1\",\"10\",\"8\",\"5\",\"cm\"\r
\"candle\",\"Lavender\",\"\",\"\",\"0003\",\"Store\",\"0\",\"0\",\"0\",\"not stocked\",\"Not stocked\",\"50\",\"10\",\"8\",\"5\",\"cm\"\r
\"case\",\"Black\",\"\",\"\",\"0004\",\"Warehouse\",\"0\",\"0\",\"0\",\"20\",\"\",\"\",\"10\",\"8\",\"5\",\"cm\"\r
\"lamp\",\"White\",\"\",\"\",\"0005\",\"Warehouse\",\"0\",\"0\",\"0\",\"11\",\"11\",\"100\",\"10\",\"8\",\"5\",\"cm\"""",
    "baselineCsv": """\"Handle\",\"Option1 Value\",\"Option2 Value\",\"Option3 Value\",\"SKU\",\"Location\",\"Incoming (not editable)\",\"Unavailable (not editable)\",\"Committed (not editable)\",\"Available (not editable)\",\"On hand (current)\",\"On hand (new)\",\"Variant Packed Length\",\"Variant Packed Width\",\"Variant Packed Height\",\"Variant Packed Dimension Unit\"\r
\"mug\",\"Blue\",\"\",\"\",\"0001\",\"Warehouse\",\"0\",\"0\",\"0\",\"10\",\"10\",\"\",\"10\",\"8\",\"5\",\"cm\"\r
\"mug\",\"Blue\",\"\",\"\",\"0001\",\"Store\",\"0\",\"0\",\"0\",\"5\",\"5\",\"\",\"10\",\"8\",\"5\",\"cm\"\r
\"notebook\",\"Default Title\",\"\",\"\",\"0002\",\"Warehouse\",\"0\",\"0\",\"0\",\"-2\",\"-2\",\"\",\"10\",\"8\",\"5\",\"cm\"\r
\"candle\",\"Lavender\",\"\",\"\",\"0003\",\"Store\",\"0\",\"0\",\"0\",\"not stocked\",\"not stocked\",\"\",\"10\",\"8\",\"5\",\"cm\"\r
\"case\",\"Black\",\"\",\"\",\"0004\",\"Warehouse\",\"0\",\"0\",\"0\",\"20\",\"20\",\"\",\"10\",\"8\",\"5\",\"cm\"\r
\"lamp\",\"White\",\"\",\"\",\"0005\",\"Warehouse\",\"0\",\"0\",\"0\",\"10\",\"10\",\"\",\"10\",\"8\",\"5\",\"cm\"""",
    "asOf": "2026-09-29T09:00:00Z",
    "baselineAsOf": "2026-09-29T08:00:00Z",
    "largeChangeUnits": 20,
    "largeChangePercent": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("h_murdock/shopify-inventory-preflight").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 '{
  "proposedCsv": "\\"Handle\\",\\"Option1 Value\\",\\"Option2 Value\\",\\"Option3 Value\\",\\"SKU\\",\\"Location\\",\\"Incoming (not editable)\\",\\"Unavailable (not editable)\\",\\"Committed (not editable)\\",\\"Available (not editable)\\",\\"On hand (current)\\",\\"On hand (new)\\",\\"Variant Packed Length\\",\\"Variant Packed Width\\",\\"Variant Packed Height\\",\\"Variant Packed Dimension Unit\\"\\r\\n\\"mug\\",\\"Blue\\",\\"\\",\\"\\",\\"0001\\",\\"Warehouse\\",\\"0\\",\\"0\\",\\"0\\",\\"10\\",\\"10\\",\\"12\\",\\"10\\",\\"8\\",\\"5\\",\\"cm\\"\\r\\n\\"mug\\",\\"Blue\\",\\"\\",\\"\\",\\"0001\\",\\"Store\\",\\"0\\",\\"0\\",\\"0\\",\\"5\\",\\"5\\",\\"\\",\\"11\\",\\"8\\",\\"5\\",\\"cm\\"\\r\\n\\"notebook\\",\\"Default Title\\",\\"\\",\\"\\",\\"0002\\",\\"Warehouse\\",\\"0\\",\\"0\\",\\"0\\",\\"-2\\",\\"-2\\",\\"1\\",\\"10\\",\\"8\\",\\"5\\",\\"cm\\"\\r\\n\\"candle\\",\\"Lavender\\",\\"\\",\\"\\",\\"0003\\",\\"Store\\",\\"0\\",\\"0\\",\\"0\\",\\"not stocked\\",\\"Not stocked\\",\\"50\\",\\"10\\",\\"8\\",\\"5\\",\\"cm\\"\\r\\n\\"case\\",\\"Black\\",\\"\\",\\"\\",\\"0004\\",\\"Warehouse\\",\\"0\\",\\"0\\",\\"0\\",\\"20\\",\\"\\",\\"\\",\\"10\\",\\"8\\",\\"5\\",\\"cm\\"\\r\\n\\"lamp\\",\\"White\\",\\"\\",\\"\\",\\"0005\\",\\"Warehouse\\",\\"0\\",\\"0\\",\\"0\\",\\"11\\",\\"11\\",\\"100\\",\\"10\\",\\"8\\",\\"5\\",\\"cm\\"",
  "baselineCsv": "\\"Handle\\",\\"Option1 Value\\",\\"Option2 Value\\",\\"Option3 Value\\",\\"SKU\\",\\"Location\\",\\"Incoming (not editable)\\",\\"Unavailable (not editable)\\",\\"Committed (not editable)\\",\\"Available (not editable)\\",\\"On hand (current)\\",\\"On hand (new)\\",\\"Variant Packed Length\\",\\"Variant Packed Width\\",\\"Variant Packed Height\\",\\"Variant Packed Dimension Unit\\"\\r\\n\\"mug\\",\\"Blue\\",\\"\\",\\"\\",\\"0001\\",\\"Warehouse\\",\\"0\\",\\"0\\",\\"0\\",\\"10\\",\\"10\\",\\"\\",\\"10\\",\\"8\\",\\"5\\",\\"cm\\"\\r\\n\\"mug\\",\\"Blue\\",\\"\\",\\"\\",\\"0001\\",\\"Store\\",\\"0\\",\\"0\\",\\"0\\",\\"5\\",\\"5\\",\\"\\",\\"10\\",\\"8\\",\\"5\\",\\"cm\\"\\r\\n\\"notebook\\",\\"Default Title\\",\\"\\",\\"\\",\\"0002\\",\\"Warehouse\\",\\"0\\",\\"0\\",\\"0\\",\\"-2\\",\\"-2\\",\\"\\",\\"10\\",\\"8\\",\\"5\\",\\"cm\\"\\r\\n\\"candle\\",\\"Lavender\\",\\"\\",\\"\\",\\"0003\\",\\"Store\\",\\"0\\",\\"0\\",\\"0\\",\\"not stocked\\",\\"not stocked\\",\\"\\",\\"10\\",\\"8\\",\\"5\\",\\"cm\\"\\r\\n\\"case\\",\\"Black\\",\\"\\",\\"\\",\\"0004\\",\\"Warehouse\\",\\"0\\",\\"0\\",\\"0\\",\\"20\\",\\"20\\",\\"\\",\\"10\\",\\"8\\",\\"5\\",\\"cm\\"\\r\\n\\"lamp\\",\\"White\\",\\"\\",\\"\\",\\"0005\\",\\"Warehouse\\",\\"0\\",\\"0\\",\\"0\\",\\"10\\",\\"10\\",\\"\\",\\"10\\",\\"8\\",\\"5\\",\\"cm\\"",
  "asOf": "2026-09-29T09:00:00Z",
  "baselineAsOf": "2026-09-29T08:00:00Z",
  "largeChangeUnits": 20,
  "largeChangePercent": 200
}' |
apify call h_murdock/shopify-inventory-preflight --silent --output-dataset

```

## MCP server setup

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

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/gm7hTDmxQPST23bwt/builds/9CY7sqvepAkaEZRx7/openapi.json
