Webhooks
Webhooks allow you to receive real-time updates for your active deliveries. We'll POST updates to a
URL of your choosing every 20 seconds, allowing you to get the most up-to-date information to show to your customers.
Configuring Webhook Ingestion Endpoint
To setup webhooks for your account, please get in touch. We'll configure your account to send webhooks to a specific URL.
Summary
- Webhooks sent every 20 seconds
- Sent until delivery is terminated (delivered, canceled, returned, etc.), plus one more if the final price settles afterwards
- Images attached as your delivery progresses
- Location updated as your delivery progresses
Sandbox
Deliveries booked with your Sandbox key will simulate a delivery. Your sandboxed delivery will cycle through the appropriate statuses, which you will be able to observe through the webhook.
Example Payload
You can find an example webhook payload below:
{
"id": "del_XXXXXXXXXX",
"trackingUrl": "https://app.curri.com/track/C-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"meta": {
"orderNumber": "ABCDEFG",
"poNumber": "abcdefg",
"bolNumber": "1234567",
"pickupNote": "",
"dropoffNote": ""
},
"origin": {
"name": "Los Angeles Airport",
"addressLine1": "1 World Way",
"addressLine2": "",
"city": "Los Angeles",
"state": "CA",
"postalCode": "90045",
"latitude": "33.9432786",
"longitude": "-118.4238303"
},
"destination": {
"name": "Long Beach Airport",
"addressLine1": "4100 Donald Douglas Dr",
"addressLine2": "",
"city": "Long Beach",
"state": "CA",
"postalCode": "90808",
"latitude": "36.7905004",
"longitude": "-106.4353203"
},
"distance": "12345",
"estimatedTravelTime": "6789",
"deliveryMethod": "car",
"driver": {
"id": "driver_XXXXXXXXXX",
"firstName": "John",
"lastName": "Smith",
"phoneNumber": "+13235555555",
"activeVehicle": {
"make": "Make",
"model": "Q5",
"trim": "Trim",
"year": 2020,
"color": "Black"
}
},
"location": {
"latitude": 33.9432786,
"longitude": -118.4238303
},
"accountLocation": "My Branch",
"price": "12345",
"finalAdjustedPrice": "12345",
"chargeType": "delivery",
"images": ["https://path/to/file/A", "https://path/to/file/B"],
"status": "delivered",
"cancellationReason": null,
"createdAt": "2025-09-20T12:30:00.000Z",
"scheduledAt": null,
"deliveredAt": "2025-09-20T14:45:00.000Z",
"isSandbox": false
}
When the delivery is canceled (status is "canceled"), cancellationReason is one of the cancellation reason values (e.g. "User Requested", "Driver Issue"). When the delivery is not canceled, cancellationReason is null.
Final adjusted price
price is the quote from booking and never changes. finalAdjustedPrice is the
settled order total — what the delivery is actually billed — and chargeType
says what that amount represents: "delivery", "cancellation_fee", or
"no_charge". Both are null until an order total exists.
The two diverge whenever a delivery is repriced or canceled: a canceled delivery
keeps its original price while finalAdjustedPrice drops to the cancellation
fee. Because the total can settle after the delivery ends, Curri sends another
webhook when it moves — a repeat request on an already-terminal delivery is an
updated price, not a duplicate. Bill from finalAdjustedPrice.