Closings
The closings of the cars you sold and bought, step by step, with who carries each deadline and whose turn it is.
TL;DRAI summary
This chapter explains how your systems can track a vehicle sale as it moves from a deal to actual pickup. You can see all the steps needed, like paying the commission or getting a gate pass, and who is responsible for each one. This helps you manage your workflow efficiently.
After an offer is accepted, a closing takes the car from a deal to a pickup: the commission fee, the Bill of Sale, the funds, the gate pass, the title and the pickup. The API reads every closing your organization is a party to, so your systems and agents can see what is waiting, on whom, and by when. Since 1.5.0.
| Scope | Grants |
|---|---|
closing:read | GET /api/v1/closings and GET /api/v1/closings/{id}, and subscribing to CLOSING.STEP.DUE, CLOSING.STEP.OVERDUE and CLOSING.DOCUMENT.REQUESTED |
closing:write | Everything closing:read grants, plus reminding, asking for a document, re-sending a signing link and marking your own steps done |
Neither is a default scope. Both an API key and a Connect Cypress token are accepted.
Read
curl "$BASE/api/v1/closings?status=IN_PROGRESS&yourTurn=true" -H "authorization: Bearer $TOKEN"
curl "$BASE/api/v1/closings/cls_…" -H "authorization: Bearer $TOKEN"Each closing says which side you are on, SELLER for a car you sold and
BUYER for one you bought, and lists its steps:
| Field | Meaning |
|---|---|
key | FEE, BOS, CONFIRM_FUNDS, GATE_PASS, TITLE, PICKUP. Older closings may also carry BUYER_SIGN, PAYMENT and TITLE_RECEIPT. Key off this, never the step number |
deadlineOwner | Who carries the step's deadline: SELLER on a self-serve channel (a direct link or your storefront), where your team does the paperwork, else CYPRESS |
turn, yourTurn | Who must act now on an open step: SELLER, BUYER or CYPRESS. On the Bill of Sale it follows the signatures: the seller signs first, then the buyer |
dueDate, overdue | The step's deadline, set when it unlocks, and whether an open step is past it |
documents | The latest document in each slot, with its signatures |
titleShipment | The title's carrier and tracking number, once the seller sent it |
currentStep is the first open step that holds the closing up. requirements
lists the documents the closing needs, what fills each, whether Cypress waived
it, and whether it is satisfied.
What each side sees
- Signing links are your own side's. Each signature names its party and
status; only your side's carry
signingLinkandemail. An outside signer is emailed by Cypress's signing service and has neither. - The commission is the seller's. The
FEEstep, and any requirement on it, is in the seller's view only. - No money detail, and the other party by name only. No payment
instructions, bank or lender accounts, invoices, amounts paid or references.
priceis the agreed price.counterpartynames the other company (its side and its organization's name, as the closing page in the app shows it): it is your own trade, and the Bill of Sale names both. Never a person or a contact detail. - Only your closings. Another company's closing answers
404, as one that does not exist.
Move a closing along
Three acts, none of which changes a step: they tell the people who must act.
Each takes ?dryRun=true to see what would happen and an Idempotency-Key
for safe retries, is recorded in your audit log with the key or app that did
it, and can be repeated only after a while (a 409 carries retryAfter).
# Remind whoever's turn the Bill of Sale is
curl -X POST "$BASE/api/v1/closings/cls_…/steps/BOS/remind" -H "authorization: Bearer $TOKEN"
# Ask for a document a requirement still lacks
curl -X POST "$BASE/api/v1/closings/cls_…/document-requests" \
-H "authorization: Bearer $TOKEN" -H "content-type: application/json" \
-d '{ "requirementId": "req_…" }'
# Email a signer their signing link again
curl -X POST "$BASE/api/v1/closings/cls_…/documents/doc_…/signatures/buyer/resend" \
-H "authorization: Bearer $TOKEN"| Act | Who hears it | Again after |
|---|---|---|
| Remind | Whoever's turn the step is: the seller's fleet managers and admins (with your account manager copied), the buyer, or Cypress | An hour |
| Ask for a document | Whoever does the requirement's step: the seller for most papers, the buyer for the pickup's. Both sides' systems also get CLOSING.DOCUMENT.REQUESTED | An hour |
| Re-send a signing link | The signer, by email from Cypress's signing service. The seller may re-send to anyone on the document; a buyer to its own signers. Signing goes in order, so a link is not re-sent before its signer's turn | Ten minutes |
Mark your own steps
Your side's own steps can be marked done through the API. The same step action the app runs does the work, with the same checks, notifications and events:
| Side | Step | Action | Fields |
|---|---|---|---|
| Seller | CONFIRM_FUNDS | confirm_funds | method (ACH or CHECK), reference, carrier, note |
| Seller | GATE_PASS | issue_gate_pass | address, city, state, zip |
| Seller | TITLE | submit_title_tracking | carrier, trackingNumber, titleHolder, titleHolderType, titleHolderAddress |
| Seller | TITLE | confirm_check_cleared | none (check payments only) |
| Buyer | PICKUP | confirm_pickup | none; it completes the sale |
curl -X POST "$BASE/api/v1/closings/cls_…/steps/GATE_PASS/actions" \
-H "authorization: Bearer $TOKEN" -H "content-type: application/json" \
-d '{ "action": "issue_gate_pass", "address": "1 Lot Rd", "city": "Austin", "state": "TX", "zip": "78701" }'The answer is the step's and the closing's status afterwards. The other side's
step is 403 POLICY_DENIED; a step that is not open yet, or a requirement still
missing, is 409. Cypress's own actions, such as approving a Bill of Sale, are
never offered.
Deadlines as events
Three events follow a closing while it waits on someone:
| Event | When |
|---|---|
CLOSING.STEP.DUE | An open step's deadline is less than 12 hours away |
CLOSING.STEP.OVERDUE | An open step's deadline has passed |
CLOSING.DOCUMENT.REQUESTED | Someone asked for a document a requirement still lacks; the body names the requirement, who it is askedOf, who requestedBy, and yourDocument |
- Both sides hear them. Unlike the other
CLOSING.*events, which go to the seller, these go to the seller and to the buyer, each in its own organization. The commission step's go to the seller only. - They say whose turn it is. The body is the step as your side sees it:
{
"closingId": "cls_…",
"side": "BUYER",
"vehicleId": "clx…",
"step": {
"key": "PICKUP", "number": 6, "label": "Vehicle pickup",
"deadlineOwner": "CYPRESS", "turn": "BUYER", "yourTurn": true,
"dueDate": "2026-10-16T09:00:00.000Z"
}
}- Once each. A step is told once per deadline; a deadline that moves is told again.
- Opt-in. Only a Cypress-dialect subscription that lists the event gets it,
and subscribing needs
closing:read. The envelope'shrefis/api/v1/closings/{id}.