> ## Documentation Index
> Fetch the complete documentation index at: https://docs.collectpure.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Sell

> Quote request and response fields, and what execute places

A sell quote prices items against live offers and holds that payout for **60 seconds**. Amounts are in **cents**.

## Request

| Field | Type | Notes |
| - | - | - |
| `items` | array | 1 to 50 items |
| `optionals` | string\[] | `instant_payout`, `overnight_label` |
| `promotionCode` | string | Up to 64 characters |

Each item names an offer, or a product and variant. With a product and variant, Pure picks the best live offer.

```json theme={null}
{
  "items": [
    { "offerId": "OFFER_UUID", "quantity": 1 },
    { "productId": "PRODUCT_UUID", "variantId": "VARIANT_UUID", "quantity": 2 }
  ],
  "optionals": ["instant_payout"],
  "promotionCode": "SPRING"
}
```

`quantity` is 1 to 999,999. An item with both an `offerId` and a `productId` is rejected with **400**.

An item the offers cannot fill fails the quote with **400** `invalid_request`. The message names the item, for example `items[0] could not be added: Requested quantity exceeds available quantity`.

## Response

| Field | Meaning |
| - | - |
| `quoteId` | Pass to execute |
| `expiresAt` | ISO 8601; execute before this |
| `payout` | What you are paid: `subtotal` plus fees plus promotions |
| `items[]` | The offer each item filled, with `unitPrice` |
| `breakdown.subtotal` | Sum of `unitPrice × quantity` |
| `breakdown.fees[]` | Negative; the processing fee and each selected optional |
| `breakdown.promotions[]` | Positive; each applied promotion |
| `optionals[]` | Every optional, selected or not |
| `issues[]` | What the quote left out or what blocks execute |

### Optionals

Each entry in `optionals` prices the add-on both ways, so you can compare before you choose.

| Field | Meaning |
| - | - |
| `id` | `instant_payout` or `overnight_label` |
| `selected` | Whether this quote included it |
| `available` | Whether it can be added to this order |
| `fee` | Its cost, deducted from `payout`; `null` when unavailable |
| `payoutWith` | `payout` with it added |
| `payoutWithout` | `payout` with it removed |
| `unavailable` | `{ kind, reason, message }` when `available` is `false` |

To change optionals, create a new quote.

Instant payout requires a subtotal of at least **\$3,500** and enough instant-payout credit. Eligibility rules: [Optionals](https://docs.collectpure.com/api-reference/execution-optionals.md).

### Issues

Each issue is `{ kind, reason, message }`, using the same values as [errors](https://docs.collectpure.com/execution-v3/errors.md).

A selected optional that is unavailable, or a promotion code that does not apply, is left out of `payout` and listed in `issues`. Execute places the sale without it.

Any other issue blocks execute. Fix it, then create a new quote.

```json theme={null}
"issues": [
  {
    "kind": "account_action_required",
    "reason": "address_required",
    "message": "Add a shipping address before selling."
  }
]
```

## Execute

Execute places the sale when the live payout is at least the quoted `payout`. A lower live payout fails with **409** `requote` and `details.reason` `quote_total_mismatch`.

Execute does not check or change your own listings.

| Response field | Meaning |
| - | - |
| `status` | `placed` |
| `orderId` | Your purchase order |
| `counterpartyOrderIds` | The buy orders your sale filled |
| `payout` | What you are paid, in cents |

## After execute

Poll `GET /orders/get-purchase-order/v1?id={orderId}` for `shippingLabelUrl`. It is `null` until fulfillment generates the label.

```bash theme={null}
curl "https://api.collectpure.com/orders/get-purchase-order/v1?id=ORDER_ID" \
  -H "x-api-key: YOUR_API_KEY"
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.