---
search:
  tags:
    - Draft Orders
    - POST
seo:
  description: >-
    Places the order a draft describes, using the options, pricing, and defaults
    that… Reference for the POST /draft-orders/{id}/order endpoint in the Sibi
    API.
sidebar:
  label: Create order from draft
  badge: POST
title: Create order from draft
type: openapi-operation
---
Places the order a draft describes, using the options, pricing, and defaults that draft resolved.

The draft is addressed by the `id` returned from `POST /draft-orders`; nothing about the order can be changed here. To change it, create a new draft and place that one instead. A draft can only be placed once: a second request for a draft that already has an order returns 409 `DRAFT_ORDER_ALREADY_PLACED`, naming the order it became.

Pass an `idempotencyKey` to make retries safe: resubmitting the same draft with the same key within 5 minutes returns the order already placed instead of placing a second one. This matters on failure: a 5xx response or a timeout does not guarantee the order was not placed, so retry only with the same `idempotencyKey`.

A draft that does not exist and a draft belonging to another organization both return 404, so the endpoint cannot be used to discover which draft ids exist.

Validation runs at placement exactly as it does for `POST /orders`, so a draft that priced cleanly can still be rejected with 400 if something it depends on — availability, a fulfillment date, a payment method — has changed since it was drafted. The codes are the ones listed on `POST /orders`.

`POST /draft-orders/{id}/order`

**Request body** (`application/json`)

- `idempotencyKey` (string) — Makes retries safe: resubmitting the same draft with the same key within 5 minutes returns the order already placed instead of placing a second one.

Request body example:

```json
{
  "idempotencyKey": "b8f0e6d2-1c3a-4f5e-9a7b-0d2c4e6f8a1b"
}
```

**Responses**

- `201` — The order was placed from the draft.
- `400` — Bad request - the draft could not be placed. See the POST /orders operation description for the possible error codes.
- `401` — Unauthorized - Missing or invalid authentication
- `403` — Forbidden - The token is missing the scope this operation requires, or was minted for the other environment
- `404` — Not found - no draft order with this id is visible to the caller
- `409` — Conflict - this draft has already been placed; the response names the order it became
- `500` — Internal server error

Response example, 201:

```json
{
  "id": "SIBI-12345678",
  "orderUrl": "https://web.sibipro.com/orders/SIBI-12345678",
  "warrantyOrderId": "string",
  "warrantyOrderUrl": "string"
}
```

Response example, 400 · validationError:

```json
{
  "code": "VALIDATION_ERROR",
  "message": "Invalid input parameters"
}
```

Response example, 400 · noAvailableFulfillmentDates:

```json
{
  "code": "NO_AVAILABLE_FULFILLMENT_DATES",
  "message": "No fulfillment dates are available for this order"
}
```

Response example, 401:

```json
{
  "code": "UNAUTHORIZED",
  "message": "Missing or invalid authentication token"
}
```

Response example, 403 · environmentMismatch:

```json
{
  "code": "TOKEN_ENVIRONMENT_MISMATCH",
  "message": "A test token was used against the production API. Test tokens only work against the Sibi test environment; use a production token here."
}
```

Response example, 403 · restTokenRequired:

```json
{
  "code": "REST_TOKEN_REQUIRED",
  "message": "This endpoint requires a REST API token from the developer dashboard."
}
```

Response example, 403 · insufficientScope:

```json
{
  "code": "INSUFFICIENT_SCOPE",
  "message": "The presented token is missing the `create:from-draft:orders` scope, which this endpoint requires. Create a token with the scopes you need at https://developer.sibipro.com."
}
```

Response example, 404:

```json
{
  "code": "DRAFT_ORDER_NOT_FOUND",
  "message": "Draft order not found"
}
```

Response example, 409:

```json
{
  "code": "DRAFT_ORDER_ALREADY_PLACED",
  "message": "This draft order has already been placed as order SIBI-12345678"
}
```

Response example, 500:

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "An unexpected error occurred"
}
```
