Skip to content

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

HeaderValue
Content-Typeapplication/json
User-AgentQuoteFox-Webhook/1.0
X-QuoteFox-Eventquote.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:

  1. Return a 2xx status code within 10 seconds to acknowledge receipt
  2. Process the data asynchronously if needed
  3. 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}), 200
javascript
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:

AttemptDelayTotal elapsed
1Immediate0s
21 second~1s
35 seconds~6s

After 3 failed attempts, the webhook is abandoned. The quote data remains available via GET /quotes/:id.

QuoteFox API Documentation