---
name: "inventory_move"
area: "inventory"
title: "Move stock"
price: "$0.005 per move"
method: "POST"
url: "https://api.conecto.chat/v1/tools/inventory_move"
mcp_server: "https://api.conecto.chat/mcp/inventory"
auth: "Authorization: Bearer <conecto_sk_ key>"
docs_url: "https://conecto.chat/tools/inventory/inventory_move"
---

# Move stock (`inventory_move`)

Changes stock, all moves or none: receive, ship, transfer between locations, or adjust.

Change stock, all moves or none: receive (in, at unit_cost, which becomes part of the moving average), ship (out, at the moving average), transfer (from location to another, to), adjust (a signed quantity: found, damaged, used). Stock can't go below 0 at a location. reference ties a move to an order or invoice number.

Price: $0.005 per move. A call that fails costs nothing.

## Use it when

Stock came in, went out, moved, broke or was found.

- For a count of everything at a location, use [inventory_stocktake](https://conecto.chat/tools/inventory/inventory_stocktake.md).
- For goods ordered from a supplier arriving, use [purchasing_receive](https://conecto.chat/tools/purchasing/purchasing_receive.md).

## Say this to your agent

> Twelve beech bistro chairs came in from the maker at 140 euros each, and two left today for order 1001.

## Inputs

| Name | Type | Required | Description | Allowed values | Default |
|---|---|---|---|---|---|
| `moves` | array of objects | yes | 1 to 100 items. |  |  |
| `moves[].kind` | string | yes, in each item of `moves` |  | `"receive"`, `"ship"`, `"transfer"`, `"adjust"` |  |
| `moves[].sku` | string | yes, in each item of `moves` | The item's SKU. 1 to 64 characters. |  |  |
| `moves[].quantity` | number or string | yes, in each item of `moves` | Up to 6 decimals; negative only for adjust. Up to 24 characters. |  |  |
| `moves[].location` | string | no | A location by name. Default: "Main" (made on first use). Up to 120 characters. |  |  |
| `moves[].to` | string | no | transfer: where the stock goes. Up to 120 characters. |  |  |
| `moves[].unit_cost` | number or string | no | receive (and adjust in): what one cost. Default: the moving average, else the item's cost. Up to 24 characters. |  |  |
| `moves[].reference` | string | no | Up to 120 characters. |  |  |
| `moves[].note` | string | no | Up to 500 characters. |  |  |
| `moves[].date` | string | no | Default today. Matches ^\\d{4}-\\d{2}-\\d{2}$. |  |  |

## Example

Written for Hansen & Voss, a restaurant-equipment wholesaler in Hamburg with 60 staff.

MCP: call `inventory_move` on the MCP server `https://api.conecto.chat/mcp/inventory` with these arguments:

```json
{
  "moves": [
    {
      "kind": "receive",
      "sku": "CHAIR-BISTRO-BEECH",
      "quantity": 12,
      "unit_cost": "140.00",
      "reference": "Delivery 41"
    },
    {
      "kind": "ship",
      "sku": "CHAIR-BISTRO-BEECH",
      "quantity": 2,
      "reference": "Order 1001"
    }
  ]
}
```

REST:

```bash
curl https://api.conecto.chat/v1/tools/inventory_move \
  -H "Authorization: Bearer $CONECTO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"moves": [{"kind": "receive", "sku": "CHAIR-BISTRO-BEECH", "quantity": 12, "unit_cost": "140.00", "reference": "Delivery 41"}, {"kind": "ship", "sku": "CHAIR-BISTRO-BEECH", "quantity": 2, "reference": "Order 1001"}]}'
```

## Response

```json
{
  "call_id": "5f0c8a2e-3b7d-4c1e-9a64-2d8e1f7b0c93",
  "tool": "inventory_move",
  "status": "succeeded",
  "replayed": false,
  "cost_usd": "$0.01",
  "balance_usd": "$19.75",
  "result": {
    "moves": [
      {
        "move_id": 4107,
        "date": "2026-10-14",
        "kind": "receive",
        "sku": "CHAIR-BISTRO-BEECH",
        "quantity": "12",
        "from": null,
        "to": "Main",
        "unit_cost": "140",
        "value": "1680.00",
        "quantity_after": "12",
        "reference": "Delivery 41",
        "note": null
      },
      {
        "move_id": 4108,
        "date": "2026-10-14",
        "kind": "ship",
        "sku": "CHAIR-BISTRO-BEECH",
        "quantity": "-2",
        "from": "Main",
        "to": null,
        "unit_cost": "140",
        "value": "-280.00",
        "quantity_after": "10",
        "reference": "Order 1001",
        "note": null
      }
    ],
    "items": [
      {
        "sku": "CHAIR-BISTRO-BEECH",
        "name": "Bistro chair, beech",
        "unit": "pcs",
        "barcode": null,
        "description": null,
        "quantity": "10",
        "unit_cost": "140",
        "value": "1400.00",
        "currency": "EUR",
        "price": "320",
        "reorder_point": "8",
        "low": false,
        "archived": false,
        "locations": {
          "Main": "10"
        }
      }
    ]
  }
}
```

`result`: moves: each as booked (move_id, date, kind, SKU, quantity, from, to, unit cost, value, quantity after, reference, note); items: the stock of each item afterwards.

## Errors

| Code | Status | When | Fix |
|---|---|---|---|
| `invalid_input` | 400 | A quantity, cost or date is not valid. | Send numbers like 140.00 (a dot for decimals) and dates that have passed, like 2026-10-14. |
| `not_enough_stock` | 409 | Stock would go below 0 at a location. | Ship or move less; the message says how much there is. |
| `not_found` | 404 | No location has that name. | Call inventory_locations, or add it with inventory_save_location. |
| `archived` | 409 | The item or location is archived. | Use another one, or name a location that is in use. |
| `not_found` | 404 | No item has that SKU. | Add it with inventory_save_items first. |
| `invalid_input` | 400 | A move's kind is unknown, a quantity is 0, or a transfer has no to. | Fix the move the message names, like "Move 2". |

The refusals every tool can give (401 key, 402 balance, 429 limits) are on the errors page: https://conecto.chat/docs/errors.md

## Related

- [inventory_save_items](https://conecto.chat/tools/inventory/inventory_save_items.md): Adds stock items or changes them by SKU: name, unit, barcode, cost, price and reorder point. $0.005 per item saved.
- [inventory_list_items](https://conecto.chat/tools/inventory/inventory_list_items.md): Items with their stock in total and per location, the moving-average cost and the value. Free up to 1,000,000 reads a month.
- [inventory_stocktake](https://conecto.chat/tools/inventory/inventory_stocktake.md): Records a count of one location; each difference from the books becomes a count move. $0.002 per line counted.
- [inventory_history](https://conecto.chat/tools/inventory/inventory_history.md): Stock moves, newest first, of one item, at one location, of one kind, or in a period. Free up to 1,000,000 reads a month.
- [inventory_locations](https://conecto.chat/tools/inventory/inventory_locations.md): Every location with how many items it holds and their value. Free up to 1,000,000 reads a month.
- [inventory_save_location](https://conecto.chat/tools/inventory/inventory_save_location.md): Adds a location (a warehouse, a shop, a van), or renames, describes or archives one. $0.001 a call.
- [inventory_report](https://conecto.chat/tools/inventory/inventory_report.md): Valuation (what was held on a day and its value), movement (per item in a period, with the cost of goods shipped) or low stock. Free up to 1,000,000 reads a month.
- [inventory_import](https://conecto.chat/tools/inventory/inventory_import.md): Creates or changes items from a CSV in the file store, with optional quantities per location; all rows or none. $0.001 per row imported.
- [inventory_export](https://conecto.chat/tools/inventory/inventory_export.md): A CSV of the items (per location, with quantities and value) or of the moves in a period, with a download link. $0.001 a call.
