> ## 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 |
| `payoutMethod` | string | `electronic_check` or `plaid_ach`, instead of your default |

Each item names an offer, or a product and variant. With a product and variant, Pure picks the best live offer. `quantity` is 1 to 999,999.

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

An item with both an `offerId` and a `productId` fails with **400** `validation_error`.

An item the offers cannot fill fails the whole quote with **400** `invalid_request`. The message starts with the item's index, for example `items[0]: This offer cannot take that many units.`, and `details.itemIndex` holds the same index.

### Payout method

A quote pays out with your organization's default method unless `payoutMethod` names another. `GET /organization/get-payout-methods/v1` lists each method, whether it is `ready`, and which is your default. A method that is not ready is listed in `issues` with reason `payout_method_not_ready`.

| Method | Ready when |
| - | - |
| `electronic_check` | A payee name and email are set |
| `plaid_ach` | A bank account is connected through Plaid |
| `wire_transfer` | Always; only Pure sets it as your default |

Connect a bank account on collectpure.com. `PATCH /organization/update-organization/v1` sets your default to `electronic_check` or `plaid_ach`, and sets electronic check details.

## Response

| Field | Meaning |
| - | - |
| `quoteId` | Pass to execute |
| `expiresAt` | ISO 8601; execute before this |
| `payout` | What you are paid: `subtotal` plus fees plus promotions |
| `payoutMethod` | How you are paid; execute pays with this method |
| `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. To change optionals, create a new quote.

| 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` |

Instant payout requires a subtotal of at least **\$3,500** and enough instant-payout credit. `GET /organization/get-payout-methods/v1` returns your credit in `instantPayout.availableCredit`, in cents.

### Issues

Each issue is `{ kind, reason, message }`, with the same values as [errors](https://docs.collectpure.com/execution/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 |

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.