Developer API

Build a tour-operator website on KwaWingu data.

A clean per-operator REST API. One call returns the whole site — profile, tours with full detail, destinations, gallery, team and reviews. Reads are open; writes use scoped keys. An OpenAPI spec ships with every operator, so humans and AI can integrate in minutes.

Base URL

Per operator:
/api/v1/{operatorSlug}

Authentication

Send X-API-Key. Reads are open; writes need a key with the matching scope.

Rate limit

1,000 requests per hour, per key / caller.

OpenAPI 3

Every operator exposes /openapi.json — works with Swagger, Postman & AI codegen.

The fastest way to build a site

GET /site — everything in one call

The /site endpoint returns a complete website bundle so you never have to stitch calls together:

  • profilebranding, contact, about
  • toursevery tour with full detail
  • destinationsparks, regions, best months
  • galleryimage library URLs
  • teamguides & staff profiles
  • reviewsguest ratings & reviews
const res = await fetch(
  "https://tours.kwawingu.com/api/v1/{operatorSlug}/site",
  { headers: { "X-API-Key": "kw_live_…" } } // optional for reads
);
const {
  profile, tours, destinations, gallery, team, reviews
} = await res.json();

// Every tour in `tours` already includes full detail —
// itinerary, pricing matrix, gallery, reviews and more.
curl https://tours.kwawingu.com/api/v1/{operatorSlug}/site \
  -H "X-API-Key: kw_live_…"   # header optional for reads

Endpoint reference

All paths are relative to /api/v1/{operatorSlug}. Reads are open to anonymous callers; writes require a key carrying the listed scope.

MethodPathScopeDescription
GET/sitesite:readOne-call website bundle: profile, tours (full detail), destinations, gallery, team, reviews.
GET/profileprofile:readCompany profile, branding, contact details, about copy.
GET/tours?page&sizetours:readPaginated tour summaries with pricing, seasons, ratings and cover images.
GET/tours/{tourSlug}tours:readFull tour detail — itinerary, pricing matrix, accommodation tiers, gallery, FAQs, reviews.
GET/tours/{tourSlug}/availability?month&date&paxavailability:readLive departures and seat availability for a tour.
GET/destinationsdestinations:readDestinations — parks, regions, best months, descriptions.
GET/gallerygallery:readImage library URLs for the website.
GET/teamteam:readPublic staff & guide profiles for a 'Meet the team' page.
GET/reviews?page&sizereviews:readGuest reviews and ratings.
GET/openapi.jsonnoneMachine-readable OpenAPI 3 spec for this operator.
POST/quotequotes:writeCalculate a price quote for a trip.
POST/bookingsbookings:writeCreate a booking.
POST/inquiriesinquiries:writeSubmit a contact / date inquiry to the operator's inbox.
POST/chatbotchatbot:writeQuery the grounded operator AI assistant.

What a tour returns

GET /tours/{tourSlug} (and every tour inside /site) returns rich, render-ready content:

Itinerary

Day-by-day itineraryDays — each with meals, activities, location, and tiered accommodation (accommodations[{tier,name,note}]).

Seasons & pricing matrix

seasons[{name,startMonth,endMonth,note}] and pricingMatrix[{tier,season,minPax,maxPax,adult,child}].

Guiding & audience

guidingOptions, targetAudience, supportedBookingModels, accommodationTiers.

Inclusions & packing

included, excluded, packingList, highlights, descriptionFull.

Gallery & add-ons

galleryImageUrls, coverImageUrl, addons, and per-tour FAQs.

Reviews & operator

Per-tour reviews, averageRating, plus the embedded operator block.

Fetch a single tour

const res = await fetch(
  "https://tours.kwawingu.com/api/v1/{operatorSlug}/tours/{tourSlug}"
);
const tour = await res.json();

tour.itineraryDays      // day-by-day plan + accommodation tiers
tour.pricingMatrix      // [{ tier, season, minPax, maxPax, adult, child }]
tour.seasons            // [{ name, startMonth, endMonth, note }]
tour.included           // string[]
tour.galleryImageUrls   // string[]
tour.faqs               // [{ question, answer }]
tour.reviews            // guest reviews
curl https://tours.kwawingu.com/api/v1/{operatorSlug}/tours/serengeti-migration-safari

Availability

Add live departures with GET /tours/{tourSlug}/availability?month=2026-08.

Ship a typed client in minutes

Every operator publishes a machine-readable OpenAPI 3 spec at /api/v1/{operatorSlug}/openapi.json. Import it into Swagger, Postman, or an AI code generator to scaffold a fully typed client.

Operators create and manage scoped API keys from Dashboard → Booking Engine → Developers.