Send Quote
Send (or resend) the quote to the customer. Mints the private customer link on first send, emails it, and stamps sent_at. Resending after an edit restamps sent_at, so the quote list always reflects the latest send.
POST /v1/quotes/{id}/send
The customer's email shows a private link (no login required) to a page with everything included, the price, any deposit due on acceptance, and the agreement to read and sign โ plus Accept and Decline buttons.
Authenticationโ
Requires a valid API key with quotes:write scope.
Path Parametersโ
| Parameter | Type | Description |
|---|---|---|
id | integer | Quote ID |
Request Exampleโ
curl -X POST "https://app.equipdash.com/api/v1/quotes/123/send" \
-H "Authorization: Bearer YOUR_API_KEY"
Responseโ
Returns 200 OK with the updated quote. customer_url is now populated and state is sent (until the customer opens the page, which moves it to viewed).
{
"data": {
"id": 123,
"quote_number": "Q-123",
"state": "sent",
"sent_at": "2026-02-01T10:05:00+00:00",
"customer_url": "https://app.equipdash.com/quote/AbC123dEf456...",
"...": "..."
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2026-02-01T10:05:00+00:00"
}
}
Error Responsesโ
Send fails with 422 quote_send_failed when:
- The quote has already been decided (accepted or declined)
- The quote has expired โ extend its
quote_valid_untilfirst via Update Quote - The customer has no email address on file
| Status | Code | Description |
|---|---|---|
| 401 | authentication_required | Missing or invalid API key |
| 403 | insufficient_scope | API key lacks quotes:write scope |
| 404 | not_found | Quote not found (or belongs to another account) |
| 422 | quote_send_failed | The quote cannot be sent (see reasons above) |