Make, read and cancel bookings on this channel. Send an Idempotency-Key on every create: a retry with the same key and body returns the same booking, and a different body with the same key is refused. When the rental pauses a reseller's channel, its key still reads bookings. It gets no availability, offers or quotes, and a hold, a make, a change or a cancel answers 403 with paused.
Bookings on this channel
100 bookings, or up to 200 with limit, newest pickup first, then newest made. from and to pick the bookings that touch those days. There is no page cursor: narrow the dates to read more.
path Parameters
slugquery Parameters
fromtostatuslimitBookings on this channel › Responses
OK
Make a booking
Send an Idempotency-Key header. A retry with the same key and body returns the same booking; a different body with the same key is refused. A copy that arrives while the first is still being made answers 409 in_progress. After a 500 the key stays in progress for 24 hours and a retry answers 409 in_progress: read the bookings, and send a booking that is not there with a new key.
path Parameters
slugHeaders
idempotency-keyMake a booking › Request Body
carTypeIdpickupAt^\d{4}-\d{2}-\d{2}T\… · requiredreturnAt^\d{4}-\d{2}-\d{2}T\… · requiredpickupLocationIdreturnLocationIdcouponCodedriverAgeThe driver's age in years, from 16 to 120, when known. A young driver fee goes on only with it. Under the car type's minDriverAge, the request is refused with driver_too_young.
declinedThe ids of included covers the customer refuses, as the booking takes them. Only a product with includedByDefault and declinable true can be refused. It then comes off the price, and liability and depositMinor lose its cover. Any other id is refused with 422 invalid.
refundableThe payment term: false is non-refundable, which the rental must sell. Left out, refundable. A term the rental does not sell is refused with 422 term_not_sold. See terms on the quote.
confirmationBpThe share of the total paid at booking, in basis points: 10000 is full payment, 2000 is 20%, 0 is pay on arrival. Left out, the rental's own share. Under the rental's share is refused with 422 term_not_sold. Sent, the quote's terms hold this share beside full payment and the rental's share.
locale^[a-z]{2}$The language of each term's title and summary: en, is, de, fr, es or it. Left out, the rental's own language.
channelIdpickupDetailWhere exactly at the pickup location the customer meets the car, such as the hotel name or the street. Ask for it when the location has requiresDetail, with its detailPrompt as the question. The rental reads it on the booking. Left out, the booking has none.
returnDetailWhere exactly at the return location the customer leaves the car, as pickupDetail for the pickup.
passengersHow many people travel, the driver included.
The rental's custom fields on bookings, by key. Only a field the rental sends through the API is taken: any other key answers 422 invalid, and no booking is made. A value has the JSON type of its field: a string for text, a link, one choice or a date (2026-06-01), a number, true or false, or a list of choices. A required field with no default must come. A field left out starts as its default.
flightNumbernotessourceReferencelanguageThe language the customer booked in, such as en or is. The confirmation email and the documents come in it. A language the rental does not use is ignored, and the rental's own language is used.
mrefThe click id an affiliate link added to your page's address as ?mref=. A UUID of 36 characters. Pass it back as it came. An unknown or expired one is ignored and does not refuse the booking. Over 64 characters fails the field check with 422.
affiliateAn affiliate's code, when your site knows who referred the customer but has no mref. A code that is not in the rental's program is ignored.
Make a booking › Responses
Already made, same request
One booking
path Parameters
slugidThe booking's id, or the id it had in the previous system when the booking came from an import.
The booking's id, or the id it had in the previous system when the booking came from an import.
One booking › Responses
OK
Change a booking
New dates, new locations, a new car type, new location details, custom fields, or any of them together. Send only what changes. Only a reserved booking takes a change: any other status answers 409 with wrong_status, and a later change goes through the rental. The booking is priced again over its new span by the same rules as a new one, and the extras it has come along. A booking the rental priced by hand is refused with manual_price, and a change that drops the total below what is paid with below_paid: the rental decides both. A change of the details or the custom fields alone prices nothing, so it is taken on a booking priced by hand too.
path Parameters
slugidChange a booking › Request Body
carTypeIdpickupAt^\d{4}-\d{2}-\d{2}T\…returnAt^\d{4}-\d{2}-\d{2}T\…pickupLocationIdreturnLocationIdpickupDetailWhere exactly at the pickup location, such as the hotel name. See pickupDetail on BookingRequest. Null or an empty string takes it off. It changes no price.
returnDetailWhere exactly at the return location, as pickupDetail. Null or an empty string takes it off.
The custom fields that change, by key. See customFields on BookingRequest. A key left out keeps its value. Null takes a value off, but not from a required field. It changes no price. The customer's own fields do not change here.
reasonChange a booking › Responses
Changed
Cancel a booking
Optionally send {"reason": "…"}. A body is not required. Only a reserved booking can be cancelled: any other status answers 409 with wrong_status.
path Parameters
slugidCancel a booking › Responses
Cancelled
Ask for a payment on a booking
Starts a payment at the rental's own processor and hands back what you need to put it in front of the customer. No card data passes through this API.
With mode: "link" you get url: send the customer there, and they land back on the rental's return address. With mode: "embedded" you get session, the values that processor's own browser code takes, and you draw the form on your own site. Which modes a rental can serve depends on the processor it connected.
A kind of "hold" places a deposit instead of taking the money, where the processor allows it.
The payment is only started here. It counts on the booking when the processor tells us it happened, so read the booking again, or listen for the booking.payment webhook.
path Parameters
slugidAsk for a payment on a booking › Request Body
kindTake the money, or hold it as a deposit.
modeA page of the processor's to send them to, or a form of your own.
amountMinor units. Left out, a sale asks for what is due now (payNowMinor), or for the balance when only the fees paid on arrival are left. A hold asks for the deposit.
returnUrlWhere the customer lands after paying. Only for a link.
methodIdWhich online method, when the rental has more than one.
localeAsk for a payment on a booking › Responses
Started
Keep one car for 15 minutes at Pay
A Website channel's key only: the widget's browser key, or the site's secret key. Holds one car of the car type at a fixed total, with the customer on the hold, for 15 minutes. No booking is made here.
Then ask for the payment with POST /rentals/{slug}/holds/{id}/payments. The processor's paid webhook makes the booking from the hold, with the payment on it. A payment that comes after the 15 minutes still books: at the hold's total when a car is free, else as an oversold booking that the rental finds a car for.
A browser key sends a Turnstile token with each hold, keeps one open hold per session, and keeps at most 3 open holds per address.
path Parameters
slugKeep one car for 15 minutes at Pay › Request Body
carTypeIdpickupAt^\d{4}-\d{2}-\d{2}T\… · requiredreturnAt^\d{4}-\d{2}-\d{2}T\… · requiredpickupLocationIdreturnLocationIdcouponCodedriverAgeThe driver's age in years, from 16 to 120, when known. A young driver fee goes on only with it. Under the car type's minDriverAge, the request is refused with driver_too_young.
declinedThe ids of included covers the customer refuses. Only a product with includedByDefault and declinable true can be refused, and it then comes off the price. Any other id is refused with 422 invalid, and no booking is made.
refundableThe payment term: false is non-refundable, which the rental must sell. Left out, refundable. A term the rental does not sell is refused with 422 term_not_sold. See terms on the quote.
confirmationBpThe share of the total paid at booking, in basis points: 10000 is full payment, 2000 is 20%, 0 is pay on arrival. Left out, the rental's own share. Under the rental's share is refused with 422 term_not_sold. Sent, the quote's terms hold this share beside full payment and the rental's share.
locale^[a-z]{2}$The language of each term's title and summary: en, is, de, fr, es or it. Left out, the rental's own language.
pickupDetailWhere exactly at the pickup location the customer meets the car, such as the hotel name or the street. Ask for it when the location has requiresDetail, with its detailPrompt as the question. The rental reads it on the booking. Left out, the booking has none.
returnDetailWhere exactly at the return location the customer leaves the car, as pickupDetail for the pickup.
passengersHow many people travel, the driver included.
The rental's custom fields on bookings, by key. Only a field the rental sends through the API is taken: any other key answers 422 invalid, and no booking is made. A value has the JSON type of its field: a string for text, a link, one choice or a date (2026-06-01), a number, true or false, or a list of choices. A required field with no default must come. A field left out starts as its default.
flightNumbernotessourceReferencelanguageThe language the customer booked in, such as en or is. The confirmation email and the documents come in it. A language the rental does not use is ignored, and the rental's own language is used.
mrefThe click id an affiliate link added to your page's address as ?mref=. A UUID of 36 characters. Pass it back as it came. An unknown or expired one is ignored and does not refuse the booking. Over 64 characters fails the field check with 422.
affiliateAn affiliate's code, when your site knows who referred the customer but has no mref. A code that is not in the rental's program is ignored.
sessionThe widget's own id for the browser tab, such as a random UUID kept in sessionStorage. A new hold with the same session gives the old one back first, so a customer who goes back and changes the order keeps one hold.
turnstileThe Turnstile token from the bot check frame, the page turnstileFrame of GET /rentals/{slug}/widget names. Required for a browser key (pk_), one token for each hold. A secret key sends none.
Keep one car for 15 minutes at Pay › Responses
Held
Read a hold, and the booking its payment made
For the widget's done page: poll it after the processor's page until state is booked, then show the booking's reference. Only the key's own channel reads its holds. A hold goes a day after it ended, or 30 days after its last payment started.
path Parameters
slugidRead a hold, and the booking its payment made › Responses
The hold
Book a hold with nothing to pay
Makes the booking of a hold whose payNowMinor is 0: a pay-on-arrival term (confirmationBp 0). The whole total is due at pickup. The hold passed the bot check and the address limit when it was made, so this call needs no token of its own.
A hold with money to pay is refused with 409 to_pay: ask for its payment with POST /rentals/{slug}/holds/{id}/payments. The answer is the hold, booked, with its booking.
path Parameters
slugidBook a hold with nothing to pay › Responses
Booked
Ask for the payment on a hold
Starts a payment of the hold's payNowMinor at the rental's own processor, as POST /rentals/{slug}/bookings/{id}/payments does for a booking. No card data passes through this API.
The processor's paid webhook makes the booking from the hold. Read the hold with GET /rentals/{slug}/holds/{id} until its state is booked. A refused card leaves the hold open: ask again while it lasts.
path Parameters
slugidAsk for the payment on a hold › Request Body
modeA page of the processor's to send them to, or a form of your own.
returnUrlWhere the customer lands after paying. Only for a link. A browser key's address is on one of the widget's sites, over https.
methodIdWhich online method, when the rental has more than one.
localeAsk for the payment on a hold › Responses
Started