Pricing & listing rules
floorPrice, buyNowPrice, startBidPrice, and the per-vehicle rules that answer offers automatically.
TL;DRAI summary
This chapter explains the three prices for each vehicle listing: what buyers see, your minimum acceptable price, and a historical bid price. Understanding these prices helps you set up rules for how buyer offers are automatically handled or routed for your review.
Three prices travel with a listing, and the first two arm the vehicle's listing rules: the per-vehicle lines that answer buyer offers without waiting for a person.
The three prices
| Field | Meaning |
|---|---|
buyNowPrice | The listing price buyers see. Required before go-live. Offers at or above it auto-accept. |
floorPrice | Your minimum. Offers below it are declined automatically. |
startBidPrice | Kept on the vehicle and returned as you pushed it. Since 1.5.0 it sets no band. |
How an offer is answered
One rule, whoever sets the price
A listing created or repriced through the API stamps the vehicle's offer
rules by the same rule as the app, Cedar and an approved price change:
auto-decline below floorPrice, auto-accept at or above
buyNowPrice, and your personal review between the two. You see them on
the vehicle's Offer Rules tab the moment the listing goes live. A vehicle
priced by a pricing rule keeps its rule: when its floor moves, the rule's
lines are worked again from the new floor. Other lines (accepting at the
floor, say) are a pricing rule's or an automation's to set: ask your
Cypress manager, or use the Apply pricing rule automation action.
Changed in 1.5.0: a price push used to accept at the floor and decline
below startBidPrice.
The floor is a promise
A vehicle is never sold below your floor price without your consent. No rule, automation, app or agent accepts below it; a person at your organization can, by hand, and the audit trail records exactly who did.
The events tell you which path an offer took: OFFERS.CREATED for every
offer, immediately followed by OFFERS.ACCEPTED or OFFERS.DECLINED with
"autoProcessed": true when a rule decided; an offer in your review band
fires its outcome event only when you decide. OFFERS.ACCEPTED is also
sent, without autoProcessed, when the seller accepts by hand, when the
buyer accepts the seller's counter, and when an approved price change accepts
an offer that now qualifies (see
Webhooks).
A worked example
Your F-150 lists at $22,500 with floorPrice: 18000. Three offers
arrive the first week:
| Offer | What happens | Your events |
|---|---|---|
| $16,800 | Below your floor: declined instantly, the buyer told immediately | OFFERS.CREATED → OFFERS.DECLINED (autoProcessed: true) |
| $20,500 | Between your floor and your listing price: routed to you; accept, counter or decline | OFFERS.CREATED, then the outcome when you decide |
| $22,500 | At your listing price: it auto-accepts and the closing opens | OFFERS.CREATED → OFFERS.ACCEPTED → CLOSING.STARTED |
The band boundaries come straight from your listing payload: pushing good prices IS configuring the negotiation.
Updating prices
PATCH /api/v1/listings/{id} (or a compat offering POST) applies
immediately — to the vehicle and the live marketplace listing. Bulk
repricing: PATCH /api/v1/listings/bulk with vins or listingIds, up to
500 per call.
Since 1.5.0 a price change goes through the same rules as one made in the app, on every one of these routes:
- No price moves under a live offer or a sale. While the vehicle is Under
Offer, Offer Accepted, in Due Diligence, Ready to Deliver or Sold, its price
is the one a deal was agreed against: a change answers
409 CONFLICT. - A buy-now never sits below the floor, as it is or as the same request
sets it:
403 BELOW_FLOOR. A buy-now on a vehicle with no floor answers422 INVALID("Set a floor price first"), since the price is measured against it. - The floor is the seller's. An agent never sets it (
403 PEOPLE_ONLY); an API key acts as your organization and may. An agent may set the buy-now (listing) price, here and through the app's actions (set_listing_prices,edit_vehicle), within these same rules: never below the floor, never while a live offer or a sale is open.
Nothing is written when a change is refused. On the bulk route each item is
refused on its own, with its code, and the rest of the batch goes ahead. A
single PATCH also takes ?dryRun=true and an Idempotency-Key. Before
1.5.0 these changes were written.
Every price change re-arms the lines to the prices as they now stand, and a vehicle priced by a pricing rule has its rule worked again from the new floor.
Beyond per-vehicle rules
Cypress also runs org-level pricing rules (launch pricing computed from valuations) and an automation engine that can price and launch drafts for you — ask your Cypress manager to configure them; your API pushes then need nothing but the vehicle data.