KenyaAPI Documentation

Free, open REST API for Kenyan public data. No API key required.

Free Forever
No Auth Required

Base URL

All endpoints below are relative to this base URL.

https://kenya-api.netlify.app/api/v1

Authentication

No authentication required. All endpoints are publicly accessible.

i
Rate limiting is enforced for availability: 100 requests per minute per IP.

Response Format

All successful responses use a consistent JSON shape.

{
  "success": true,
  "count": 47,
  "data": [ ... ]
}
{
  "success": false,
  "error": "County with ID 99 not found",
  "statusCode": 404
}

Error Codes

Common HTTP response codes and their typical causes.

Code Meaning Common Cause Example
200OKSuccessful requestGET /counties
400Bad RequestInvalid query or missing path paramGET /holidays?year=abc
404Not FoundResource ID does not existGET /counties/99
429Too Many RequestsRate limit exceeded100 requests per minute
500Server ErrorUnexpected service failureInternal API error

Counties

Retrieve county-level data for all 47 Kenyan counties.

i
County flag images are served directly from Wikimedia Commons (upload.wikimedia.org) under Creative Commons licences. They are referenced by URL — no images are stored in this API.
GET

/counties

Returns the full list of counties. Supports optional filtering and sorting.

NameTypeInRequiredDescription
regionstringquerynoFilter counties by region, e.g. Coast
sortstringquerynoSort by area or population: area_asc, area_desc, population_asc, population_desc
governor_partystringquerynoFilter by governor's party, e.g. UDA, ODM, Wiper, Independent
qstringquerynoFull-text search across county name and description, e.g. q=coast or q=lake
curl -X GET "https://kenya-api.netlify.app/api/v1/counties" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/counties", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/counties"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/counties";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/counties"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/counties")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/counties"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "count": 47,
  "data": [
    {
      "id": 1,
      "code": "001",
      "name": "Mombasa",
      "headquarters": "Mombasa City",
      "region": "Coast",
      "area_km2": 212.5,
      "population": 1208333,
      "governor": "Abdullswamad Nassir",
      "governor_party": "ODM",
      "governor_since": 2022,
      "flag_url": "https://upload.wikimedia.org/wikipedia/commons/a/a6/Flag_of_Mombasa_County.svg",
      "description": "A coastal county along the Indian Ocean in southeastern Kenya, known for tourism, luxurious beach hotels, and the historic Mombasa Old Town."
    }
  ]
}
{
  "success": true,
  "count": 47,
  "data": [
    { "id": 1, "name": "Mombasa", "governor": "Abdullswamad Nassir", "flag_url": "https://upload.wikimedia.org/...", "description": "A coastal county..." }
  ]
}
GET

/counties/:id

Returns data for a single county by ID. Includes all fields from the county record — area, region, population, and governor details.

NameTypeInRequiredDescription
idintegerpathyesCounty ID from 1 to 47
curl -X GET "https://kenya-api.netlify.app/api/v1/counties/47" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/counties/47", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/counties/47"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/counties/47";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/counties/47"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/counties/47")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/counties/47"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "data": {
    "id": 47,
    "code": "047",
    "name": "Nairobi",
    "headquarters": "Nairobi City",
    "region": "Nairobi",
    "area_km2": 694.9,
    "population": 4397073,
    "governor": "Johnson Sakaja",
    "governor_party": "UDA",
    "governor_since": 2022,
    "flag_url": "https://upload.wikimedia.org/wikipedia/commons/5/5e/Flag_of_Nairobi_County.svg",
    "description": "Kenya's capital and largest city, Nairobi is a major global metropolis, the economic hub of East Africa, home to the United Nations Environment Programme (UNEP), Nairobi National Park, and a fast-growing tech startup ecosystem."
  }
}
{
  "success": true,
  "data": {
    "id": 47, "name": "Nairobi",
    "governor": "Johnson Sakaja", "governor_party": "UDA",
    "flag_url": "https://upload.wikimedia.org/wikipedia/commons/5/5e/Flag_of_Nairobi_County.svg",
    "description": "Kenya's capital and largest city..."
  }
}
GET

/counties/governors

Returns a lightweight directory of all 47 county governors, sorted alphabetically by county name. Each record includes the governor's name, party, and year of election alongside the county's code and headquarters. Useful for building a governors index, party breakdown charts, or filtering counties by political affiliation.

curl -X GET "https://kenya-api.netlify.app/api/v1/counties/governors" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/counties/governors", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/counties/governors"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/counties/governors";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/counties/governors"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/counties/governors")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/counties/governors"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "count": 47,
  "data": [
    {
      "id": 30,
      "code": "030",
      "name": "Baringo",
      "headquarters": "Kabarnet",
      "governor": "Benjamin Cheboi",
      "governor_party": "UDA",
      "governor_since": 2022,
      "flag_url": "https://upload.wikimedia.org/wikipedia/commons/6/6c/Flag_of_Baringo_County.svg"
    }
  ]
}
{
  "success": true,
  "count": 47,
  "data": [
    { "id": 47, "name": "Nairobi", "governor": "Johnson Sakaja", "flag_url": "https://upload.wikimedia.org/..." }
  ]
}
GET

/counties/:id/constituencies

Returns constituencies within a specific county.

NameTypeInRequiredDescription
idintegerpathyesCounty ID from 1 to 47
curl -X GET "https://kenya-api.netlify.app/api/v1/counties/47/constituencies" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/counties/47/constituencies", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/counties/47/constituencies"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/counties/47/constituencies";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/counties/47/constituencies"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/counties/47/constituencies")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/counties/47/constituencies"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "data": [
    { "id": 1 , "name": "Changamwe" }
  ]
}
{
  "success": true,
  "data": [
    { "id": 1 , "name": "Changamwe" }
  ]
}

