Skip to content

SDKs & samples

13 official SDKs, one contract. Each implements the 14 endpoints with typed models, Page<T> paging and typed 401/404/429 errors, and is pinned by a contract test replaying the same recorded fixtures in CI.

SDK Install Docs page
JavaScript / TypeScript npm install /path/to/nationkit/sdks/js #javascript
Python pip install git+…#subdirectory=sdks/python #python
Go go get github.com/ibhar-tech/nationkit/sdks/go #go
Rust git dependency in Cargo.toml #rust
Java mvn install from sdks/java #java
Kotlin (JVM/Android) ./gradlew publishToMavenLocal #kotlin
C# / .NET <ProjectReference> / dotnet pack #c-dotnet
PHP (+ Laravel) Composer path repository #php-laravel
Ruby (+ Rails) gemspec git dependency #ruby
Dart / Flutter git dependency in pubspec.yaml #dart-flutter
Elixir path dependency (OTP 27+) #elixir
Scala sbt publishLocal (JDK 17+) #scala
Perl PERL5LIB (core-only, 5.20+) #perl

Package registries

SDKs currently install from this GitHub repository (clone/path/git). Registry publishing (npm, PyPI, crates.io, …) is on the roadmap; the git installs are production-stable and versioned at 1.4.0.

Every snippet below does the same three things: build a client with your key, fetch Algeria's 69 wilayas (paged), and run a multilingual search.

JavaScript

Install: npm install /path/to/nationkit/sdks/js (TypeScript sources, builds on install).

import { NationKitClient, NotFoundError, RateLimitedError, NationKitError } from "nationkit";

const client = new NationKitClient({
  apiKey: process.env.NATIONKIT_API_KEY,
  // baseUrl: "https://api.nationkit.site",  timeoutMs: 10_000
});

const page = await client.getDivisions("dz", { level: 1, perPage: 2500 });
console.log(page.total, page.items[0].names.ar);

const hits = await client.search("dz", "adrar"); // sorted by matchScore desc

try { await client.getCountry("xx"); }
catch (err) {
  if (err instanceof NotFoundError) console.log("no such country");
  else if (err instanceof RateLimitedError) console.log("retry in", err.retryAfterSeconds);
  else if (err instanceof NationKitError) console.log(err.status, err.message);
}

Python

Install: pip install "git+https://github.com/ibhar-tech/nationkit.git#subdirectory=sdks/python"

from nationkit import NationKitClient, NotFoundError, RateLimitedError

client = NationKitClient(api_key="nk_live_...")   # base_url/timeout optional

page = client.get_divisions("dz", level=1, per_page=2500)
print(page.total, page.items[0].names["ar"])

hits = client.search("dz", "adrar")

try:
    client.get_country("xx")
except RateLimitedError as e:
    print("retry in", e.retry_after_seconds)
except NotFoundError:
    print("no such country")

Go

Install: go get github.com/ibhar-tech/nationkit/sdks/go (stdlib-only client).

import nationkit "github.com/ibhar-tech/nationkit/sdks/go"

client := nationkit.NewClient("nk_live_...")
page, err := client.GetDivisions(ctx, "dz", nationkit.DivisionsQuery{Level: 1, PerPage: 2500})
if err != nil { log.Fatal(err) }
fmt.Println(page.Total, page.Items[0].Names["ar"])

hits, _ := client.Search(ctx, "dz", "adrar")

_, err = client.GetCountry(ctx, "xx") // *nationkit.NotFoundError / RateLimitedError / ApiError

Rust

Install: nationkit = { git = "https://github.com/ibhar-tech/nationkit.git" } (reqwest + rustls).

use nationkit::{DivisionsQuery, NationKitClient};

let client = NationKitClient::new("nk_live_...")?;
let page = client.get_divisions("dz", &DivisionsQuery::new().level(1).per_page(2500)).await?;
println!("{} {}", page.total, page.items[0].names["ar"]);

let hits = client.search("dz", "adrar").await?;   // typed NotFoundError/RateLimitedError/ApiError

Java

