Developer docs
Integrate your systems with the Cypress remarketing platform.
TL;DRAI summary
This chapter explains how the Cypress API lets you integrate your existing systems to manage your fleet's vehicle remarketing. You can push inventory, track sales, and receive updates directly, automating many tasks without manual logins.
Cypress runs the full remarketing cycle for vehicle fleets — intake, valuation, marketplace, negotiation, closing, delivery — and this API lets your systems drive it. Push inventory as JSON, price and list it, and let signed webhooks narrate everything buyers and Cypress do with it, down to the executed bill of sale as structured data.
Who integrates, and why
A rental fleet de-fleeting at scale
Two hundred units come off rent every month. Their fleet system pushes each
batch with listingMode: IMMEDIATE — priced from their own book value —
and vehicles are live on the marketplace the same minute. Sale proceeds and
signed paperwork flow back as events into their ERP, no portal logins.
A bank's repossession desk
Recovered vehicles arrive with a condition grade and a floor tied to the
outstanding loan. The bank pushes draft-first, lets Cypress review and
photograph, and their case system auto-closes files when
CLOSING.COMPLETED arrives with the sale price and the executed documents.
A wholesale dealer group
Already integrated with Manheim. Their existing client code points at
/api/compatible/v1 — same Units/Offerings shapes, same 201 + Location
conventions — and their aging lot inventory reaches Cypress buyers with a
one-line base-URL change.
A CRM vendor's app
A dealer group's admin approves the vendor's app through Connect Cypress. The app keeps contacts, companies, deals and tasks in step by its own ids (a hundred at a time) and keeps no table of Cypress ids. Disconnecting it ends every token at once.
An AI agent on the sales desk
A seller's agent joins the team with the AI agent role. Over Cypress Operate it works the follow-ups it is given, counters offers at or above the floor, drafts campaigns and prepares the quarter's plan. Below the floor, the money and the approval stay with a person, and the agent is told so.
The shape of the platform
One vehicle, one journey — your API calls and webhooks attach to every stage:
Opening a record in the app
Every record the API returns, and every Cypress-dialect webhook, carries
links.app: where that record opens in the Cypress app. Since 1.5.0.
"links": { "app": "https://app.getcypress.ai/go/deal/clx…" }Put it in a message, a ticket or your own screen, and whoever follows it lands
on the right page for them: a seller on the vehicle in Seller Hub, a buyer on
their side in Buyer Hub, someone who signed out on the sign-in screen and then
the record. Someone without access sees a plain "this link isn't available to
you", never the record. The link keeps working when pages move, so never
build these yourself; a task's links also lists what the task is about,
beside app.
A few links follow what changes underneath them. A plan's sale window opens the live window of the same weeks, even after the plan has moved to a new version and the id you hold is an old one. A task on a window, a lot or a sell goal opens that window, lot or goal's quarter. A Mission Control item opens what it is about (an offer in Seller Hub, a closing, a task where it is worked), or the board for a summary.
Start here
Quickstart
From an API key to your first signed webhook in ~15 minutes — collection, mock receiver, and a one-request push to market.
Pushing inventory
One vehicle or 500 at a time, how your feed's fields map, inspection reports read from their link, and keeping the whole inventory in step.
Sandbox
An organization of your own to build against, with vehicles, offers, a closing, a CRM book and a buy plan already in it, a key with every scope, and a reset your agent can call.
API reference
Every endpoint on both surfaces, interactive, with generated client code in five languages.
Vehicle lifecycle
What happens to a vehicle from push to sold — and what every status in a response or event actually means.
Webhooks
The envelope, the signature, the retry policy, and the full event catalog — including document events that carry the paper's contents as JSON.
Errors
One error shape on both surfaces, what every status means, and the stable codes to switch on.
Your organization and key
GET /api/v1/organization — products, channel grants, billing standing,
and a reason for every refusal, before you write a single retry.
Planning API (Sell planning)
Push the fleet in, keep it current, read the plan and drive it — sale windows, blockers, and the hand-off to Sell.
Planning API (Buy planning)
Keep a dealer's buy plan in step from your purchasing system — the quarter, targets, live matches and purchases, and the approval.
Apps and agents
Connecting an AI agent or an app has a section of its own, Apps & Agents: the MCP servers, a quickstart in a sandbox, what an agent may and may not do, keys and tokens, and every action of the app.
MCP quickstart
Connect an agent to a sandbox in ten minutes, and watch it list the fleet, put a car on the market and hand a decision to a person.
Connect Cypress
OAuth 2.1 for an app other organizations connect: an admin approves it, and its tokens act for that admin or for the agents it adds.
MCP servers
Cypress Operate works in an organization, Cypress Intelligence reads what Cypress knows, and the Cypress Manual needs no key at all.
The whole desk
The work around a sale, under the app's own rules whoever calls.
Offers
The offers on your vehicles and the ones you made: accept, decline, counter, withdraw. Below the floor stays with a person.
Your own ids
Push and look up vehicles, listings, contacts, companies, deals and tasks by your own systems' ids, and upsert a hundred at a time.
CRM
Your own book: contacts, companies and deals, their notes and interactions, and the deal stages.
Tasks
The work items people, automations and agents share: give, reassign, complete.
Mission Control
What needs a person now, and handing a row to one of your agents.
Closings
Every closing step, whose turn it is and its deadline; reminders, document requests and signing links.
Notifications
What Cypress told your people and agents, as events and as a list, and their preferences.
Marketing
Campaigns, the people they reached, the cars they brought people to, and your message templates.
Automations
Build, try and submit your own automations, and read every run step by step.
Insights
Cedar's and Sequoia's insights on your vehicles and buy targets, with what each rests on.
What's new in 1.9.0
Apps for every member, and the facts worked out. Every member of an
organization that connected an app signs in to it, on that connection, and a
Cypress Manager signs in to a Cypress app for one customer. Offers and
closings come with the date math and the ranking done (answerOrder,
urgency), vehicles gain comparable sales, damage lines, estimate_value
and read_import_file, accounts say their kind and limits (account), and
Huddle's conversations have their own scopes. See the 1.9.0 notes on each
page and the API reference's Changes in 1.9.0.
What's new in 1.8.0
Your inventory, kept in step. A push can carry the link of a Manheim
condition report (inspectionReportUrl): Cypress reads its grade, damages
and photos; floorPrice sets the floor and a saved location's name fills
its address. And removeMissing=true makes a bulk push your whole
inventory: the vehicles it leaves out are taken off, with their status in
the answer and in the VEHICLES.DISPOSITION.* events. See
Pushing inventory. Archiving changed for
every door: Cypress reviews a seller's archive only when the vehicle has
an open offer or a sale in progress; otherwise it is archived at once (see
De-listing). Two fixes: a re-push without
condition keeps a grade an inspection set, and the report endpoints are
documented as what they are.
What's new in 1.5.0
Apps and agents. Connect Cypress lets an
organization's admin approve an app (OAuth 2.1 with PKCE); an MCP client
needs no registration with Cypress, signing in with a client ID metadata document
or registering itself (RFC 7591). Its tokens act
for that admin or for the agents the app adds: members with the Agent
role, recorded under their own names. Three
MCP servers: Cypress Operate, Cypress
Intelligence, and the public Cypress Manual; Operate shows an agent its 13
core tools and reaches every other
operation through discovery. Some decisions are a person's
whoever asks and answer 403 PEOPLE_ONLY, nothing written: accepting
or countering below the floor from any caller, and from an agent setting
the floor, approving a quarter, confirming money arrived or sending a
campaign (the list).
GET /api/v1/members and /api/v1/connections list your people, agents
and connected apps.
The whole desk. Offers,
CRM, tasks,
Mission Control,
insights,
notifications,
closings,
marketing and your organization's own
automations (with
GET /api/v1/automation/manifest, the node catalog), each with a pair of
scopes (:read, :write). Every write takes ?dryRun=true (every
rule checked, nothing written: { "dryRun": true, "changes": … }, with
changes: null and a note when nothing would change) and an
Idempotency-Key: offers, listings, the CRM, tasks, Mission Control,
closings, marketing and automations, and the older writes too (vehicles,
their costs, odometer readings, ownership, sold-elsewhere and departures,
Planning's blockers and moves, Buy planning's targets, purchases and
quarters, notification preferences). The Sell plan gains its strategy, goals, the quarter
and its approval, and Sequoia's schedule; the Buy plan, Sequoia's draft of
a quarter. A goal keeps its kind (409 KIND_CHANGE).
Your own ids, in bulk, in a sandbox. Vehicles, listings, contacts,
companies, deals and tasks take externalIds and are found with
?externalId=source:id (Your own ids);
an id already on another record is 409 EXTERNAL_ID_TAKEN. Contacts,
companies, tasks and listings upsert a hundred at a time (/bulk). A
sandbox organization to build against,
with offers and a closing in it, that resets itself under the same key
(POST /api/v1/sandbox/reset).
Events. Every record and every Cypress-dialect event carries
links.app, where it opens in the app. New opt-in families: TASK.*,
NOTIFICATION.CREATED, the closing deadlines and requests
(CLOSING.STEP.DUE, CLOSING.STEP.OVERDUE, CLOSING.DOCUMENT.REQUESTED),
marketing (CAMPAIGN.*, CONTACT.UNSUBSCRIBED), AUTOMATION.*, the CRM
(CONTACT.CREATED, CONTACT.UPDATED, BUSINESS.*, DEAL.*, OUTREACH.*),
INSIGHT.CREATED, and the plans' goals, approvals and buy targets
(PLAN.GOAL.SET, PLAN.QUARTER.APPROVED, BUY.TARGET.CREATED,
BUY.TARGET.DUE, BUY.QUARTER.APPROVED). The
Cypress envelope gains a cursor: catch up with GET /api/v1/events,
deliver again with POST /api/v1/webhooks/subscriptions/{id}/replay, and
narrow a subscription to some records with entityIds. See
Webhooks.
The lists of vehicles, listings, offers, closings and tasks take
updatedAfter, as the CRM's do, to backfill a copy of your records
(Events and sync).
For agent platforms. The core operations as their own OpenAPI document,
in 3.1 and in 3.0 for importers that read no later version
(/api/public/openapi-core.json, /api/public/openapi-core-3.0.json);
Cypress's workflows as Agent Skills on the Manual; /llms.txt. See
Connecting from.
What an existing key can notice. A listing price change under a live
offer or a sale answers 409 CONFLICT, a buy-now below the floor
403 BELOW_FLOOR, and a buy-now on a vehicle with no floor
422 INVALID: on PATCH /api/v1/listings/{id}, on each item of
PATCH /api/v1/listings/bulk, and on the compat offering POST. All of
these used to be written. See
Pricing & listing rules.
A subscription without an event filter receives none of the new families,
and an existing key holds none of the new scopes until an admin adds them;
the Cypress envelope and records gain fields (links, cursor), and no
field was removed or renamed.
What's new in 1.4.0
Buy planning over the API. With Buy planning switched on (a switch of
its own) and a buy-planning:write key, your purchasing system reads and
sets the quarter's goal, budget and mandate, adds and edits targets, reads
their live matches (a listing's public facts only, never a seller), records
purchases made elsewhere, and approves the quarter — the same rules the app
uses. GET /api/v1/organization gains products.buyPlanning and the
capabilities buy-planning.read and buy-planning.write; a Buy route on an
organization without Buy planning answers 403 BUY_PLANNING_NOT_ENABLED.
The scope labels now read by side (Sell planning, Buy planning); the scope
strings are unchanged, so existing keys are too. Details in the
Planning API (Buy planning).
Buy planning webhooks. Three events tell your purchasing system when the
plan moves: BUY.TARGET.MATCHED (a live listing fits an open target for
the first time), BUY.TARGET.FILLED (a target has nothing left to buy)
and BUY.TARGET.ENDED (a target's quarter closed with units short). They
are opt-in, Cypress dialect only, need buy-planning:read to subscribe, and
are sent only while Buy planning is on. A subscription without an event
filter does not receive them, and each is delivered to an endpoint once. See
Webhooks.
The closed quarter, in the contract. A quarter whose last day has
passed is history, and its plan no longer changes, in the app or here. The
new code QUARTER_CLOSED (409) answers a move into a window of such a
quarter, a move to OPERATION or a park of a vehicle scheduled in one, a
track change of a planned vehicle in one, and the hand-off of one of its
windows. The request is refused whole, nothing is written, and the body
gains details.vehicleIds (the vehicles it blocks, so you can send the
rest again) and details.quarter. Every window of
GET /api/v1/planning/plan now carries quarter and closed:
read closed, not state, to know which windows take writes. What an
existing key can notice: those requests used to be accepted (a move into a
window, or a hand-off, answered 409 WINDOW_CLOSED only when the window
itself had closed, which is now answered only in a quarter still in
progress), and reasoning and plan.note no longer carry a plan version
number. A vehicle already in Sell can still change track, and
blockers and demotions are not refused. Details in
Closed quarters and
Errors.
OFFERS.ACCEPTED for every accepted offer. The webhook now follows the
app's "Offer accepted" for every deal, not only the ones a seller accepts by
hand or a rule accepts on arrival: it is also sent when a buyer accepts the
seller's counter and when a price change a Cypress manager approved accepts
an offer that now qualifies. An endpoint that listens for it (or has no event
filter) receives those events where it received none before. No field was
added to any event. See Webhooks.
What's new in 1.3.0
Planning over the API. With Planning switched on and a
planning:write key, push vehicles straight into Operation or
Planning (lifeStage: OPERATION / PLANNING, with purchase & financing),
keep them current — details, ownership, odometer readings, cost events,
departures — read the plan, and drive it: sale windows, the bench,
tracks, parking, blockers, and the hand-off to Sell (preview, then
confirm). Every write is one plan version; a busy plan answers
409 PLAN_BUSY with Retry-After. PLAN.* webhooks are opt-in and
Cypress-dialect only, and so are VEHICLES.* events about planning
stock. What an existing key can notice: a PATCH on planning stock
without planning:write now answers 403 SCOPE_MISSING (was
409 PLANNING_STOCK); /vehicles/{id}/ownership reads and replaces a
Sell vehicle's purchase & financing with just the vehicles scope; and a
Manheim-compatible bulk unit whose embedded offering names an ungranted
channel is now refused (422 CHANNEL_NOT_GRANTED) instead of created
without it. Details in the Planning API and
Errors.
What's new in 1.2.0
GET /api/v1/organization — what your organization and key may do,
with a reason for every refusal. Refusals across the API now carry a
stable code: ORG_NOT_ACTIVE, SCOPE_MISSING, PLANNING_NOT_ENABLED
and CHANNEL_NOT_GRANTED join PLANNING_STOCK and LIFE_STAGE_READ_ONLY.
Keys can now hold planning:read/planning:write scopes, letting
you list and read planning stock (?lifeStage=OPERATION,PLANNING) on an
organization with Planning. Two deliberate changes for existing keys:
planning stock at an organization without Planning now answers
403 PLANNING_NOT_ENABLED instead of 409 PLANNING_STOCK, and a
vehicles-only key pushing a vehicle/unit with an embedded listing/
offering now answers 403 SCOPE_MISSING for the listings scope instead
of creating it. Everything else is unchanged for vehicles you push and
sell today. Details in
Your organization and key,
Vehicle lifecycle
and Errors.
What's new in 1.1.0
Every vehicle now carries lifeStage — where it is in its life with the
fleet. The API works on Sell stock: vehicles a fleet keeps in Operation or
Planning are hidden, and Sell actions on them answer 409 PLANNING_STOCK.
Nothing changes for vehicles you push and sell today. Details in
Vehicle lifecycle and
Errors.
Two surfaces, one core
The Cypress API (/api/v1) is the canonical surface — resource nouns,
PATCH semantics, bulk to 500. The Manheim-compatible dialect
(/api/compatible/v1) mirrors Manheim's Units/Offerings/Subscribers
conventions for teams with existing client code. A vehicle pushed through
either is fully manageable through both.