Webhooks
When you create a quote request with a callbackUrl, QuoteFox will POST to that URL when the dealer completes the quote.
Webhook Delivery
- Event:
quote.completed - Method: POST
- Content-Type:
application/json - Retries: 3 attempts with exponential backoff (1s, 5s, 25s)
- Timeout: 10 seconds per attempt
Headers
| Header | Value |
|---|---|
Content-Type | application/json |
User-Agent | QuoteFox-Webhook/1.0 |
X-QuoteFox-Event | quote.completed |
Payload
json
{
"event": "quote.completed",
"quoteId": "quote-uuid",
"status": "sent",
"dealership": {
"name": "ABC Motors Melbourne",
"email": "sales@abcmotors.com.au"
},
"vehicle": {
"model": "MG ZS",
"version": "Excite 1.5L Auto",
"imageUrl": "https://..."
},
"pricing": {
"totalDriveAway": 34744,
"lineItems": {
"accessories": [
{ "name": "Tinted Windows", "price": 450 }
]
}
},
"clientName": "Fleet Corp Pty Ltd",
"clientEmail": "fleet@corp.com.au",
"sentAt": "2026-03-17T11:15:00Z"
}Handling Webhooks
Your endpoint should:
- Return a 2xx status code within 10 seconds to acknowledge receipt
- Process the data asynchronously if needed
- Be idempotent — you may receive the same webhook multiple times if initial delivery fails
Example Webhook Handler
python
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/webhooks/quotefox", methods=["POST"])
def handle_quotefox_webhook():
event = request.get_json()
if event["event"] == "quote.completed":
quote_id = event["quoteId"]
price = event["pricing"]["totalDriveAway"]
print(f"Quote {quote_id} completed — ${price:,}")
# Process the completed quote in your system
return jsonify({"received": True}), 200javascript
app.post("/webhooks/quotefox", (req, res) => {
const event = req.body;
if (event.event === "quote.completed") {
const { quoteId, pricing } = event;
console.log(`Quote ${quoteId} completed — $${pricing.totalDriveAway.toLocaleString()}`);
// Process the completed quote in your system
}
res.status(200).json({ received: true });
});Retry Behavior
If your endpoint returns a non-2xx status or times out, QuoteFox retries:
| Attempt | Delay | Total elapsed |
|---|---|---|
| 1 | Immediate | 0s |
| 2 | 1 second | ~1s |
| 3 | 5 seconds | ~6s |
After 3 failed attempts, the webhook is abandoned. The quote data remains available via GET /quotes/:id.