Beta

The Partner Trading API v1 is in beta — endpoints and response shapes may still change.

Developers
Cru World Wine
API v1 · REST & MCP
Your portfolio

List your sales

What you have sold on Cru, one unit at a time, newest first: commission, what you received and profit.

GET/trades/salesLIVE
Required scopetrades:readAuthentication requiredTry it

Query parameters

ALL OPTIONAL
PARAMETERDESCRIPTION
lwinstring · CSV · ≤ 20 Only these wines: up to 20 comma-separated 18-digit LWIN18 codes. Anything else is refused with VALIDATION_INVALID_VALUE.
statusstring · CSV Only sales in any of these states, comma-separated, in any case: transfer_needed, awaiting_transfer, on_purchase_order or delivered_to_cru. Anything else is refused with VALIDATION_UNSUPPORTED_VALUE.
deliverable_warehouse_codestring · CSV Only sales of wine held outside Cru going to any of these Cru warehouses, comma-separated: UK_DRAK, HK_KERRY, SG_TOLL, FR_DARTESS, US_NAPA. Wine stored with Cru matches none. An unknown code is refused with VALIDATION_INVALID_VALUE.
sortstring What to order by: traded_at, the date of the sale, the only choice. Default: traded_at
directionstring desc for newest first, or asc for oldest first. Default: desc
limitinteger · 1–250 Number of sales to return. A larger value is refused with VALIDATION_INVALID_VALUE, not reduced. Default: 50
offsetinteger · ≥ 0 Number of sales to skip. Default: 0
Changed: GET /trades is now two endpoints

GET /trades is gone, and returns NOT_FOUND / 404. What you bought is GET /trades/purchases, in data.purchases, and what you sold GET /trades/sales, in data.sales. Neither has side, as a field or a parameter: sending side returns VALIDATION_UNKNOWN_PARAMETER / 400. Both take sort and direction, and a status filter of their own; sales also filter by deliverable_warehouse_code.

Changed: what a sale says, in one currency

A sale is what GET /trades called a sell, without side. It is now in the market’s currency, which currency names, rather than the one it sold in: price is still the Sold For on Cru’s Sold list, converted where it sold in another currency. After traded_at, each sale now has that list’s other columns, from cru_id to status.

One sale per unit

Each unit sold is its own sale, with quantity 1, its cru_id and no order number. sold_price, commission and settlement_fee take the sale down to net_proceeds, what you received, and profit_loss sets that against cost.

Wine held outside Cru, on its way to Cru

Once it sells, wine held outside Cru goes to the Cru warehouse deliver_to names, by deliver_by. status says how far it has got: transfer_needed until a transfer to Cru is booked, then awaiting_transfer, with transfer_ref naming the transfer; on_purchase_order while it is due in on a purchase order; and delivered_to_cru once it is there. Wine stored with Cru has no deliver_to, and is always delivered_to_cru.

Response fields

200 OK · paged

data.sales, newest first unless direction is asc. Every amount is in the market’s currency. meta.pagination counts sales.

Each item in sales[]

lwin18string

The 18-digit LWIN: wine, vintage and pack together. Match on all 18 digits.

wine_namestring | null

Cru’s name for the wine.

vintageinteger | null

The vintage year. 1000 means non-vintage.

pack_sizestring | null

Pack format, for example 6x75cl.

quantityinteger

Always 1: each unit sold is its own sale.

pricenumber | null

What the unit sold for, the Sold list’s Sold For. For wine held outside Cru, that is after Cru’s commission: sold_price less commission. For wine stored with Cru it is usually sold_price, but can differ, such as when the unit sold into a bid at another price.

totalnumber | null

The same as price, for one unit.

currencystring

The market’s. Every amount on a sale is in it, never at today’s rate: cost at the rate of the day it was bought, a sale of wine held outside Cru at the rate of the day it sold, and any other sale at the rate recorded with the unit.

referencenull

Always null: a sale has no order number.

traded_atdatetime | null

When it sold, RFC 3339 UTC.

cru_idinteger | null

The unit’s Cru ID.

transfer_refstring | null

The transfer that brings it to Cru, such as SM00004417, once one is booked.

costnumber | null

What you paid for it. null when no cost is recorded.

sold_pricenumber | null

The price Cru’s commission was worked out from, before the commission and any settlement_fee. For wine stored with Cru, its listing price, fixed on the unit when it was listed.

commission_percentnumber

Cru’s commission, as a percentage of sold_price. 0.0 for a supplier.

commissionnumber | null

Cru’s commission, as an amount.

settlement_feenumber | null

The warehouse’s fee, for wine held outside Cru. 0.0 for wine stored with Cru.

net_proceedsnumber | null

What you received, the Sold list’s You Received: sold_price less commission and settlement_fee.

profit_lossnumber | null

net_proceeds less cost. null when cost is.

profit_loss_percentnumber | null

profit_loss as a percentage of cost, to one decimal place. null when no cost is recorded.

deliver_tostring | null

For wine held outside Cru, the name of the Cru warehouse it goes to. null for wine stored with Cru.

deliverable_warehouse_codestring | null

That warehouse’s code: UK_DRAK, HK_KERRY, SG_TOLL, FR_DARTESS, US_NAPA. null for wine stored with Cru.

deliver_bydate | null

For wine held outside Cru, when it is due there, YYYY-MM-DD: its transfer’s expected date or, without one, two weeks after it sold. null for wine stored with Cru.

statusstring | null

Where the wine is in reaching Cru, as the status filter takes it: transfer_needed, awaiting_transfer, on_purchase_order or delivered_to_cru. Wine stored with Cru is always delivered_to_cru.

Errors

An lwin that is not 18-digit LWIN18 codes, or more than 20 of them, returns VALIDATION_INVALID_VALUE / 422. A status other than transfer_needed, awaiting_transfer, on_purchase_order or delivered_to_cru, a sort other than traded_at, or a direction other than desc or asc returns VALIDATION_UNSUPPORTED_VALUE / 422, and a deliverable_warehouse_code that is not a Cru warehouse code VALIDATION_INVALID_VALUE / 422. Missing or invalid credentials return AUTH_INVALID_CREDENTIALS / 401. A credential without trades:read gets AUTH_INSUFFICIENT_SCOPE / 403. View all error codes →

UP NEXT Buy an offer

API credentials

Enter the client key and secret issued by Cru. They are kept for this browser tab’s session — a reload keeps them, closing the tab or clearing them ends them.

Credentials are never included in copied examples, and are redacted from anything the console prints back.

Request API access

Tell us who you are and what you want to build. Cru issues a client key and secret for your organisation, scoped to what you need.

Markets you trade in (choose one or more)

We use what you send here to reply about API access, and for nothing else. Cloudflare Turnstile checks the form for bots (privacy policy).