Partner API

Live availability, rates and booking creation for OTAs, brokers and booking channels. One HTTP header, JSON in and out, no SDK required. Operators issue keys themselves under Settings → Integrations — bookings you create are attributed to your key on their OTA channel.

Authentication

Send the key the operator issued you on every request:

X-Api-Key: kpk_live_…

401 = bad or revoked key · 409 = no availability / not cancellable · 422 = validation problem.

GET/ping

Key check. Returns the operator you are connected to.

curl -H "X-Api-Key: $KEY" https://keynetic.online/api/v1/partner/ping
GET/locations

Active pickup/return stations with codes, address, coordinates, contact details, timezone and opening hours.

GET/availability

Vehicle classes with live availability and OTA-channel rates for a window. Optional class_code filters to one class.

curl -H "X-Api-Key: $KEY" \
  "https://keynetic.online/api/v1/partner/availability?pickup_at=2026-08-01T10:00:00Z&return_at=2026-08-05T10:00:00Z"
{
  "classes": [{
    "class_code": "CCAR", "acriss_code": "CCMR", "name": "Compact",
    "seats": 5, "available": 3, "total_fleet": 8,
    "rate": { "currency": "USD", "base_cents": 18000,
              "tax_cents": 1440, "total_cents": 19440 }
  }]
}
POST/bookings

Creates a confirmed booking. 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).

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:00Z",
  "return_at": "2026-08-05T10:00:00Z",
  "pickup_location": "APT",
  "return_location": "APT",
  "customer": { "first_name": "Ana", "last_name": "Diaz",
                "email": "ana@example.com", "phone": "+297 5551234" },
  "partner_reference": "FR-88213"
}'
{ "reference": "KN-2026-00042", "status": "CONFIRMED",
  "currency": "USD", "total_cents": 19440, "deposit_cents": 0 }
GET/bookings/{reference}

Status lookup by Keynetic reference.

DELETE/bookings/{reference}

Cancels the booking when its status allows it. Idempotent — an already-cancelled booking returns 200.

OTA XML gateway

Broker systems that speak OpenTravel-style XML (the dialect used by RentalCars, CarTrawler and most legacy channel managers) can connect without touching JSON. One endpoint, dispatched on the message root — same API key, same live inventory.

POSThttps://keynetic.online/api/ota/v1

Supported messages: OTA_PingRQ, OTA_VehAvailRateRQ, OTA_VehResRQ, OTA_VehRetResRQ and OTA_VehCancelRQ. Send the partner API key as POS/Source/RequestorID @MessagePassword (an X-Api-Keyheader also works). Vehicle classes are accepted as the operator's class code or the ACRISS code.

curl -X POST -H "Content-Type: application/xml" \
  https://keynetic.online/api/ota/v1 -d '<?xml version="1.0"?>
<OTA_VehAvailRateRQ xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0">
  <POS><Source>
    <RequestorID Type="22" ID="your-agency" MessagePassword="kpk_live_…"/>
  </Source></POS>
  <VehAvailRQCore Status="Available">
    <VehRentalCore PickUpDateTime="2026-08-01T10:00:00Z"
                   ReturnDateTime="2026-08-05T10:00:00Z">
      <PickUpLocation LocationCode="APT"/>
      <ReturnLocation LocationCode="APT"/>
    </VehRentalCore>
  </VehAvailRQCore>
</OTA_VehAvailRateRQ>'

Bookings via OTA_VehResRQ carry the customer under Customer/Primary (PersonName, Email, Telephone) and the class under VehPref @Code; a voucher number in VehResRQInfo/RentalPaymentPref/Voucher @Identifier is stored as the broker reference. The response returns the Keynetic confirmation as ConfID Type="14", which OTA_VehRetResRQ and OTA_VehCancelRQ accept as UniqueID @ID. Errors come back as standard Errors/Error @Type @ShortText.

Building an integration and need something the API doesn't cover yet — webhooks, rate plans, extras, a broker-specific dialect? Email hello@keynetic.online. We ship connectivity requests fast.