Constituencies

Explore constituency-level data across Kenya.

GET

/constituencies

Returns all 290 constituencies.

curl -X GET "https://kenya-api.netlify.app/api/v1/constituencies" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/constituencies", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/constituencies"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/constituencies";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/constituencies"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/constituencies")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/constituencies"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "count": 290,
  "data": [ ... ]
}
{
  "success": true,
  "count": 290,
  "data": [ ... ]
}
GET

/constituencies/:id

Returns a single constituency.

NameTypeInRequiredDescription
idintegerpathyesConstituency ID
curl -X GET "https://kenya-api.netlify.app/api/v1/constituencies/1" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/constituencies/1", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/constituencies/1"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/constituencies/1";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/constituencies/1"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/constituencies/1")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/constituencies/1"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "data": {
    "id": 1, "name": "Changamwe"
  }
}
{
  "success": true,
  "data": {
    "id": 1, "name": "Changamwe"
  }
}

Public Holidays

Access national holiday information for any supported year.

GET

/holidays

Returns all public holidays. Optionally filter by year.

NameTypeInRequiredDescription
yearintegerquerynoYear to filter holidays by, e.g. 2025
curl -X GET "https://kenya-api.netlify.app/api/v1/holidays?year=2025" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/holidays?year=2025", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/holidays?year=2025"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/holidays?year=2025";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/holidays?year=2025"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/holidays?year=2025")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/holidays?year=2025"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "count": 8,
  "data": [ ... ]
}
{
  "success": true,
  "count": 9,
  "data": [ ... ]
}
GET

/holidays/:id

Returns details for a single holiday by ID.

NameTypeInRequiredDescription
idintegerpathyesHoliday ID
curl -X GET "https://kenya-api.netlify.app/api/v1/holidays/1" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/holidays/1", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/holidays/1"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/holidays/1";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/holidays/1"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/holidays/1")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/holidays/1"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "data": {
    "id": 1, "name": "New Year's Day"
  }
}
{
  "success": true,
  "data": {
    "id": 1, "name": "New Year's Day"
  }
}

Population

Retrieve national population statistics and county breakdowns.

GET

/population

Returns a summary of national population totals.

curl -X GET "https://kenya-api.netlify.app/api/v1/population" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/population", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/population"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/population";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/population"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/population")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/population"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "data": {
    "total_population": 53771296,
    "most_populous_county": {
      "name": "Nairobi",
      "population": 4397073
    },
    "census_year": 2019,
    "source": "Kenya National Bureau of Statistics"
  }
}
{
  "success": true,
  "data": {
    "population": 53771296,
    "female": 27358296
  }
}
GET

/population/counties

Returns population breakdown for each county.

curl -X GET "https://kenya-api.netlify.app/api/v1/population/counties" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/population/counties", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/population/counties"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/population/counties";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/population/counties"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/population/counties")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/population/counties"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "data": [ ... ]
}
{
  "success": true,
  "data": [ ... ]
}

Exchange Rates

Returns live KES exchange rates for 25 currencies, sourced from open.er-api.com mid-market rates. Rates are refreshed hourly and cached server-side to ensure fast response times. Includes buy, mean, and sell rates with a small illustrative spread.

Live data notice: Exchange rates are fetched live from a public exchange rate provider, not the Central Bank of Kenya. Rates reflect open market mid-rates and may differ slightly from bank or forex bureau rates. Data is cached for 1 hour to ensure fast responses.
GET

/exchange-rates

Returns live KES exchange rates for 25 currencies. Rates are fetched from open.er-api.com and cached server-side for 1 hour. Supports ?q= to filter by currency code or name.

curl -X GET "https://kenya-api.netlify.app/api/v1/exchange-rates" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/exchange-rates", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/exchange-rates"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/exchange-rates";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/exchange-rates"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/exchange-rates")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/exchange-rates"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "base_currency": "KES",
  "last_updated": "Wed, 17 Jun 2026 00:02:31 +0000",
  "next_update": "Thu, 18 Jun 2026 00:17:01 +0000",
  "source": "open.er-api.com (live mid-market rates)",
  "count": 25,
  "data": [
    {
      "id": 1,
      "currency": "USD",
      "currency_name": "US Dollar",
      "buy": 129.04,
      "mean": 129.43,
      "sell": 129.82
    },
    "..."
  ]
}
// Click "Try It" to fetch live data from the API
GET

/exchange-rates/:currency

Returns the live KES rate for a specific currency. Case-insensitive.

NameTypeInRequiredDescription
currencystringpathyesISO 4217 code (e.g. USD, EUR, GBP). Case-insensitive. Available codes: USD, GBP, EUR, JPY, ZAR, AED, CAD, AUD, CHF, CNY, INR, SEK, NOK, DKK, SAR, QAR, HKD, SGD, UGX, TZS, RWF, ETB, NGN, ZMW, MUR
curl -X GET "https://kenya-api.netlify.app/api/v1/exchange-rates/USD" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/exchange-rates/USD", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/exchange-rates/USD"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/exchange-rates/USD";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/exchange-rates/USD"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/exchange-rates/USD")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/exchange-rates/USD"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "base_currency": "KES",
  "last_updated": "Wed, 17 Jun 2026 00:02:31 +0000",
  "source": "open.er-api.com (live mid-market rates)",
  "data": {
    "id": 1,
    "currency": "USD",
    "currency_name": "US Dollar",
    "buy": 129.04,
    "mean": 129.43,
    "sell": 129.82
  }
}
// Click "Try It" to fetch live data from the API

