API reference · Rentals
Rental bookings
Price a trip, book it, manage it, check the customer in, cancel it.
- post/rentals/quotesPrice a trip
- post/rentals/bookingsCreate a booking
- get/rentals/bookingsList bookings
- get/rentals/bookings/{reference}Get a booking
- patch/rentals/bookings/{reference}Update a booking
- post/rentals/bookings/{reference}/cancelCancel a booking
- post/rentals/bookings/{reference}/checkinOnline check-in
/rentals/quotesPrice a trip
The exact price for a car, dates and extras, before anything is created. Adds a one-way fee when the drop-off is a different airport.
Request body · application/json
vehicleIdintegerrequiredfromdate-timerequiredISO 8601 date-time.
todate-timerequiredISO 8601 date-time.
extrasarray of stringdropoffLocationstringAirport code. Default: the car’s own airport.
Response 200
In data:
currencystringAlways NGN.
daysintegerrequiredBillable days: 24-hour blocks from pick-up, with 60 minutes’ grace.
dailyRateintegerAmount in kobo (₦1 = 100 kobo).
linesarray of QuoteLinerequiredShow 6 fields
codestringrequiredrental, an extra’s code, one_way or discount.
labelstringrequiredquantityintegerunitAmountintegerAmount in kobo (₦1 = 100 kobo).
amountintegerrequiredNegative for a discount.
pricingenumper_dayflatdiscount
listSubtotalintegerBefore any discount.
discountobject · nullableShow 3 fields
codestringlabelstringamountintegerAmount in kobo (₦1 = 100 kobo).
subtotalintegerrequiredWhat the rental costs (car + extras). Revenue is split from this.
depositintegerrequiredRefundable hold, never revenue.
totalintegerrequiredsubtotal + deposit: what is charged up front.
Errors
400invalid: something in the request is wrong. The message says what.401unauthorized: the API key is missing, wrong or revoked.404not_found: no such thing, or it is not yours.
curl -X POST "https://engine-production-0004.up.railway.app/api/v1/rentals/quotes" \
-H "Authorization: Bearer wc_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"vehicleId": 12,
"from": "2026-11-20T10:00:00+01:00",
"to": "2026-11-23T10:00:00+01:00",
"extras": [
"gps"
],
"dropoffLocation": "ABV"
}'{
"data": {
"currency": "NGN",
"days": 3,
"dailyRate": 4500000,
"lines": [
{
"code": "rental",
"label": "Car rental",
"quantity": 3,
"unitAmount": 4500000,
"amount": 13500000
},
{
"code": "gps",
"label": "GPS navigation",
"quantity": 3,
"unitAmount": 150000,
"amount": 450000
}
],
"listSubtotal": 13950000,
"discount": null,
"subtotal": 13950000,
"deposit": 8000000,
"total": 21950000
}
}/rentals/bookingsCreate a booking
Holds the car for about 20 minutes and returns a checkoutUrl to send the customer to. The booking becomes confirmed by itself when the payment succeeds: you do not call anything. Two customers can never hold the same car for overlapping dates; the loser gets 409.
Headers
Idempotency-KeystringA unique value you choose (a UUID). Repeat the request with the same key and you get the same result, not a second booking.
Example:
6b2f7c3e-6f0a-4a3e-9d1c-1c2b6f1a9e55
Request body · application/json
vehicleIdintegerrequiredfromdate-timerequiredISO 8601 date-time.
todate-timerequiredISO 8601 date-time.
pickupLocationstringAirport code. Default: the car’s own.
dropoffLocationstringextrasarray of stringcustomerCustomerInputrequiredShow 6 fields
namestringrequiredFull name as on the driver’s licence.
emailstringrequiredphonestringrequiredlicenseNumberstringrequiredThe driver’s licence number.
licenseExpirydate-timeMust be after the rental ends.
licenseCountrystringISO country code. Default NG.
flightNumberstringArrival flight, e.g. W3123.
metadataobjectUp to 10 pairs, keys up to 40 characters, values up to 500.
returnUrlstringWhere the customer lands after paying. We add ?booking=WC-…
Response 201
In data:
referencestringrequirede.g. WC-7KQ2M9XA. Show it to your customer.
statusenumrequiredpending_paymentconfirmedactivecompletedcancelledexpiredtestbooleanTrue for a sandbox booking.
fromdate-timerequiredISO 8601 date-time.
todate-timerequiredISO 8601 date-time.
vehicleVehiclerequiredShow 15 fields
idintegerrequiredtitlestringrequirede.g. “2021 Toyota Camry”.
makestringmodelstringyearintegerclassenumrequiredeconomysedansuvvanluxurytransmissionenumautomaticmanualfuelenumpetroldieselhybridelectricseatsintegercolourstring · nullablephotosarray of stringdailyRateintegerrequiredPrice per 24 hours.
depositintegerRefundable deposit.
locationobjectrequiredShow 4 fields
idintegercodestringrequirednamestringcitystring
ratingobject · nullableShow 2 fields
averagenumberAverage of 1 to 5 stars, one decimal.
countintegerPublished reviews of this car.
pickupobjectShow 3 fields
codestringnamestringinstructionsstring · nullable
dropoffobjectShow 2 fields
codestringnamestring
customerCustomerShow 3 fields
namestringrequiredemailstringrequiredphonestringrequiredInternational format preferred, e.g. +2348031234567.
priceobjectrequiredShow 9 fields
currencystringdaysintegerlinesarray of QuoteLineShow 6 fields
codestringrequiredrental, an extra’s code, one_way or discount.
labelstringrequiredquantityintegerunitAmountintegerAmount in kobo (₦1 = 100 kobo).
amountintegerrequiredNegative for a discount.
pricingenumper_dayflatdiscount
listSubtotalintegerAmount in kobo (₦1 = 100 kobo).
discountobject · nullableShow 2 fields
codestring · nullableamountintegerAmount in kobo (₦1 = 100 kobo).
subtotalintegerAmount in kobo (₦1 = 100 kobo).
depositintegerAmount in kobo (₦1 = 100 kobo).
totalintegerAmount in kobo (₦1 = 100 kobo).
refundedintegerAmount in kobo (₦1 = 100 kobo).
commissionintegerYour commission on this booking (businesses only).
flightNumberstring · nullablecheckedInAtdate-time · nullableISO 8601 date-time.
arrivalNotestring · nullablemetadataobjectYour own key/value pairs.
createdAtdate-timeISO 8601 date-time.
holdExpiresAtdate-time · nullableWhile unpaid: when the car is released.
checkoutUrlstringSend the customer here to pay (only while unpaid).
cancellationobjectShow 8 fields
allowedbooleanFalse once it is cancelled, collected or finished.
refundPercentintegerShare of the rental price refunded if cancelled right now: 100 (12 h or more before pick-up), 95 (6 to 12 h), 90 (under 6 h). The deposit always comes back in full.
rentalRefundintegerAmount in kobo (₦1 = 100 kobo).
feeintegerThe cancellation fee that would be kept.
depositReturnedintegerAmount in kobo (₦1 = 100 kobo).
refundTotalintegerWhat goes back to the customer in all.
changesAtdate-time · nullableWhen the refund drops to the next level.
nextPercentinteger · nullableThe refund percent from then on.
earlyReturnobject · nullableShow 7 fields
requestedAtdate-time · nullableWhen the customer asked to return early (the clock stops there if the car arrives within the grace period).
timeBasedPaidintegerThe part of the rental price that is for time (spread evenly over the booked period).
bookedSecondsintegerusedSecondsintegerunusedSecondsintegerrentalRefundintegerRefund for the unused time if the car is returned now.
depositReturnedintegerAmount in kobo (₦1 = 100 kobo).
overstayobject · nullableShow 5 fields
lateSecondsintegerSeconds past the return time.
graceSecondsintegerFree seconds after the return time.
billedSecondsintegerLate seconds that are charged (after the grace period).
ratePerHourintegerThe late rate per hour, frozen when the booking was made.
chargeSoFarintegerThe late charge if the car were handed back now (it runs to the second).
lateTermsobjectShow 2 fields
ratePerHourintegerWhat a late return costs per hour (to the second) once the grace period has passed. Frozen when the booking was made.
graceMinutesintegerFree minutes after the return time.
tripUpdatesobject · nullableShow 2 fields
whatsappbooleanTrue when the customer opted in to WhatsApp updates.
schedulearray of objectShow 4 fields
stagestringlabelstringatdate-timeISO 8601 date-time.
doneboolean
reviewobjectShow 2 fields
allowedbooleanTrue once the car is returned and no review has been left yet.
submittedAtdate-time · nullableISO 8601 date-time.
returnedAtdate-time · nullableWhen the car was handed back.
balanceobject · nullableShow 2 fields
dueintegerWhat the customer still owes after the car came back (a late charge larger than the deposit).
paidAtdate-time · nullableISO 8601 date-time.
settlementSettlement | nullThe closing statement, once the booking is cancelled or the car is back.
Errors
400invalid: something in the request is wrong. The message says what.401unauthorized: the API key is missing, wrong or revoked.404not_found: no such thing, or it is not yours.409conflict or unavailable: not possible in the current state, or the car was just taken.429rate_limited: more than 120 requests a minute. Wait for RateLimit-Reset seconds.
curl -X POST "https://engine-production-0004.up.railway.app/api/v1/rentals/bookings" \
-H "Authorization: Bearer wc_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6b2f7c3e-6f0a-4a3e-9d1c-1c2b6f1a9e55" \
-d '{
"vehicleId": 12,
"from": "2026-11-20T10:00:00+01:00",
"to": "2026-11-23T10:00:00+01:00",
"pickupLocation": "ABV",
"dropoffLocation": "ABV",
"extras": [
"gps"
],
"customer": {
"name": "Chidi Obi",
"email": "chidi@example.com",
"phone": "+2348031234567",
"licenseNumber": "ABC12345",
"licenseExpiry": "2029-05-01T00:00:00+01:00"
},
"flightNumber": "W3123",
"metadata": {
"order_id": "A-1001"
},
"returnUrl": "https://shop.example/booking"
}'{
"data": {
"reference": "WC-7KQ2M9XA",
"status": "pending_payment",
"test": false,
"from": "2026-11-20T09:00:00.000Z",
"to": "2026-11-23T09:00:00.000Z",
"vehicle": {
"id": 12,
"title": "2021 Toyota Camry",
"make": "Toyota",
"model": "Camry",
"year": 2021,
"class": "sedan",
"transmission": "automatic",
"fuel": "petrol",
"seats": 5,
"colour": "Silver",
"photos": [
"https://api.waca.com.ng/api/media/file/camry-1.jpg"
],
"dailyRate": 4500000,
"deposit": 8000000,
"location": {
"id": 1,
"code": "ABV",
"name": "Nnamdi Azikiwe International Airport, Abuja",
"city": "abuja"
}
},
"pickup": {
"code": "ABV",
"name": "Nnamdi Azikiwe International Airport, Abuja",
"instructions": "Meet our agent at the arrivals hall, next to the information desk."
},
"dropoff": {
"code": "ABV",
"name": "Nnamdi Azikiwe International Airport, Abuja"
},
"customer": {
"name": "Chidi Obi",
"email": "chidi@example.com",
"phone": "+2348031234567"
},
"price": {
"currency": "NGN",
"days": 3,
"lines": [
{
"code": "rental",
"label": "Car rental",
"quantity": 3,
"unitAmount": 4500000,
"amount": 13500000
},
{
"code": "gps",
"label": "GPS navigation",
"quantity": 3,
"unitAmount": 150000,
"amount": 450000
}
],
"listSubtotal": 13950000,
"discount": null,
"subtotal": 13950000,
"deposit": 8000000,
"total": 21950000,
"refunded": 0
},
"commission": 2092500,
"flightNumber": "W3123",
"checkedInAt": null,
"arrivalNote": null,
"metadata": {
"order_id": "A-1001"
},
"createdAt": "2026-11-01T12:00:00.000Z",
"holdExpiresAt": "2026-11-01T12:20:00.000Z",
"checkoutUrl": "https://checkout.paystack.com/abc123"
}
}/rentals/bookingsList bookings
Your own bookings, newest first. A business sees everything any of its keys made.
Query parameters
statusstringpending_payment, confirmed, active, completed, cancelled or expired.
pending_paymentconfirmedactivecompletedcancelledexpiredfromstringPick-up on or after.
tostringPick-up before.
emailstringThe customer’s email (any case).
vehicle_idintegerOnly this car.
created_fromstringMade on or after.
created_tostringMade before.
pageintegerPage number, from 1.
Example:
1limitintegerItems per page (1–100). Default 20.
Example:
20
Response 200
A page: { data: [ … ], page, totalPages, total }. Each item in data:
referencestringrequirede.g. WC-7KQ2M9XA. Show it to your customer.
statusenumrequiredpending_paymentconfirmedactivecompletedcancelledexpiredtestbooleanTrue for a sandbox booking.
fromdate-timerequiredISO 8601 date-time.
todate-timerequiredISO 8601 date-time.
vehicleVehiclerequiredShow 15 fields
idintegerrequiredtitlestringrequirede.g. “2021 Toyota Camry”.
makestringmodelstringyearintegerclassenumrequiredeconomysedansuvvanluxurytransmissionenumautomaticmanualfuelenumpetroldieselhybridelectricseatsintegercolourstring · nullablephotosarray of stringdailyRateintegerrequiredPrice per 24 hours.
depositintegerRefundable deposit.
locationobjectrequiredShow 4 fields
idintegercodestringrequirednamestringcitystring
ratingobject · nullableShow 2 fields
averagenumberAverage of 1 to 5 stars, one decimal.
countintegerPublished reviews of this car.
pickupobjectShow 3 fields
codestringnamestringinstructionsstring · nullable
dropoffobjectShow 2 fields
codestringnamestring
customerCustomerShow 3 fields
namestringrequiredemailstringrequiredphonestringrequiredInternational format preferred, e.g. +2348031234567.
priceobjectrequiredShow 9 fields
currencystringdaysintegerlinesarray of QuoteLineShow 6 fields
codestringrequiredrental, an extra’s code, one_way or discount.
labelstringrequiredquantityintegerunitAmountintegerAmount in kobo (₦1 = 100 kobo).
amountintegerrequiredNegative for a discount.
pricingenumper_dayflatdiscount
listSubtotalintegerAmount in kobo (₦1 = 100 kobo).
discountobject · nullableShow 2 fields
codestring · nullableamountintegerAmount in kobo (₦1 = 100 kobo).
subtotalintegerAmount in kobo (₦1 = 100 kobo).
depositintegerAmount in kobo (₦1 = 100 kobo).
totalintegerAmount in kobo (₦1 = 100 kobo).
refundedintegerAmount in kobo (₦1 = 100 kobo).
commissionintegerYour commission on this booking (businesses only).
flightNumberstring · nullablecheckedInAtdate-time · nullableISO 8601 date-time.
arrivalNotestring · nullablemetadataobjectYour own key/value pairs.
createdAtdate-timeISO 8601 date-time.
holdExpiresAtdate-time · nullableWhile unpaid: when the car is released.
checkoutUrlstringSend the customer here to pay (only while unpaid).
cancellationobjectShow 8 fields
allowedbooleanFalse once it is cancelled, collected or finished.
refundPercentintegerShare of the rental price refunded if cancelled right now: 100 (12 h or more before pick-up), 95 (6 to 12 h), 90 (under 6 h). The deposit always comes back in full.
rentalRefundintegerAmount in kobo (₦1 = 100 kobo).
feeintegerThe cancellation fee that would be kept.
depositReturnedintegerAmount in kobo (₦1 = 100 kobo).
refundTotalintegerWhat goes back to the customer in all.
changesAtdate-time · nullableWhen the refund drops to the next level.
nextPercentinteger · nullableThe refund percent from then on.
earlyReturnobject · nullableShow 7 fields
requestedAtdate-time · nullableWhen the customer asked to return early (the clock stops there if the car arrives within the grace period).
timeBasedPaidintegerThe part of the rental price that is for time (spread evenly over the booked period).
bookedSecondsintegerusedSecondsintegerunusedSecondsintegerrentalRefundintegerRefund for the unused time if the car is returned now.
depositReturnedintegerAmount in kobo (₦1 = 100 kobo).
overstayobject · nullableShow 5 fields
lateSecondsintegerSeconds past the return time.
graceSecondsintegerFree seconds after the return time.
billedSecondsintegerLate seconds that are charged (after the grace period).
ratePerHourintegerThe late rate per hour, frozen when the booking was made.
chargeSoFarintegerThe late charge if the car were handed back now (it runs to the second).
lateTermsobjectShow 2 fields
ratePerHourintegerWhat a late return costs per hour (to the second) once the grace period has passed. Frozen when the booking was made.
graceMinutesintegerFree minutes after the return time.
tripUpdatesobject · nullableShow 2 fields
whatsappbooleanTrue when the customer opted in to WhatsApp updates.
schedulearray of objectShow 4 fields
stagestringlabelstringatdate-timeISO 8601 date-time.
doneboolean
reviewobjectShow 2 fields
allowedbooleanTrue once the car is returned and no review has been left yet.
submittedAtdate-time · nullableISO 8601 date-time.
returnedAtdate-time · nullableWhen the car was handed back.
balanceobject · nullableShow 2 fields
dueintegerWhat the customer still owes after the car came back (a late charge larger than the deposit).
paidAtdate-time · nullableISO 8601 date-time.
settlementSettlement | nullThe closing statement, once the booking is cancelled or the car is back.
Errors
400invalid: something in the request is wrong. The message says what.401unauthorized: the API key is missing, wrong or revoked.
curl "https://engine-production-0004.up.railway.app/api/v1/rentals/bookings?page=1&limit=20" \
-H "Authorization: Bearer wc_test_YOUR_KEY"/rentals/bookings/{reference}Get a booking
An unpaid booking carries its checkoutUrl, so a customer can come back and pay.
Path parameters
referencestringrequiredThe booking reference.
Example:
WC-7KQ2M9XA
Response 200
In data:
referencestringrequirede.g. WC-7KQ2M9XA. Show it to your customer.
statusenumrequiredpending_paymentconfirmedactivecompletedcancelledexpiredtestbooleanTrue for a sandbox booking.
fromdate-timerequiredISO 8601 date-time.
todate-timerequiredISO 8601 date-time.
vehicleVehiclerequiredShow 15 fields
idintegerrequiredtitlestringrequirede.g. “2021 Toyota Camry”.
makestringmodelstringyearintegerclassenumrequiredeconomysedansuvvanluxurytransmissionenumautomaticmanualfuelenumpetroldieselhybridelectricseatsintegercolourstring · nullablephotosarray of stringdailyRateintegerrequiredPrice per 24 hours.
depositintegerRefundable deposit.
locationobjectrequiredShow 4 fields
idintegercodestringrequirednamestringcitystring
ratingobject · nullableShow 2 fields
averagenumberAverage of 1 to 5 stars, one decimal.
countintegerPublished reviews of this car.
pickupobjectShow 3 fields
codestringnamestringinstructionsstring · nullable
dropoffobjectShow 2 fields
codestringnamestring
customerCustomerShow 3 fields
namestringrequiredemailstringrequiredphonestringrequiredInternational format preferred, e.g. +2348031234567.
priceobjectrequiredShow 9 fields
currencystringdaysintegerlinesarray of QuoteLineShow 6 fields
codestringrequiredrental, an extra’s code, one_way or discount.
labelstringrequiredquantityintegerunitAmountintegerAmount in kobo (₦1 = 100 kobo).
amountintegerrequiredNegative for a discount.
pricingenumper_dayflatdiscount
listSubtotalintegerAmount in kobo (₦1 = 100 kobo).
discountobject · nullableShow 2 fields
codestring · nullableamountintegerAmount in kobo (₦1 = 100 kobo).
subtotalintegerAmount in kobo (₦1 = 100 kobo).
depositintegerAmount in kobo (₦1 = 100 kobo).
totalintegerAmount in kobo (₦1 = 100 kobo).
refundedintegerAmount in kobo (₦1 = 100 kobo).
commissionintegerYour commission on this booking (businesses only).
flightNumberstring · nullablecheckedInAtdate-time · nullableISO 8601 date-time.
arrivalNotestring · nullablemetadataobjectYour own key/value pairs.
createdAtdate-timeISO 8601 date-time.
holdExpiresAtdate-time · nullableWhile unpaid: when the car is released.
checkoutUrlstringSend the customer here to pay (only while unpaid).
cancellationobjectShow 8 fields
allowedbooleanFalse once it is cancelled, collected or finished.
refundPercentintegerShare of the rental price refunded if cancelled right now: 100 (12 h or more before pick-up), 95 (6 to 12 h), 90 (under 6 h). The deposit always comes back in full.
rentalRefundintegerAmount in kobo (₦1 = 100 kobo).
feeintegerThe cancellation fee that would be kept.
depositReturnedintegerAmount in kobo (₦1 = 100 kobo).
refundTotalintegerWhat goes back to the customer in all.
changesAtdate-time · nullableWhen the refund drops to the next level.
nextPercentinteger · nullableThe refund percent from then on.
earlyReturnobject · nullableShow 7 fields
requestedAtdate-time · nullableWhen the customer asked to return early (the clock stops there if the car arrives within the grace period).
timeBasedPaidintegerThe part of the rental price that is for time (spread evenly over the booked period).
bookedSecondsintegerusedSecondsintegerunusedSecondsintegerrentalRefundintegerRefund for the unused time if the car is returned now.
depositReturnedintegerAmount in kobo (₦1 = 100 kobo).
overstayobject · nullableShow 5 fields
lateSecondsintegerSeconds past the return time.
graceSecondsintegerFree seconds after the return time.
billedSecondsintegerLate seconds that are charged (after the grace period).
ratePerHourintegerThe late rate per hour, frozen when the booking was made.
chargeSoFarintegerThe late charge if the car were handed back now (it runs to the second).
lateTermsobjectShow 2 fields
ratePerHourintegerWhat a late return costs per hour (to the second) once the grace period has passed. Frozen when the booking was made.
graceMinutesintegerFree minutes after the return time.
tripUpdatesobject · nullableShow 2 fields
whatsappbooleanTrue when the customer opted in to WhatsApp updates.
schedulearray of objectShow 4 fields
stagestringlabelstringatdate-timeISO 8601 date-time.
doneboolean
reviewobjectShow 2 fields
allowedbooleanTrue once the car is returned and no review has been left yet.
submittedAtdate-time · nullableISO 8601 date-time.
returnedAtdate-time · nullableWhen the car was handed back.
balanceobject · nullableShow 2 fields
dueintegerWhat the customer still owes after the car came back (a late charge larger than the deposit).
paidAtdate-time · nullableISO 8601 date-time.
settlementSettlement | nullThe closing statement, once the booking is cancelled or the car is back.
Errors
401unauthorized: the API key is missing, wrong or revoked.404not_found: no such thing, or it is not yours.
curl "https://engine-production-0004.up.railway.app/api/v1/rentals/bookings/WC-7KQ2M9XA" \
-H "Authorization: Bearer wc_test_YOUR_KEY"{
"data": {
"reference": "WC-7KQ2M9XA",
"status": "pending_payment",
"test": false,
"from": "2026-11-20T09:00:00.000Z",
"to": "2026-11-23T09:00:00.000Z",
"vehicle": {
"id": 12,
"title": "2021 Toyota Camry",
"make": "Toyota",
"model": "Camry",
"year": 2021,
"class": "sedan",
"transmission": "automatic",
"fuel": "petrol",
"seats": 5,
"colour": "Silver",
"photos": [
"https://api.waca.com.ng/api/media/file/camry-1.jpg"
],
"dailyRate": 4500000,
"deposit": 8000000,
"location": {
"id": 1,
"code": "ABV",
"name": "Nnamdi Azikiwe International Airport, Abuja",
"city": "abuja"
}
},
"pickup": {
"code": "ABV",
"name": "Nnamdi Azikiwe International Airport, Abuja",
"instructions": "Meet our agent at the arrivals hall, next to the information desk."
},
"dropoff": {
"code": "ABV",
"name": "Nnamdi Azikiwe International Airport, Abuja"
},
"customer": {
"name": "Chidi Obi",
"email": "chidi@example.com",
"phone": "+2348031234567"
},
"price": {
"currency": "NGN",
"days": 3,
"lines": [
{
"code": "rental",
"label": "Car rental",
"quantity": 3,
"unitAmount": 4500000,
"amount": 13500000
},
{
"code": "gps",
"label": "GPS navigation",
"quantity": 3,
"unitAmount": 150000,
"amount": 450000
}
],
"listSubtotal": 13950000,
"discount": null,
"subtotal": 13950000,
"deposit": 8000000,
"total": 21950000,
"refunded": 0
},
"commission": 2092500,
"flightNumber": "W3123",
"checkedInAt": null,
"arrivalNote": null,
"metadata": {
"order_id": "A-1001"
},
"createdAt": "2026-11-01T12:00:00.000Z",
"holdExpiresAt": "2026-11-01T12:20:00.000Z",
"checkoutUrl": "https://checkout.paystack.com/abc123"
}
}/rentals/bookings/{reference}Update a booking
Change the customer’s contact details, the arrival flight, or your own metadata, until the rental is over. Dates, car and price cannot be changed: cancel and book again. In metadata, a value of null removes that key.
Path parameters
referencestringrequiredThe booking reference.
Example:
WC-7KQ2M9XA
Request body · application/json
customerobjectShow 3 fields
namestringemailstringphonestring
flightNumberstring · nullablemetadataobjectMerged into the existing metadata.
Response 200
In data:
referencestringrequirede.g. WC-7KQ2M9XA. Show it to your customer.
statusenumrequiredpending_paymentconfirmedactivecompletedcancelledexpiredtestbooleanTrue for a sandbox booking.
fromdate-timerequiredISO 8601 date-time.
todate-timerequiredISO 8601 date-time.
vehicleVehiclerequiredShow 15 fields
idintegerrequiredtitlestringrequirede.g. “2021 Toyota Camry”.
makestringmodelstringyearintegerclassenumrequiredeconomysedansuvvanluxurytransmissionenumautomaticmanualfuelenumpetroldieselhybridelectricseatsintegercolourstring · nullablephotosarray of stringdailyRateintegerrequiredPrice per 24 hours.
depositintegerRefundable deposit.
locationobjectrequiredShow 4 fields
idintegercodestringrequirednamestringcitystring
ratingobject · nullableShow 2 fields
averagenumberAverage of 1 to 5 stars, one decimal.
countintegerPublished reviews of this car.
pickupobjectShow 3 fields
codestringnamestringinstructionsstring · nullable
dropoffobjectShow 2 fields
codestringnamestring
customerCustomerShow 3 fields
namestringrequiredemailstringrequiredphonestringrequiredInternational format preferred, e.g. +2348031234567.
priceobjectrequiredShow 9 fields
currencystringdaysintegerlinesarray of QuoteLineShow 6 fields
codestringrequiredrental, an extra’s code, one_way or discount.
labelstringrequiredquantityintegerunitAmountintegerAmount in kobo (₦1 = 100 kobo).
amountintegerrequiredNegative for a discount.
pricingenumper_dayflatdiscount
listSubtotalintegerAmount in kobo (₦1 = 100 kobo).
discountobject · nullableShow 2 fields
codestring · nullableamountintegerAmount in kobo (₦1 = 100 kobo).
subtotalintegerAmount in kobo (₦1 = 100 kobo).
depositintegerAmount in kobo (₦1 = 100 kobo).
totalintegerAmount in kobo (₦1 = 100 kobo).
refundedintegerAmount in kobo (₦1 = 100 kobo).
commissionintegerYour commission on this booking (businesses only).
flightNumberstring · nullablecheckedInAtdate-time · nullableISO 8601 date-time.
arrivalNotestring · nullablemetadataobjectYour own key/value pairs.
createdAtdate-timeISO 8601 date-time.
holdExpiresAtdate-time · nullableWhile unpaid: when the car is released.
checkoutUrlstringSend the customer here to pay (only while unpaid).
cancellationobjectShow 8 fields
allowedbooleanFalse once it is cancelled, collected or finished.
refundPercentintegerShare of the rental price refunded if cancelled right now: 100 (12 h or more before pick-up), 95 (6 to 12 h), 90 (under 6 h). The deposit always comes back in full.
rentalRefundintegerAmount in kobo (₦1 = 100 kobo).
feeintegerThe cancellation fee that would be kept.
depositReturnedintegerAmount in kobo (₦1 = 100 kobo).
refundTotalintegerWhat goes back to the customer in all.
changesAtdate-time · nullableWhen the refund drops to the next level.
nextPercentinteger · nullableThe refund percent from then on.
earlyReturnobject · nullableShow 7 fields
requestedAtdate-time · nullableWhen the customer asked to return early (the clock stops there if the car arrives within the grace period).
timeBasedPaidintegerThe part of the rental price that is for time (spread evenly over the booked period).
bookedSecondsintegerusedSecondsintegerunusedSecondsintegerrentalRefundintegerRefund for the unused time if the car is returned now.
depositReturnedintegerAmount in kobo (₦1 = 100 kobo).
overstayobject · nullableShow 5 fields
lateSecondsintegerSeconds past the return time.
graceSecondsintegerFree seconds after the return time.
billedSecondsintegerLate seconds that are charged (after the grace period).
ratePerHourintegerThe late rate per hour, frozen when the booking was made.
chargeSoFarintegerThe late charge if the car were handed back now (it runs to the second).
lateTermsobjectShow 2 fields
ratePerHourintegerWhat a late return costs per hour (to the second) once the grace period has passed. Frozen when the booking was made.
graceMinutesintegerFree minutes after the return time.
tripUpdatesobject · nullableShow 2 fields
whatsappbooleanTrue when the customer opted in to WhatsApp updates.
schedulearray of objectShow 4 fields
stagestringlabelstringatdate-timeISO 8601 date-time.
doneboolean
reviewobjectShow 2 fields
allowedbooleanTrue once the car is returned and no review has been left yet.
submittedAtdate-time · nullableISO 8601 date-time.
returnedAtdate-time · nullableWhen the car was handed back.
balanceobject · nullableShow 2 fields
dueintegerWhat the customer still owes after the car came back (a late charge larger than the deposit).
paidAtdate-time · nullableISO 8601 date-time.
settlementSettlement | nullThe closing statement, once the booking is cancelled or the car is back.
Errors
400invalid: something in the request is wrong. The message says what.401unauthorized: the API key is missing, wrong or revoked.404not_found: no such thing, or it is not yours.409conflict or unavailable: not possible in the current state, or the car was just taken.
curl -X PATCH "https://engine-production-0004.up.railway.app/api/v1/rentals/bookings/WC-7KQ2M9XA" \
-H "Authorization: Bearer wc_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"customer": {
"phone": "+2348099990000"
},
"flightNumber": "BA75",
"metadata": {
"note": "vip",
"order_id": null
}
}'/rentals/bookings/{reference}/cancelCancel a booking
Releases an unpaid booking, or refunds a paid one by this policy: 100% of the rental price back if the pick-up is 12 hours or more away, 95% from 6 to 12 hours, 90% under 6 hours (or if the car was never collected). The deposit always comes back in full. What is not refunded is a cancellation fee that stays with the platform: the car owner and any selling business earn nothing from a cancelled booking. The refund is sent through the payment provider and recorded; GET /rentals/bookings/{reference} carries the statement in settlement. A booking whose car was collected cannot be cancelled: it ends when the car is returned.
Path parameters
referencestringrequiredThe booking reference.
Example:
WC-7KQ2M9XA
Response 200
In data:
referencestringrequirede.g. WC-7KQ2M9XA. Show it to your customer.
statusenumrequiredpending_paymentconfirmedactivecompletedcancelledexpiredtestbooleanTrue for a sandbox booking.
fromdate-timerequiredISO 8601 date-time.
todate-timerequiredISO 8601 date-time.
vehicleVehiclerequiredShow 15 fields
idintegerrequiredtitlestringrequirede.g. “2021 Toyota Camry”.
makestringmodelstringyearintegerclassenumrequiredeconomysedansuvvanluxurytransmissionenumautomaticmanualfuelenumpetroldieselhybridelectricseatsintegercolourstring · nullablephotosarray of stringdailyRateintegerrequiredPrice per 24 hours.
depositintegerRefundable deposit.
locationobjectrequiredShow 4 fields
idintegercodestringrequirednamestringcitystring
ratingobject · nullableShow 2 fields
averagenumberAverage of 1 to 5 stars, one decimal.
countintegerPublished reviews of this car.
pickupobjectShow 3 fields
codestringnamestringinstructionsstring · nullable
dropoffobjectShow 2 fields
codestringnamestring
customerCustomerShow 3 fields
namestringrequiredemailstringrequiredphonestringrequiredInternational format preferred, e.g. +2348031234567.
priceobjectrequiredShow 9 fields
currencystringdaysintegerlinesarray of QuoteLineShow 6 fields
codestringrequiredrental, an extra’s code, one_way or discount.
labelstringrequiredquantityintegerunitAmountintegerAmount in kobo (₦1 = 100 kobo).
amountintegerrequiredNegative for a discount.
pricingenumper_dayflatdiscount
listSubtotalintegerAmount in kobo (₦1 = 100 kobo).
discountobject · nullableShow 2 fields
codestring · nullableamountintegerAmount in kobo (₦1 = 100 kobo).
subtotalintegerAmount in kobo (₦1 = 100 kobo).
depositintegerAmount in kobo (₦1 = 100 kobo).
totalintegerAmount in kobo (₦1 = 100 kobo).
refundedintegerAmount in kobo (₦1 = 100 kobo).
commissionintegerYour commission on this booking (businesses only).
flightNumberstring · nullablecheckedInAtdate-time · nullableISO 8601 date-time.
arrivalNotestring · nullablemetadataobjectYour own key/value pairs.
createdAtdate-timeISO 8601 date-time.
holdExpiresAtdate-time · nullableWhile unpaid: when the car is released.
checkoutUrlstringSend the customer here to pay (only while unpaid).
cancellationobjectShow 8 fields
allowedbooleanFalse once it is cancelled, collected or finished.
refundPercentintegerShare of the rental price refunded if cancelled right now: 100 (12 h or more before pick-up), 95 (6 to 12 h), 90 (under 6 h). The deposit always comes back in full.
rentalRefundintegerAmount in kobo (₦1 = 100 kobo).
feeintegerThe cancellation fee that would be kept.
depositReturnedintegerAmount in kobo (₦1 = 100 kobo).
refundTotalintegerWhat goes back to the customer in all.
changesAtdate-time · nullableWhen the refund drops to the next level.
nextPercentinteger · nullableThe refund percent from then on.
earlyReturnobject · nullableShow 7 fields
requestedAtdate-time · nullableWhen the customer asked to return early (the clock stops there if the car arrives within the grace period).
timeBasedPaidintegerThe part of the rental price that is for time (spread evenly over the booked period).
bookedSecondsintegerusedSecondsintegerunusedSecondsintegerrentalRefundintegerRefund for the unused time if the car is returned now.
depositReturnedintegerAmount in kobo (₦1 = 100 kobo).
overstayobject · nullableShow 5 fields
lateSecondsintegerSeconds past the return time.
graceSecondsintegerFree seconds after the return time.
billedSecondsintegerLate seconds that are charged (after the grace period).
ratePerHourintegerThe late rate per hour, frozen when the booking was made.
chargeSoFarintegerThe late charge if the car were handed back now (it runs to the second).
lateTermsobjectShow 2 fields
ratePerHourintegerWhat a late return costs per hour (to the second) once the grace period has passed. Frozen when the booking was made.
graceMinutesintegerFree minutes after the return time.
tripUpdatesobject · nullableShow 2 fields
whatsappbooleanTrue when the customer opted in to WhatsApp updates.
schedulearray of objectShow 4 fields
stagestringlabelstringatdate-timeISO 8601 date-time.
doneboolean
reviewobjectShow 2 fields
allowedbooleanTrue once the car is returned and no review has been left yet.
submittedAtdate-time · nullableISO 8601 date-time.
returnedAtdate-time · nullableWhen the car was handed back.
balanceobject · nullableShow 2 fields
dueintegerWhat the customer still owes after the car came back (a late charge larger than the deposit).
paidAtdate-time · nullableISO 8601 date-time.
settlementSettlement | nullThe closing statement, once the booking is cancelled or the car is back.
refundPercentintegerShare of the rental price refunded: 100, 50 or 0.
refundobject · nullableShow 2 fields
requestedintegerAmount in kobo (₦1 = 100 kobo).
okboolean
Errors
401unauthorized: the API key is missing, wrong or revoked.404not_found: no such thing, or it is not yours.409conflict or unavailable: not possible in the current state, or the car was just taken.
curl -X POST "https://engine-production-0004.up.railway.app/api/v1/rentals/bookings/WC-7KQ2M9XA/cancel" \
-H "Authorization: Bearer wc_test_YOUR_KEY"{
"data": {
"reference": "WC-7KQ2M9XA",
"status": "cancelled",
"test": false,
"from": "2026-11-20T09:00:00.000Z",
"to": "2026-11-23T09:00:00.000Z",
"vehicle": {
"id": 12,
"title": "2021 Toyota Camry",
"make": "Toyota",
"model": "Camry",
"year": 2021,
"class": "sedan",
"transmission": "automatic",
"fuel": "petrol",
"seats": 5,
"colour": "Silver",
"photos": [
"https://api.waca.com.ng/api/media/file/camry-1.jpg"
],
"dailyRate": 4500000,
"deposit": 8000000,
"location": {
"id": 1,
"code": "ABV",
"name": "Nnamdi Azikiwe International Airport, Abuja",
"city": "abuja"
}
},
"pickup": {
"code": "ABV",
"name": "Nnamdi Azikiwe International Airport, Abuja",
"instructions": "Meet our agent at the arrivals hall, next to the information desk."
},
"dropoff": {
"code": "ABV",
"name": "Nnamdi Azikiwe International Airport, Abuja"
},
"customer": {
"name": "Chidi Obi",
"email": "chidi@example.com",
"phone": "+2348031234567"
},
"price": {
"currency": "NGN",
"days": 3,
"lines": [
{
"code": "rental",
"label": "Car rental",
"quantity": 3,
"unitAmount": 4500000,
"amount": 13500000
},
{
"code": "gps",
"label": "GPS navigation",
"quantity": 3,
"unitAmount": 150000,
"amount": 450000
}
],
"listSubtotal": 13950000,
"discount": null,
"subtotal": 13950000,
"deposit": 8000000,
"total": 21950000,
"refunded": 0
},
"commission": 2092500,
"flightNumber": "W3123",
"checkedInAt": null,
"arrivalNote": null,
"metadata": {
"order_id": "A-1001"
},
"createdAt": "2026-11-01T12:00:00.000Z",
"holdExpiresAt": "2026-11-01T12:20:00.000Z",
"checkoutUrl": "https://checkout.paystack.com/abc123",
"refundPercent": 100,
"refund": {
"requested": 21950000,
"ok": true
}
}
}/rentals/bookings/{reference}/checkinOnline check-in
Once a booking is paid the customer can check in: arrival flight and time, a note for our agent, and the licence details if they were not known yet. Our agent sees it at hand-over.
Path parameters
referencestringrequiredThe booking reference.
Example:
WC-7KQ2M9XA
Request body · application/json
flightNumberstringexpectedArrivaldate-timeISO 8601 date-time.
notesstringUp to 300 characters.
licenseNumberstringlicenseExpirydate-timeISO 8601 date-time.
Response 200
In data:
referencestringrequirede.g. WC-7KQ2M9XA. Show it to your customer.
statusenumrequiredpending_paymentconfirmedactivecompletedcancelledexpiredtestbooleanTrue for a sandbox booking.
fromdate-timerequiredISO 8601 date-time.
todate-timerequiredISO 8601 date-time.
vehicleVehiclerequiredShow 15 fields
idintegerrequiredtitlestringrequirede.g. “2021 Toyota Camry”.
makestringmodelstringyearintegerclassenumrequiredeconomysedansuvvanluxurytransmissionenumautomaticmanualfuelenumpetroldieselhybridelectricseatsintegercolourstring · nullablephotosarray of stringdailyRateintegerrequiredPrice per 24 hours.
depositintegerRefundable deposit.
locationobjectrequiredShow 4 fields
idintegercodestringrequirednamestringcitystring
ratingobject · nullableShow 2 fields
averagenumberAverage of 1 to 5 stars, one decimal.
countintegerPublished reviews of this car.
pickupobjectShow 3 fields
codestringnamestringinstructionsstring · nullable
dropoffobjectShow 2 fields
codestringnamestring
customerCustomerShow 3 fields
namestringrequiredemailstringrequiredphonestringrequiredInternational format preferred, e.g. +2348031234567.
priceobjectrequiredShow 9 fields
currencystringdaysintegerlinesarray of QuoteLineShow 6 fields
codestringrequiredrental, an extra’s code, one_way or discount.
labelstringrequiredquantityintegerunitAmountintegerAmount in kobo (₦1 = 100 kobo).
amountintegerrequiredNegative for a discount.
pricingenumper_dayflatdiscount
listSubtotalintegerAmount in kobo (₦1 = 100 kobo).
discountobject · nullableShow 2 fields
codestring · nullableamountintegerAmount in kobo (₦1 = 100 kobo).
subtotalintegerAmount in kobo (₦1 = 100 kobo).
depositintegerAmount in kobo (₦1 = 100 kobo).
totalintegerAmount in kobo (₦1 = 100 kobo).
refundedintegerAmount in kobo (₦1 = 100 kobo).
commissionintegerYour commission on this booking (businesses only).
flightNumberstring · nullablecheckedInAtdate-time · nullableISO 8601 date-time.
arrivalNotestring · nullablemetadataobjectYour own key/value pairs.
createdAtdate-timeISO 8601 date-time.
holdExpiresAtdate-time · nullableWhile unpaid: when the car is released.
checkoutUrlstringSend the customer here to pay (only while unpaid).
cancellationobjectShow 8 fields
allowedbooleanFalse once it is cancelled, collected or finished.
refundPercentintegerShare of the rental price refunded if cancelled right now: 100 (12 h or more before pick-up), 95 (6 to 12 h), 90 (under 6 h). The deposit always comes back in full.
rentalRefundintegerAmount in kobo (₦1 = 100 kobo).
feeintegerThe cancellation fee that would be kept.
depositReturnedintegerAmount in kobo (₦1 = 100 kobo).
refundTotalintegerWhat goes back to the customer in all.
changesAtdate-time · nullableWhen the refund drops to the next level.
nextPercentinteger · nullableThe refund percent from then on.
earlyReturnobject · nullableShow 7 fields
requestedAtdate-time · nullableWhen the customer asked to return early (the clock stops there if the car arrives within the grace period).
timeBasedPaidintegerThe part of the rental price that is for time (spread evenly over the booked period).
bookedSecondsintegerusedSecondsintegerunusedSecondsintegerrentalRefundintegerRefund for the unused time if the car is returned now.
depositReturnedintegerAmount in kobo (₦1 = 100 kobo).
overstayobject · nullableShow 5 fields
lateSecondsintegerSeconds past the return time.
graceSecondsintegerFree seconds after the return time.
billedSecondsintegerLate seconds that are charged (after the grace period).
ratePerHourintegerThe late rate per hour, frozen when the booking was made.
chargeSoFarintegerThe late charge if the car were handed back now (it runs to the second).
lateTermsobjectShow 2 fields
ratePerHourintegerWhat a late return costs per hour (to the second) once the grace period has passed. Frozen when the booking was made.
graceMinutesintegerFree minutes after the return time.
tripUpdatesobject · nullableShow 2 fields
whatsappbooleanTrue when the customer opted in to WhatsApp updates.
schedulearray of objectShow 4 fields
stagestringlabelstringatdate-timeISO 8601 date-time.
doneboolean
reviewobjectShow 2 fields
allowedbooleanTrue once the car is returned and no review has been left yet.
submittedAtdate-time · nullableISO 8601 date-time.
returnedAtdate-time · nullableWhen the car was handed back.
balanceobject · nullableShow 2 fields
dueintegerWhat the customer still owes after the car came back (a late charge larger than the deposit).
paidAtdate-time · nullableISO 8601 date-time.
settlementSettlement | nullThe closing statement, once the booking is cancelled or the car is back.
Errors
400invalid: something in the request is wrong. The message says what.401unauthorized: the API key is missing, wrong or revoked.404not_found: no such thing, or it is not yours.409conflict or unavailable: not possible in the current state, or the car was just taken.
curl -X POST "https://engine-production-0004.up.railway.app/api/v1/rentals/bookings/WC-7KQ2M9XA/checkin" \
-H "Authorization: Bearer wc_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"flightNumber": "BA75",
"expectedArrival": "2026-11-20T14:30:00+01:00",
"notes": "Two suitcases and a child seat"
}'