---
title: "Mark an order fulfilled"
method: PATCH
path: "/api/v1/commerce/orders/{id}/fulfilment"
tags: ["commerce"]
---

# Mark an order fulfilled

`PATCH /api/v1/commerce/orders/{id}/fulfilment`

## Request

- Base URL: `https://app.blueticked.com`
- URL: `https://app.blueticked.com/api/v1/commerce/orders/{id}/fulfilment`
- Auth: HTTP bearer

Mark a paid order handed over (or undo it): the call a warehouse or fulfilment system makes when goods leave.

A malformed UUID answers 400 validation_failed before resource access; a well-formed unknown UUID or one outside your workspace answers 404.

Only a paid order can be marked fulfilled; `fulfilled: false` undoes a mistaken hand-over.

Marking fulfilled emits the `commerce.order.fulfilled` webhook event once in the order's life.

Marking an order that is already fulfilled answers 200 with its first `fulfilled_at` and `already_fulfilled: true`, and sends nothing again: no second webhook, email or automation. Retrying the call is safe.

Marking an order again after `fulfilled: false` records the new `fulfilled_at` and announces nothing: the customer already heard it shipped. A mark that loses to a concurrent undo answers 409 `conflict`.

Courier bookings through The Courier Guy mark the order fulfilled themselves. A courier booked for an order already marked fulfilled only sends the buyer the tracking number.

## Path parameters

- `id` string, required

## Request body

- object
  - `fulfilled` boolean, required

## Response `200`

Success

- object
  - `ok` boolean, required
  - `fulfilled_at` string, date-time, nullable, required
  - `already_fulfilled` boolean, required

## Other responses

- `400`: Validation failed
- `401`: Unauthorized: missing or invalid API key
- `402`: Insufficient wallet balance
- `403`: Forbidden: scope, plan limit, or suspension
- `404`: Not found
- `409`: Conflict (idempotency-key reuse or resource in use)
- `413`: Request body above the endpoint's size limit
- `422`: Understood but refused: the request is well-formed, the action is not permitted for this resource
- `429`: Rate limited
- `500`: Internal error
- `502`: An upstream provider refused or failed the request
- `503`: Channel or send queue unavailable

---

[API](https://skmtc.dev/blueticked/apis/blueticked-api.md) · [All operations](https://skmtc.dev/blueticked/apis/blueticked-api/llms.txt) · [OpenAPI document](https://skmtc.dev/blueticked/apis/blueticked-api/revisions/07132284f4ff?raw)