Educational Institutions

Kenya's educational institutions covering 53 universities (41 public + 12 private chartered) accredited by CUE and 613 TVET institutions accredited by TVETA, including National Polytechnics, Technical Training Institutes, and Vocational Training Centers across all 47 counties.

GET

/institutions

Returns institutions with optional pagination or filters.

NameTypeInRequiredDescription
pageintegerquerynoPage number for pagination
limitintegerquerynoMaximum items per page
typestringquerynoInstitution type (University, TVET, Secondary School, Primary School, College)
categorystringquerynoInstitution category (Public, Private, Faith-Based, Technical)
initialsstringquerynoFilter by university initials e.g. UON, JKUAT, KU
curl -X GET "https://kenya-api.netlify.app/api/v1/institutions" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/institutions", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/institutions"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/institutions";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/institutions"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/institutions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/institutions"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "count": 10,
  "page": 1,
  "data": [ ... ]
}
GET

/institutions/universities

Returns all universities in Kenya — both public (41) and private (12) — accredited by the Commission for University Education (CUE). Sorted alphabetically. Filter by ?category=Public or ?category=Private.

NameTypeInRequiredDescription
categorystringquerynoPublic or Private
county_idintegerquerynoFilter by county ID e.g. 47 for Nairobi
curl -X GET "https://kenya-api.netlify.app/api/v1/institutions/universities" \
  -H "Accept: application/json"

# Public universities only
curl "https://kenya-api.netlify.app/api/v1/institutions/universities?category=Public"

# Private universities only
curl "https://kenya-api.netlify.app/api/v1/institutions/universities?category=Private"
const response = await fetch("https://kenya-api.netlify.app/api/v1/institutions/universities", {
  method: "GET",
  headers: { "Accept": "application/json" }
});
const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/institutions/universities"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
print(response.json())
<?php
$url = "https://kenya-api.netlify.app/api/v1/institutions/universities";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Accept: application/json"]);
$response = curl_exec($ch);
curl_close($ch);
print_r(json_decode($response, true));
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/institutions/universities"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")
  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()
  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/institutions/universities")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"
response = http.request(request)
puts JSON.parse(response.body)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/institutions/universities"))
      .header("Accept", "application/json")
      .GET()
      .build();
    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "count": 53,
  "public_count": 41,
  "private_count": 12,
  "accreditor": "Commission for University Education (CUE)",
  "data": [
    {
      "id": 689,
      "name": "Strathmore University",
      "initials": "SU",
      "type": "University",
      "category": "Private",
      "county_id": 47,
      "county_name": "Nairobi",
      "address": "Ole Sangale Road, Madaraka Estate, Nairobi",
      "phone": "+254 703 034 000",
      "email": "admissions@strathmore.edu",
      "website": "https://www.strathmore.edu",
      "description": "A Nairobi-based institution emphasising high standards of teaching, research, and student welfare...",
      "accredited_by": "Commission for University Education (CUE)"
    },
    "..."
  ]
}
// Click "Try It" to fetch live data from the API
GET

/institutions/tvets

Returns all TVET institutions accredited by TVETA — including National Polytechnics, Technical Training Institutes, and Vocational Training Centers. Supports ?subtype=, ?category=, and ?county_id= filters.

NameTypeInRequiredDescription
subtypestringquerynopolytechnic = National Polytechnics only · tvc = TVCs and TTIs only
categorystringquerynoPublic or Private
county_idintegerquerynoFilter by county ID e.g. 47 for Nairobi
curl -X GET "https://kenya-api.netlify.app/api/v1/institutions/tvets" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/institutions/tvets", {
  method: "GET",
  headers: { "Accept": "application/json" }
});
const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/institutions/tvets"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
print(response.json())
<?php
$url = "https://kenya-api.netlify.app/api/v1/institutions/tvets";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Accept: application/json"]);
$response = curl_exec($ch);
curl_close($ch);
print_r(json_decode($response, true));
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/institutions/tvets"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")
  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()
  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/institutions/tvets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"
response = http.request(request)
puts JSON.parse(response.body)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/institutions/tvets"))
      .header("Accept", "application/json")
      .GET()
      .build();
    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "count": 613,
  "accreditor": "Technical and Vocational Education and Training Authority (TVETA)",
  "data": [
    {
      "id": 109,
      "name": "ABC Kivi VTC",
      "type": "Technical and Vocational College (TVET)",
      "category": "Public",
      "county_id": 16,
      "county_name": "Machakos",
      "accredited_by": "Technical and Vocational Education and Training Authority (TVETA)"
    },
    "..."
  ]
}
// Click "Try It" to fetch live data from the API
GET

/institutions/:id

Returns a single institution by ID.

NameTypeInRequiredDescription
idintegerpathyesInstitution ID
curl -X GET "https://kenya-api.netlify.app/api/v1/institutions/1" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/institutions/1", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/institutions/1"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/institutions/1";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/institutions/1"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/institutions/1")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/institutions/1"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "data": {
    "id": 1, "name": "Technical University of Mombasa"
  }
}
GET

/institutions/county/:county_id

Returns institutions in a given county.

NameTypeInRequiredDescription
county_idintegerpathyesCounty ID from 1 to 47
curl -X GET "https://kenya-api.netlify.app/api/v1/institutions/county/47" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/institutions/county/47", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/institutions/county/47"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/institutions/county/47";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/institutions/county/47"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/institutions/county/47")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/institutions/county/47"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "count": 4,
  "data": [ ... ]
}
GET

