*MCP › Reference › Finance › Purchase orders*

# Receive material from a purchase order

> Declares what arrived and in what quantity, line by line.

> **Send your own idempotencyKey:** A retry without the same key duplicates the effect. Send your own `idempotencyKey` (a UUID) and resend the same one if you retry.

> **Requires human confirmation:** Put this tool on your client's “ask before running” list. The annotations are hints that the server declares, not guarantees: do not decide the approval from `destructiveHint` alone. The server flags this tool with `_meta["anthropic/requiresUserInteraction"]`, which clients that honor it use to ask a person before every call.

`newStockReceived` registers NEW inventory, so always send the `Idempotency-Key` header: without it, a retry duplicates the stock. The order may end up partially received. The line identifier is `lineId`. Returns the full purchase order, the same projection as its GET. `meta.receivedLines` says how many lines the call declared as received. A draft or cancelled order responds 409 `conflict`.

TOOL `filmo_purchase_orders_receive` · `purchase-orders:write` · 120/min · May need an add-on · Server annotation: Destructive · Requires human confirmation · Send your own idempotencyKey

## Arguments

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `purchaseOrderId` | string | Yes | Purchase order identifier. |
| `spaceId` | string | No | Warehouse where the material comes in. Defaults to the warehouse of the account. |
| `lines` | object[] | Yes | Received lines. At least one. |
| `lines.lineId` | string | Yes | Purchase order line being received. |
| `lines.receivedQuantity` | number | Yes | Units received for that line. |
| `lines.newStockReceived` | number | No | Of those received, how many register new inventory. |
| `lines.notes` | string | No | Reception notes. |
| `idempotencyKey` | string | No | Idempotency key chosen by the client (a UUID is recommended). Repeating the same key with the same arguments within 24 h returns the stored response without executing again; with different arguments it responds 422. It is the safe way to retry after a network failure. |
| `ifMatch` | string | No | Optimistic locking: the meta.etag you got from the detail read of this resource (or "*"). If the resource changed since, the call fails with 412 precondition_failed before writing anything; read it again and retry. Omit it to write unconditionally. |

## Result

On success the result carries `structuredContent` with `data` and `meta`. These are the attributes of `data`.

| Name | Type | Description |
| --- | --- | --- |
| `id` | string | Unique purchase order identifier. |
| `poNumber` | string | Purchase order number; null while it is a draft. |
| `status` | string | Purchase order status. `draft`, `pending`, `completed`, `cancelled` |
| `type` | string | Purchase order type. `subrental`, `stock_purchase`, `resale_purchase`, `consumable_purchase`, `technician`, `transport`, `repair`, `consignment` |
| `isDraft` | boolean | true if the purchase order is still a draft. |
| `poDate` | string<date-time> | Purchase order date in ISO 8601 UTC; null if not set. |
| `supplierId` | string | Supplier identifier; null while a draft has no supplier. Resolve it against `/api/v1/contacts`. |
| `reference` | string | Free-form reference of the purchase order; null if it has none. |
| `currency` | string | Currency of the purchase order, as an ISO 4217 code. |
| `subTotal` | string | Subtotal before discounts and taxes, as a decimal string "1234.50". |
| `discountTotal` | string | Discount total, as a decimal string "1234.50". |
| `taxesPrice` | string | Tax total, as a decimal string "1234.50". |
| `netPrice` | string | Taxable base, as a decimal string "1234.50". |
| `grossPrice` | string | Total including taxes, as a decimal string "1234.50". |
| `totalPaid` | string | Amount already paid, as a decimal string "1234.50"; null if no payment has been recorded. |
| `orderId` | string | Associated rental order; null if it has none. |
| `orderNumber` | string | Number of that order; null if it has none. |
| `projectId` | string | Associated project; null if it has none. |
| `repairTicketId` | string | Repair ticket that originated the purchase; null if it does not come from one. |
| `notes` | string | Purchase order notes; null if it has none. |
| `createdAt` | string<date-time> | Creation date in ISO 8601 UTC. |
| `updatedAt` | string<date-time> | Last modification date in ISO 8601 UTC. |

*Call · filmo_purchase_orders_receive*

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "filmo_purchase_orders_receive",
    "arguments": {
      "purchaseOrderId": "purc_8f2a1c",
      "lines": [
        {
          "lineId": "line_8f2a1c",
          "receivedQuantity": 1,
          "newStockReceived": 1,
          "notes": "<notes>"
        }
      ],
      "idempotencyKey": "<a UUID you generate>"
    }
  }
}
```

*Result (generated from the schema)*

```json
{
  "structuredContent": {
    "data": {
      "id": "id_8f2a1c",
      "poNumber": "<poNumber>",
      "status": "draft",
      "type": "subrental",
      "isDraft": true,
      "poDate": "2026-09-01T08:00:00Z",
      "supplierId": "supp_8f2a1c",
      "reference": "<reference>",
      "currency": "EUR",
      "subTotal": "1234.50",
      "discountTotal": "1234.50",
      "taxesPrice": "1234.50",
      "netPrice": "1234.50",
      "grossPrice": "1234.50",
      "totalPaid": "1234.50",
      "orderId": "orde_8f2a1c",
      "orderNumber": "<orderNumber>",
      "projectId": "proj_8f2a1c",
      "repairTicketId": "repa_8f2a1c",
      "notes": "<notes>",
      "createdAt": "2026-09-01T08:00:00Z",
      "updatedAt": "2026-09-01T08:00:00Z"
    },
    "meta": {
      "idempotencyKey": "<the key you sent, or the one the server generated>",
      "rateLimit": {
        "limit": 120,
        "remaining": 119,
        "reset": 42
      }
    }
  }
}
```

## The same operation by REST

This tool runs [`POST /api/v1/purchase-orders/{purchaseOrderId}/receive`](https://docs.filmo.io/rest-api/endpoint-reference/purchase-orders/receive-material-from-a-purchase-order).

---

Canonical URL: https://docs.filmo.io/mcp/tools/purchase-orders/filmo-purchase-orders-receive  
Last updated: 2026-10-25