Partner API
Live availability, itemised charges, bookings and changes for OTAs, brokers and booking channels. One HTTP header, JSON in and out, no SDK required. Operators issue keys themselves under Settings, Integrations, and bookings you create are attributed to your key on their OTA channel.
Machine-readable: OpenAPI 3.1. No key yet? Everything below runs against the public sandbox. Already speak OpenTravel XML? Use the XML gateway instead, same inventory and same charges.
Authentication and errors
Send the key the operator issued you on every request:
X-Api-Key: kpk_live_…
Errors return { "error": "...", "code": "..." }. 401 = bad or revoked key · 404 = unknown location, class or booking · 409 = no availability, not cancellable or not changeable (unavailable, cutoff, started) · 422 = validation problem or a selling rule (lead_time, closed, one_way_pickup, one_way_return, unknown_extra).
Times, locations and selling rules
- Datetimes without an offset are the location's local wall clock (
2026-08-01T10:00:00). WithZor an offset they are exact instants. Pickup times use the pickup location, return times the return location. - Location codes are matched without regard to case, and operators can add the codes you use (IATA code, your station ID) to each location.
/locationslists every accepted code. When the operator runs one location you may leave it out; with several it is required. A missing return location means the pickup location. - Bookings close a set time before pickup (2 hours unless the operator changes it). Pickups and returns outside a location's opening hours are refused. One-way rentals can be switched off per location and always carry the operator's one-way fee.
- Availability is counted at minute precision with a turnaround buffer between rentals (at least 60 minutes for partner bookings), and cars that are overdue or in maintenance are never sold. A class you are shown as available can be booked: availability and booking run the same checks.
Charges
Every quote, booking and change returns itemised charges plus totals. Prices are before tax; each line carries its own tax. total_cents is every line with included_in_total plus tax, and it is exactly what the booking stores.
base: the rate, with its periods (days, weeks, months). Any demand adjustment is folded in.coverage: included covers (in the rate, with their excess), mandatory covers (always charged) and opt-in covers (charged when you select them).equipment: child seats, GPS, additional driver and similar, optional, per day or per rental, with a day cap where the operator sets one.fee: one-way, airport and young driver fees are mandatory when they apply. With nodriver_agethe young driver fee is listed with aconditionand left out of the total. The fuel policy (full to full) is listed at 0.- The security deposit is information (
deposit_info), never a charge.
/pingKey check. Returns the operator you are connected to.
curl -H "X-Api-Key: $KEY" https://keynetic.online/api/v1/partner/ping
/selftestRead-only connection check. Confirms your key is valid and scoped, counts bookable locations and classes, runs a sample availability probe, and returns a pass/fail per check plus an overall ready. Creates nothing, so it is safe to call any time.
curl -H "X-Api-Key: $KEY" https://keynetic.online/api/v1/partner/selftest
/locationsActive pickup/return stations: code plus every code the operator accepts for it (codes), address, coordinates, contact details, timezone, opening hours (local wall clock, for example { "mon": "07:00-21:00" }) and one_way_allowed.
/availabilityEvery vehicle class with live availability and itemised charges for a window. Parameters: pickup_at, return_at, pickup_location, return_location (defaults to the pickup location), and optionally class_code (class or ACRISS code), driver_age, extras (for example CHILD_SEAT:2,GPS) and coverages (for example SCDW) to price your selection. A sold-out class is still listed and priced, with available: 0.
curl -H "X-Api-Key: $KEY" \ "https://keynetic.online/api/v1/partner/availability?pickup_location=APT&pickup_at=2026-08-01T10:00:00&return_at=2026-08-05T10:00:00&driver_age=23"
{
"pickup_location": "APT", "return_location": "APT",
"classes": [{
"class_code": "CCAR", "acriss_code": "CCMR", "name": "Compact",
"seats": 5, "available": 3, "total_fleet": 8,
"charges": [
{ "kind": "base", "code": "BASE", "unit": "day", "quantity": 4,
"unit_cents": 4500, "amount_cents": 18000, "tax_cents": 1440,
"required": true, "included_in_total": true },
{ "kind": "coverage", "code": "CDW", "amount_cents": 0,
"included_in_rate": true, "excess_cents": 91800 },
{ "kind": "fee", "code": "YOUNG_DRIVER_FEE", "amount_cents": 4000,
"tax_cents": 320, "required": true, "included_in_total": true },
{ "kind": "equipment", "code": "CHILD_SEAT", "extra_id": "cm...",
"unit": "day", "unit_cents": 800, "max_charge_days": 6,
"selected": false, "included_in_total": false }
],
"totals": { "currency": "USD", "days": 4, "rate_total_cents": 18000,
"subtotal_cents": 22000, "tax_cents": 1760,
"total_cents": 23760 },
"excess_cents": 91800, "deposit_info": "Security deposit: ..."
}]
}/bookingsCreates a confirmed booking at the price availability showed for the same request. Optional extras (by extra_id or code, with a quantity), coverages (opt-in cover codes), driver_age and flight. The capacity guard is transactional: a 409 means the class sold out between your availability call and this request. The customer receives the operator's standard confirmation (email / WhatsApp).
Safe to retry: a second request with the same partner_reference returns the original booking with status 200 and "replayed": true instead of creating a duplicate.
curl -X POST -H "X-Api-Key: $KEY" -H "Content-Type: application/json" \
https://keynetic.online/api/v1/partner/bookings -d '{
"class_code": "CCAR",
"pickup_at": "2026-08-01T10:00:00",
"return_at": "2026-08-05T10:00:00",
"pickup_location": "APT",
"return_location": "APT",
"customer": { "first_name": "Ana", "last_name": "Diaz",
"email": "[email protected]", "phone": "+297 5551234" },
"extras": [{ "code": "CHILD_SEAT", "quantity": 1 }],
"coverages": ["SCDW"],
"driver_age": 31,
"partner_reference": "FR-88213"
}'{ "reference": "KN-2026-00042", "status": "CONFIRMED",
"partner_reference": "FR-88213", "currency": "USD",
"total_cents": 34560, "deposit_cents": 0,
"charges": [ ... ], "totals": { ... } }/bookings/{reference}Status, details and the charges stored on the booking. The path takes the Keynetic reference or your partner_reference. Every booking call only sees bookings created with your own key: any other reference returns 404.
/bookings/{reference}Changes a confirmed booking. Send only the fields that change: pickup_at, return_at, pickup_location, return_location, class_code, extras, coverages, driver_age, customer, flight, notes. Dates, locations, class, extras, covers and driver age reprice the whole booking at current rates; name, contact details, flight and notes keep the price. extras and coverages replace the current selection ([] removes it). Add ?preview=1 to see the new price and run every check without saving.
Changes are accepted until pickup (operators can set an earlier cut-off). A rental that has started is changed at the desk. When the new request is not available the booking stays exactly as it was and you get a 409.
curl -X PATCH -H "X-Api-Key: $KEY" -H "Content-Type: application/json" \
"https://keynetic.online/api/v1/partner/bookings/KN-2026-00042?preview=1" -d '{ "return_at": "2026-08-06T10:00:00" }'{ "reference": "KN-2026-00042", "applied": false, "repriced": true,
"currency": "USD", "previous_total_cents": 34560,
"total_cents": 43200, "delta_cents": 8640, "warnings": [],
"charges": [ ... ], "totals": { ... }, "booking": { ... } }/bookings/{reference}Cancels the booking when its status allows it. Idempotent: an already-cancelled booking returns 200.
Rate limits
240 requests per minute per key, counted across this API and the XML gateway together. Over the limit you get 429 with code: "rate_limited", a Retry-After in seconds and X-RateLimit-Limit and X-RateLimit-Remaining. Cache /locations rather than calling it per search. Tell us what your traffic looks like and we will raise the ceiling on your key.
Already speak OpenTravel XML?
OTA_VehAvailRateRQ, VehResRQ, VehRetResRQ, VehModifyRQ and VehCancelRQ run on one endpoint with the same key, the same inventory and the same charge engine. Messages, error codes, sample payloads and the certification checklist are on the OTA XML gateway page.
Building an integration and need something the API doesn't cover yet, such as webhooks, rate plans or a broker-specific dialect? Email [email protected]. We ship connectivity requests fast.