/institutions/type/:type

Returns all institutions matching the requested type.

NameTypeInRequiredDescription
typestringpathyesValid institution type, e.g. University
curl -X GET "https://kenya-api.netlify.app/api/v1/institutions/type/University" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/institutions/type/University", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/institutions/type/University"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/institutions/type/University";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/institutions/type/University"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/institutions/type/University")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/institutions/type/University"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}
GET

/institutions/search?q=...

Search institutions by name, address, county, or constituency.

NameTypeInRequiredDescription
qstringqueryyesSearch term, at least 2 characters
curl -X GET "https://kenya-api.netlify.app/api/v1/institutions/search?q=nairobi" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/institutions/search?q=nairobi", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/institutions/search?q=nairobi"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/institutions/search?q=nairobi";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/institutions/search?q=nairobi"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/institutions/search?q=nairobi")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/institutions/search?q=nairobi"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Ministries

Kenya's 22 Cabinet Secretaries and their ministries, sourced from the Office of the President. Includes ministry name, cabinet secretary, appointment year, official image, and ministry website.

GET

/ministries

Returns all 22 ministries and their Cabinet Secretaries. Supports ?appointed=2022 or ?appointed=2024 to filter by appointment year.

NameTypeInRequiredDescription
appointedstringquerynoFilter by appointment year, e.g. 2022, 2024
curl -X GET "https://kenya-api.netlify.app/api/v1/ministries" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/ministries", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/ministries"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/ministries";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/ministries"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/ministries")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/ministries"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "count": 22,
  "source": "Office of the President of Kenya",
  "data": [
    {
      "id": 1,
      "ministry": "Foreign and Diaspora Affairs",
      "cabinet_secretary": "Dr. Musalia Mudavadi E.G.H.",
      "title": "Prime Cabinet Secretary and Cabinet Secretary",
      "appointed": "2022",
      "image_url": "https://www.president.go.ke/wp-content/uploads/Mudavadi.jpg",
      "ministry_website": "https://www.mfa.go.ke",
      "source": "https://www.president.go.ke/cabinet/"
    }
  ]
}
{
  "success": true,
  "count": 22,
  "source": "Office of the President of Kenya",
  "data": [
    { "id": 1, "ministry": "Foreign and Diaspora Affairs", "cabinet_secretary": "Dr. Musalia Mudavadi E.G.H." },
    "..."
  ]
}
GET

/ministries/:id

Returns a single ministry by numeric ID (1–22).

NameTypeInRequiredDescription
idintegerpathyesMinistry ID from 1 to 22
curl -X GET "https://kenya-api.netlify.app/api/v1/ministries/1" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/ministries/1", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/ministries/1"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/ministries/1";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/ministries/1"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/ministries/1")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/ministries/1"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "data": {
    "id": 1,
    "ministry": "Foreign and Diaspora Affairs",
    "cabinet_secretary": "Dr. Musalia Mudavadi E.G.H.",
    "title": "Prime Cabinet Secretary and Cabinet Secretary",
    "appointed": "2022",
    "image_url": "https://www.president.go.ke/wp-content/uploads/Mudavadi.jpg",
    "ministry_website": "https://www.mfa.go.ke",
    "source": "https://www.president.go.ke/cabinet/"
  }
}
{
  "success": true,
  "data": {
    "id": 1, "ministry": "Foreign and Diaspora Affairs",
    "cabinet_secretary": "Dr. Musalia Mudavadi E.G.H.",
    "appointed": "2022"
  }
}
GET

/ministries/search?q=

Search ministries by ministry name or cabinet secretary name. Minimum 2 characters required.

NameTypeInRequiredDescription
qstringqueryyesSearch term (min 2 chars) — searches ministry name and cabinet secretary name
curl -X GET "https://kenya-api.netlify.app/api/v1/ministries/search?q=health" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/ministries/search?q=health", {
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
});

const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/ministries/search?q=health"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
<?php
$url = "https://kenya-api.netlify.app/api/v1/ministries/search?q=health";
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Accept: application/json"
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/ministries/search?q=health"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")

  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()

  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/ministries/search?q=health")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"

response = http.request(request)
data = JSON.parse(response.body)
puts data
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/ministries/search?q=health"))
      .header("Accept", "application/json")
      .GET()
      .build();

    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "query": "health",
  "count": 1,
  "data": [
    { "id": 5, "ministry": "Health", "cabinet_secretary": "Aden Duale E.G.H." }
  ]
}
{
  "success": true,
  "query": "health",
  "count": 1,
  "data": [
    { "id": 5, "ministry": "Health", "cabinet_secretary": "Aden Duale E.G.H." }
  ]
}

Postal Codes

Kenya postal codes mapped to all 47 counties and their constituencies. Sourced from Posta Kenya and PostZipCode.com.

GET

/postal-codes

Returns postal code data for all 47 counties, including constituency-level codes and the county primary postal code range.

curl -X GET "https://kenya-api.netlify.app/api/v1/postal-codes" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/postal-codes", {
  method: "GET",
  headers: { "Accept": "application/json" }
});
const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/postal-codes"
response = requests.get(url, headers={"Accept": "application/json"})
print(response.json())
<?php
$ch = curl_init("https://kenya-api.netlify.app/api/v1/postal-codes");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Accept: application/json"]);
print_r(json_decode(curl_exec($ch), true));
curl_close($ch);
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  req, _ := http.NewRequest("GET", "https://kenya-api.netlify.app/api/v1/postal-codes", nil)
  req.Header.Set("Accept", "application/json")
  resp, _ := http.DefaultClient.Do(req)
  defer resp.Body.Close()
  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/postal-codes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