Install: mvn install from sdks/java (Jackson is the only dependency).

import dev.nationkit.*;

var client = new NationKitClient("nk_live_...");
Page<Division> page = client.getDivisions("dz", DivisionQuery.of().withLevel(1).withPerPage(2500));
System.out.println(page.total() + " " + page.items().get(0).names().get("ar"));

List<SearchResult> hits = client.search("dz", "adrar");

Kotlin

Install: ./gradlew publishToMavenLocal from sdks/kotlin (Ktor client; Android-ready).

import com.nationkit.*

val client = NationKitClient(apiKey = "nk_live_...")
client.use {
    val page = client.getDivisions("dz", level = 1)
    println("${page.total} ${page.items.first().names["ar"]}")
    val hits = client.search("dz", "adrar")
}

C# / .NET

Install: <ProjectReference> to sdks/dotnet/NationKit.Client.csproj or dotnet pack.

using NationKit.Client;

using var client = new NationKitClient("nk_live_...");
Page<Division> page = await client.GetDivisionsAsync("dz", level: 1, perPage: 2500);
Console.WriteLine($"{page.Total} {page.Items[0].Names["ar"]}");

IReadOnlyList<SearchResult> hits = await client.SearchAsync("dz", "adrar");

PHP / Laravel

Install: Composer path repository pointing at sdks/php in a clone. Ships a Laravel service provider + NationKit facade.

use NationKit\NationKitClient;

$client = new NationKitClient(apiKey: getenv('NATIONKIT_API_KEY'));
$wilayas = $client->getDivisions('dz', level: 1, perPage: 2500);
echo $wilayas->total, ' ', $wilayas->items[0]->names['ar'];

$hits = $client->search('dz', 'adrar');

Ruby

Install: gem 'nationkit', git: 'https://github.com/ibhar-tech/nationkit.git', glob: 'sdks/ruby/*.gemspec'

require 'nationkit'

client = NationKit::Client.new(api_key: ENV['NATIONKIT_API_KEY'])
page = client.get_divisions('dz', level: 1, per_page: 2500)
puts "#{page.total} #{page.items.first.names['ar']}"

client.search('dz', 'adrar').each { |hit| puts hit.match_score }

Dart / Flutter

Install: git dependency in pubspec.yaml with path: sdks/dart (ships an Android example app).

import 'package:nationkit/nationkit.dart';

final client = NationKitClient(apiKey: 'nk_live_...');
final page = await client.getDivisions('dz', level: 1);
print('${page.total} ${page.items.first.names['ar']}');
final hits = await client.search('dz', 'adrar');
client.close();

Elixir

Install: {:nationkit, path: "path/to/nationkit/sdks/elixir"} — zero dependencies, OTP 27+.

client = NationKit.Client.new("nk_live_...")

{:ok, page} = NationKit.Client.get_divisions(client, "dz", level: 1, per_page: 2500)
IO.puts("#{page.total} #{hd(page.items).names["ar"]}")

{:ok, hits} = NationKit.Client.search(client, "dz", "adrar")
# {:error, exception} — NationKit.Error.status/1 carries the HTTP status

Scala

Install: "dev.nationkit" %% "nationkit-scala" % "1.4.0" (sbt publishLocal; JDK 17+).

import dev.nationkit.*

val client = NationKitClient(apiKey = "nk_live_...")
val page = Await.result(client.getDivisions("dz", level = Some(1)), 10.seconds)
println(s"${page.total} ${page.items.head.names("ar")}")

val hits = Await.result(client.search("dz", "adrar"), 10.seconds)
// Futures fail with NationKitError subtypes carrying .status

Perl

Install: PERL5LIB=/path/to/nationkit/sdks/perl/lib (zero deps beyond core).

use NationKit;

my $client = NationKit->new(api_key => 'nk_live_...');
my $page = $client->get_divisions('dz', level => 1, per_page => 2500);
print "$page->{total} ", $page->items->[0]->names->{ar}, "\n";

my $hits = $client->search('dz', 'adrar');
# dies with NationKit::NotFoundError / RateLimitedError / ApiError on 4xx