Skip to main content

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.