req = Net::HTTP::Get.new(url)
req["Accept"] = "application/json"
puts JSON.parse(http.request(req).body)
import java.net.URI;
import java.net.http.*;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/postal-codes"))
      .header("Accept", "application/json")
      .GET().build();
    System.out.println(client.send(request, HttpResponse.BodyHandlers.ofString()).body());
  }
}

Example response

{
  "success": true,
  "count": 47,
  "source": "Posta Kenya / PostZipCode.com",
  "data": [
    {
      "id": 1,
      "county_id": 1,
      "county_name": "Mombasa",
      "postal_code_range": { "from": "80100", "to": "80118" },
      "primary_postal_code": "80100",
      "constituencies": [ "..." ]
    }
  ]
}
// Click "Try It" to fetch live data from the API
GET

/postal-codes/county/:county_id

Returns postal code data for a single county by its numeric ID, including all constituency-level codes.

NameTypeInRequiredDescription
county_idintegerpathyesCounty ID (1–47)
curl -X GET "https://kenya-api.netlify.app/api/v1/postal-codes/county/47" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/postal-codes/county/47");
const data = await response.json();
console.log(data);
import requests
response = requests.get("https://kenya-api.netlify.app/api/v1/postal-codes/county/47")
print(response.json())
<?php
$response = file_get_contents("https://kenya-api.netlify.app/api/v1/postal-codes/county/47");
print_r(json_decode($response, true));
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  resp, _ := http.Get("https://kenya-api.netlify.app/api/v1/postal-codes/county/47")
  defer resp.Body.Close()
  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"
puts JSON.parse(Net::HTTP.get(URI("https://kenya-api.netlify.app/api/v1/postal-codes/county/47")))
import java.net.URI;
import java.net.http.*;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/postal-codes/county/47"))
      .GET().build();
    System.out.println(client.send(request, HttpResponse.BodyHandlers.ofString()).body());
  }
}

Example response (Nairobi)

{
  "success": true,
  "data": {
    "county_id": 47,
    "county_name": "Nairobi",
    "primary_postal_code": "00100",
    "postal_code_range": { "from": "00100", "to": "00800" },
    "constituencies": [
      { "name": "Westlands", "postal_code": "00600" },
      { "name": "Kamukunji", "postal_code": "00200" },
      "..."
    ]
  }
}
// Click "Try It" to fetch live data from the API
GET

/postal-codes/constituency

Looks up postal codes by constituency name. Partial, case-insensitive match. Returns county context and the county-level range.

NameTypeInRequiredDescription
namestringqueryyesConstituency name or partial name (e.g. Westlands)
curl -X GET "https://kenya-api.netlify.app/api/v1/postal-codes/constituency?name=Westlands" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/postal-codes/constituency?name=Westlands");
const data = await response.json();
console.log(data);
import requests
response = requests.get(
  "https://kenya-api.netlify.app/api/v1/postal-codes/constituency",
  params={"name": "Westlands"}
)
print(response.json())
<?php
$url = "https://kenya-api.netlify.app/api/v1/postal-codes/constituency?" . http_build_query(["name" => "Westlands"]);
print_r(json_decode(file_get_contents($url), true));
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  resp, _ := http.Get("https://kenya-api.netlify.app/api/v1/postal-codes/constituency?name=Westlands")
  defer resp.Body.Close()
  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"
puts JSON.parse(Net::HTTP.get(URI("https://kenya-api.netlify.app/api/v1/postal-codes/constituency?name=Westlands")))
import java.net.URI;
import java.net.http.*;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/postal-codes/constituency?name=Westlands"))
      .GET().build();
    System.out.println(client.send(request, HttpResponse.BodyHandlers.ofString()).body());
  }
}

Example response

{
  "success": true,
  "count": 1,
  "data": [
    {
      "county_id": 47,
      "county_name": "Nairobi",
      "constituency": "Westlands",
      "postal_code": "00600",
      "county_postal_range": { "from": "00100", "to": "00800" }
    }
  ]
}
// Click "Try It" to fetch live data from the API
GET

Search postal codes by county name, constituency name, or code number. Returns typed results (county or constituency) in a single list.

NameTypeInRequiredDescription
qstringqueryyesSearch term — county name, constituency name, or code (min 2 chars)
curl -X GET "https://kenya-api.netlify.app/api/v1/postal-codes/search?q=00100" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/postal-codes/search?q=00100");
const data = await response.json();
console.log(data);
import requests
response = requests.get(
  "https://kenya-api.netlify.app/api/v1/postal-codes/search",
  params={"q": "00100"}
)
print(response.json())
<?php
$url = "https://kenya-api.netlify.app/api/v1/postal-codes/search?" . http_build_query(["q" => "00100"]);
print_r(json_decode(file_get_contents($url), true));
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  resp, _ := http.Get("https://kenya-api.netlify.app/api/v1/postal-codes/search?q=00100")
  defer resp.Body.Close()
  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"
puts JSON.parse(Net::HTTP.get(URI("https://kenya-api.netlify.app/api/v1/postal-codes/search?q=00100")))
import java.net.URI;
import java.net.http.*;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/postal-codes/search?q=00100"))
      .GET().build();
    System.out.println(client.send(request, HttpResponse.BodyHandlers.ofString()).body());
  }
}

Example response

{
  "success": true,
  "query": "00100",
  "count": 12,
  "data": [
    {
      "type": "county",
      "county_name": "Nairobi",
      "primary_postal_code": "00100"
    },
    {
      "type": "constituency",
      "county_name": "Nairobi",
      "constituency": "Starehe",
      "postal_code": "00100"
    },
    "..."
  ]
}
// Click "Try It" to fetch live data from the API

Wards

Kenya's 1,263 electoral wards organised by county and sub-county. Data sourced from the IEBC via an open CC0 dataset on GitHub. Covers 45 of 47 counties (Nairobi, Kericho, and Bomet are not in the upstream source).

GET

/wards

All wards with optional filters. Paginated — default 50 per page.

NameTypeInRequiredDescription
county_idintegerquerynoFilter by county ID (1–47)
sub_countystringquerynoFilter by sub-county name (partial match)
pageintegerquerynoPage number (default: 1)
limitintegerquerynoResults per page (default: 50)
curl -X GET "https://kenya-api.netlify.app/api/v1/wards?county_id=1&limit=50" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/wards?county_id=1&limit=50");
const data = await response.json();
console.log(data);
import requests
response = requests.get("https://kenya-api.netlify.app/api/v1/wards", params={"county_id": 1, "limit": 50})
print(response.json())
<?php
$response = file_get_contents("https://kenya-api.netlify.app/api/v1/wards?county_id=1&limit=50");
print_r(json_decode($response, true));
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  resp, _ := http.Get("https://kenya-api.netlify.app/api/v1/wards?county_id=1&limit=50")
  defer resp.Body.Close()
  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/wards?county_id=1&limit=50")
puts JSON.parse(Net::HTTP.get(url))
import java.net.URI;
import java.net.http.*;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/wards?county_id=1&limit=50"))
      .header("Accept", "application/json")
      .GET().build();
    System.out.println(client.send(request, HttpResponse.BodyHandlers.ofString()).body());
  }
}

Example response

{
  "success": true,
  "total": 30,
  "count": 30,
  "page": 1,
  "totalPages": 1,
  "data": [
    {
      "id": 1,
      "sub_county_id": 1,
      "sub_county_name": "Changamwe",
      "county_id": 1,
      "county_name": "Mombasa",
      "ward": "Port Reitz"
    }
  ]
}
// Click "Try It" to fetch live data from the API
GET

/wards/county/:county_id

All wards in a county grouped by sub-county. Ideal for building cascading dropdowns (county → sub-county → ward).

NameTypeInRequiredDescription
county_idintegerpathyesCounty ID (1–47)
curl -X GET "https://kenya-api.netlify.app/api/v1/wards/county/1" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/wards/county/1");
const data = await response.json();
console.log(data);
import requests
response = requests.get("https://kenya-api.netlify.app/api/v1/wards/county/1")
print(response.json())
<?php
$response = file_get_contents("https://kenya-api.netlify.app/api/v1/wards/county/1");
print_r(json_decode($response, true));
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  resp, _ := http.Get("https://kenya-api.netlify.app/api/v1/wards/county/1")
  defer resp.Body.Close()
  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/wards/county/1")
puts JSON.parse(Net::HTTP.get(url))
import java.net.URI;
import java.net.http.*;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/wards/county/1"))
      .header("Accept", "application/json")
      .GET().build();
    System.out.println(client.send(request, HttpResponse.BodyHandlers.ofString()).body());
  }
}

Example response

{
  "success": true,
  "county_id": 1,
  "county_name": "Mombasa",
  "sub_counties": 6,
  "ward_count": 30,
  "data": [
    {
      "sub_county_id": 1,
      "sub_county_name": "Changamwe",
      "wards": [ "Port Reitz", "Kipevu", "Airport", "Changamwe", "Chaani" ]
    }
  ]
}
// Click "Try It" to fetch live data from the API
GET

/wards/sub-county?name=

Returns all wards for a specific sub-county by name. Partial name matches are supported.

NameTypeInRequiredDescription
namestringqueryyesSub-county name or partial name (e.g. Changamwe)
curl -X GET "https://kenya-api.netlify.app/api/v1/wards/sub-county?name=Changamwe" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/wards/sub-county?name=Changamwe");
const data = await response.json();
console.log(data);
import requests
response = requests.get("https://kenya-api.netlify.app/api/v1/wards/sub-county", params={"name": "Changamwe"})
print(response.json())
<?php
$response = file_get_contents("https://kenya-api.netlify.app/api/v1/wards/sub-county?name=Changamwe");
print_r(json_decode($response, true));
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  resp, _ := http.Get("https://kenya-api.netlify.app/api/v1/wards/sub-county?name=Changamwe")
  defer resp.Body.Close()
  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/wards/sub-county?name=Changamwe")
puts JSON.parse(Net::HTTP.get(url))
import java.net.URI;
import java.net.http.*;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/wards/sub-county?name=Changamwe"))
      .header("Accept", "application/json")
      .GET().build();
    System.out.println(client.send(request, HttpResponse.BodyHandlers.ofString()).body());
  }
}
// Click "Try It" to fetch live data from the API
GET

/wards/sub-counties/:county_id

Returns only the list of sub-counties in a county — no ward details. Lightweight endpoint for populating dropdowns.

NameTypeInRequiredDescription
county_idintegerpathyesCounty ID (1–47)
curl -X GET "https://kenya-api.netlify.app/api/v1/wards/sub-counties/1" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/wards/sub-counties/1");
const data = await response.json();
console.log(data);
import requests
response = requests.get("https://kenya-api.netlify.app/api/v1/wards/sub-counties/1")
print(response.json())
<?php
$response = file_get_contents("https://kenya-api.netlify.app/api/v1/wards/sub-counties/1");
print_r(json_decode($response, true));
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  resp, _ := http.Get("https://kenya-api.netlify.app/api/v1/wards/sub-counties/1")
  defer resp.Body.Close()
  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/wards/sub-counties/1")
puts JSON.parse(Net::HTTP.get(url))
import java.net.URI;
import java.net.http.*;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/wards/sub-counties/1"))
      .header("Accept", "application/json")
      .GET().build();
    System.out.println(client.send(request, HttpResponse.BodyHandlers.ofString()).body());
  }
}

Example response

{
  "success": true,
  "county_id": 1,
  "county_name": "Mombasa",
  "count": 6,
  "data": [
    { "sub_county_id": 1, "sub_county_name": "Changamwe", "county_id": 1, "county_name": "Mombasa" },
    { "sub_county_id": 2, "sub_county_name": "Jomvu", "county_id": 1, "county_name": "Mombasa" }
  ]
}
// Click "Try It" to fetch live data from the API
GET

Search ward names, sub-county names, or county names. Returns all matching ward records. Minimum 2 characters.

NameTypeInRequiredDescription
qstringqueryyesSearch term (min 2 chars) — matches ward, sub-county, or county name
curl -X GET "https://kenya-api.netlify.app/api/v1/wards/search?q=karen" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/wards/search?q=karen");
const data = await response.json();
console.log(data);
import requests
response = requests.get("https://kenya-api.netlify.app/api/v1/wards/search", params={"q": "karen"})
print(response.json())
<?php
$response = file_get_contents("https://kenya-api.netlify.app/api/v1/wards/search?q=karen");
print_r(json_decode($response, true));
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  resp, _ := http.Get("https://kenya-api.netlify.app/api/v1/wards/search?q=karen")
  defer resp.Body.Close()
  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/wards/search?q=karen")
puts JSON.parse(Net::HTTP.get(url))
import java.net.URI;
import java.net.http.*;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/wards/search?q=karen"))
      .header("Accept", "application/json")
      .GET().build();
    System.out.println(client.send(request, HttpResponse.BodyHandlers.ofString()).body());
  }
}
// Click "Try It" to fetch live data from the API

Parks & Reserves

Kenya's 35 national parks, reserves, marine parks, and wildlife sanctuaries managed by Kenya Wildlife Service (KWS). Includes location, size, coordinates, wildlife highlights, and conservation status.

GET

/parks

Returns all parks and reserves with optional filters by type, county, or wildlife features.

NameTypeInRequiredDescription
typestringquerynoNational Park, National Reserve, Marine Park & Reserve, Wildlife Sanctuary
county_idintegerquerynoFilter by county ID e.g. 32 for Nakuru
big_catsbooleanquerynotrue = parks with lions, leopards, or cheetahs
marinebooleanquerynotrue = marine parks only
most_visitedbooleanquerynotrue = most popular parks
curl -X GET "https://kenya-api.netlify.app/api/v1/parks" \
  -H "Accept: application/json"

# Most visited parks
curl "https://kenya-api.netlify.app/api/v1/parks?most_visited=true"

# Marine parks only
curl "https://kenya-api.netlify.app/api/v1/parks?marine=true"

# Parks with big cats
curl "https://kenya-api.netlify.app/api/v1/parks?big_cats=true"
const response = await fetch("https://kenya-api.netlify.app/api/v1/parks", {
  method: "GET",
  headers: { "Accept": "application/json" }
});
const data = await response.json();
console.log(data);
import requests

url = "https://kenya-api.netlify.app/api/v1/parks"
headers = {"Accept": "application/json"}

response = requests.get(url, headers=headers)
print(response.json())
<?php
$url = "https://kenya-api.netlify.app/api/v1/parks";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Accept: application/json"]);
$response = curl_exec($ch);
curl_close($ch);
print_r(json_decode($response, true));
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  url := "https://kenya-api.netlify.app/api/v1/parks"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("Accept", "application/json")
  client := &http.Client{}
  resp, _ := client.Do(req)
  defer resp.Body.Close()
  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/parks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Accept"] = "application/json"
response = http.request(request)
puts JSON.parse(response.body)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/parks"))
      .header("Accept", "application/json")
      .GET()
      .build();
    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "count": 35,
  "managed_by": "Kenya Wildlife Service (KWS)",
  "data": [ "..." ]
}
// Click "Try It" to fetch live data from the API
GET

/parks/:id

Returns a single park by its numeric ID.

NameTypeInRequiredDescription
idintegerpathyesPark ID e.g. 2 for Amboseli
curl -X GET "https://kenya-api.netlify.app/api/v1/parks/2" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/parks/2");
const data = await response.json();
console.log(data);
import requests

response = requests.get("https://kenya-api.netlify.app/api/v1/parks/2")
print(response.json())
<?php
$response = file_get_contents("https://kenya-api.netlify.app/api/v1/parks/2");
print_r(json_decode($response, true));
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  resp, _ := http.Get("https://kenya-api.netlify.app/api/v1/parks/2")
  defer resp.Body.Close()
  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/parks/2")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
response = http.request(Net::HTTP::Get.new(url))
puts JSON.parse(response.body)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/parks/2"))
      .GET().build();
    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "data": {
    "id": 2,
    "name": "Amboseli National Park",
    "type": "National Park",
    "county_ids": [34],
    "counties": ["Kajiado"],
    "region": "Southern Kenya",
    "famous_for": "Elephants & Mount Kilimanjaro views",
    "description": "One of Kenya's most iconic parks...",
    "size_km2": 392,
    "managed_by": "Kenya Wildlife Service (KWS)",
    "big_cats": true,
    "marine": false,
    "most_visited": true,
    "coordinates": { "lat": -2.6527, "lng": 37.2606 }
  }
}
// Click "Try It" to fetch live data from the API
GET

/parks/county/:county_id

Returns all parks in a given county. Parks that span multiple counties appear in each relevant county's results.

NameTypeInRequiredDescription
county_idintegerpathyesCounty ID e.g. 32 for Nakuru (returns Hell's Gate, Lake Nakuru, Mt Longonot, Lake Elementaita)
curl -X GET "https://kenya-api.netlify.app/api/v1/parks/county/32" \
  -H "Accept: application/json"
const response = await fetch("https://kenya-api.netlify.app/api/v1/parks/county/32");
const data = await response.json();
console.log(data);
import requests

response = requests.get("https://kenya-api.netlify.app/api/v1/parks/county/32")
print(response.json())
<?php
$response = file_get_contents("https://kenya-api.netlify.app/api/v1/parks/county/32");
print_r(json_decode($response, true));
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  resp, _ := http.Get("https://kenya-api.netlify.app/api/v1/parks/county/32")
  defer resp.Body.Close()
  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/parks/county/32")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
response = http.request(Net::HTTP::Get.new(url))
puts JSON.parse(response.body)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://kenya-api.netlify.app/api/v1/parks/county/32"))
      .GET().build();
    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "county_id": 32,
  "count": 4,
  "data": [ "..." ]
}
// Click "Try It" to fetch live data from the API
GET

/parks/type/:type

Returns all parks of a specific type. URL-encode spaces and ampersands in the type parameter.

NameTypeInRequiredDescription
typestringpathyesNational Park · National Reserve · Marine Park & Reserve · Wildlife Sanctuary
# All national parks
curl "https://kenya-api.netlify.app/api/v1/parks/type/National%20Park"

# Marine parks and reserves
curl "https://kenya-api.netlify.app/api/v1/parks/type/Marine%20Park%20%26%20Reserve"
const type = encodeURIComponent("National Park");
const response = await fetch(
  `https://kenya-api.netlify.app/api/v1/parks/type/${type}`
);
const data = await response.json();
console.log(data);
import requests
from urllib.parse import quote

park_type = quote("National Park")
response = requests.get(
  f"https://kenya-api.netlify.app/api/v1/parks/type/{park_type}"
)
print(response.json())
<?php
$type = urlencode("National Park");
$response = file_get_contents(
  "https://kenya-api.netlify.app/api/v1/parks/type/{$type}"
);
print_r(json_decode($response, true));
?>
package main

import (
  "fmt"
  "io"
  "net/http"
  "net/url"
)

func main() {
  parkType := url.PathEscape("National Park")
  resp, _ := http.Get(
    "https://kenya-api.netlify.app/api/v1/parks/type/" + parkType,
  )
  defer resp.Body.Close()
  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"
require "uri"

type = URI.encode_uri_component("National Park")
url = URI("https://kenya-api.netlify.app/api/v1/parks/type/#{type}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
response = http.request(Net::HTTP::Get.new(url))
puts JSON.parse(response.body)
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.*;
import java.nio.charset.StandardCharsets;

public class Main {
  public static void main(String[] args) throws Exception {
    String type = URLEncoder.encode("National Park", StandardCharsets.UTF_8)
      .replace("+", "%20");
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create(
        "https://kenya-api.netlify.app/api/v1/parks/type/" + type
      ))
      .GET().build();
    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "type": "National Park",
  "count": 22,
  "data": [ "..." ]
}
// Click "Try It" to fetch live data from the API
GET

Search parks by name, famous_for, description, region, or county. Minimum 2 characters.

NameTypeInRequiredDescription
qstringqueryyesSearch term (min 2 characters) e.g. elephant, coral, rift
curl "https://kenya-api.netlify.app/api/v1/parks/search?q=elephant"
const response = await fetch(
  "https://kenya-api.netlify.app/api/v1/parks/search?q=elephant"
);
const data = await response.json();
console.log(data);
import requests

response = requests.get(
  "https://kenya-api.netlify.app/api/v1/parks/search",
  params={"q": "elephant"}
)
print(response.json())
<?php
$response = file_get_contents(
  "https://kenya-api.netlify.app/api/v1/parks/search?q=elephant"
);
print_r(json_decode($response, true));
?>
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  resp, _ := http.Get(
    "https://kenya-api.netlify.app/api/v1/parks/search?q=elephant",
  )
  defer resp.Body.Close()
  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
require "net/http"
require "json"

url = URI("https://kenya-api.netlify.app/api/v1/parks/search?q=elephant")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
response = http.request(Net::HTTP::Get.new(url))
puts JSON.parse(response.body)
import java.net.URI;
import java.net.http.*;

public class Main {
  public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create(
        "https://kenya-api.netlify.app/api/v1/parks/search?q=elephant"
      ))
      .GET().build();
    HttpResponse<String> response = client.send(
      request, HttpResponse.BodyHandlers.ofString()
    );
    System.out.println(response.body());
  }
}

Example response

{
  "success": true,
  "query": "elephant",
  "count": 10,
  "data": [ "..." ]
}
// Click "Try It" to fetch live data from the API