African Bitcoiners
LOGIN
Live Directory API · 1.0.0

Africa’s Bitcoin ecosystem, one request away.

Query every project in the Africa Bitcoin Live Directory by country, category, tag and date. Plain JSON, free to use, built for researchers, journalists and builders.

Listings
176
Countries
26
Categories
11
History from
2026
projects.http
curl "https://api.directory.bitcoiners.africa/api/v1/projects?country=NG&limit=2"
What you can build

One API, four everyday jobs

Pick a job to see the request that does it.

/api/v1/countries
curl "https://api.directory.bitcoiners.africa/api/v1/countries"
Playground

Try it before you write a line

Build a request, send it to this server and see the live response. Then copy it as cURL, JavaScript or Python.

Endpoint
Parameters

Live mode: responses come from this API server.

GEThttps://api.directory.bitcoiners.africa/api/v1/projects?country=NG&lightning=true&limit=5
Ready
// Press “Send request” to see the response
Quickstart

Your first request in a minute

No sign-up needed to browse. Open a terminal and follow along. For higher limits and bulk export, grab a free key from your dashboard.

  1. Make your first request

    Ask for a few projects. Every list response has data (the results) and meta (limit and nextCursor).

    /api/v1/projects
    curl "https://api.directory.bitcoiners.africa/api/v1/projects?limit=2"
  2. Filter it down

    Add filters freely. Here: Lightning-accepting projects in Nigeria.

    /api/v1/projects
    curl "https://api.directory.bitcoiners.africa/api/v1/projects?country=NG&lightning=true&limit=5"
  3. Ask for the big picture

    /api/growth/overview returns the same quarterly numbers as the growth tracker.

    /api/growth/overview
    curl "https://api.directory.bitcoiners.africa/api/growth/overview"
  4. Page through everything

    Lists return up to 100 results at a time. Keep passing meta.nextCursor back as cursor until it comes back null.

    paginate.js
    let cursor = null;
    const all = [];
    
    do {
      const url = new URL("https://api.directory.bitcoiners.africa/api/v1/projects");
      url.searchParams.set("limit", "100");
      if (cursor) url.searchParams.set("cursor", cursor);
    
      const { data, meta } = await (await fetch(url)).json();
      all.push(...data);
      cursor = meta.nextCursor;
    } while (cursor);
    
    console.log(all.length, "projects");

Base URL & format

All public v1 requests go to one base URL over HTTPS. Responses are JSON. Growth endpoints live under /api/growth on the same host.

Base URLhttps://api.directory.bitcoiners.africa
Formatapplication/json
Version1.0.0 (in the path)
OpenAPI/api/v1/openapi.json

List endpoints wrap results in data and describe the page in meta. Pass meta.nextCursor back as cursor to fetch the next page.

Access & rate limits

Key optional (except export)

Browse without a key. For higher limits and /api/v1/export, create a free key (bad_live_…) in your dashboard. Send it as X-API-Key or Authorization: Bearer.

60 requests / hour without a key

Per IP address. Every response tells you where you stand in the X-RateLimit-* headers.

CallerRequestsExports
No key (per IP)60 / hour—
Free key1,000 / hour10 / day
Partner key10,000 / hour100 / day

Errors

Errors use standard HTTP status codes and return a short JSON body you can show or log.

StatusCodeWhen it happens
400VALIDATION_ERRORA query parameter is invalid. The message names it.
401INVALID_API_KEYThe key is wrong or has been revoked.
401API_KEY_REQUIREDThis endpoint needs a key (e.g. /export).
404NOT_FOUNDNo approved project (or snapshot) matches.
429RATE_LIMITEDOver your limit. Wait Retry-After seconds.
500INTERNAL_ERRORSomething went wrong on our side.
429 Too Many Requests
{
  "success": false,
  "error": {
    "message": "Rate limit exceeded. Try again later.",
    "code": "RATE_LIMITED"
  }
}

List projects

GET/api/v1/projects

Approved, active projects ordered by updatedAt then id. Combine filters freely; page with cursor.

Parameters

country
string
ISO 3166-1 alpha-2 code, e.g. NG.
category
string
Category slug or name, e.g. wallet.
tag
string
Tag slug, e.g. lightning-network.
q
string
Search name and description.
lightning
boolean
Filter by Lightning acceptance.
onchain
boolean
Filter by on-chain acceptance.
verified
boolean
Filter by verified flag.
updated_since
date
ISO 8601 date; only projects updated at or after it.
limit
integer
Results per page, 1–100. Default 50.
cursor
string
Value of meta.nextCursor from the previous page.
/api/v1/projects
curl "https://api.directory.bitcoiners.africa/api/v1/projects?country=NG&lightning=true&limit=5"

Get a project

GET/api/v1/projects/{slug}

One approved project by slug (or id).

Parameters

slugrequired
string
Project slug from a list response.
/api/v1/projects/{slug}
curl "https://api.directory.bitcoiners.africa/api/v1/projects/sabi-wallet"

Countries

GET/api/v1/countries

Countries with the number of approved projects in each.

/api/v1/countries
curl "https://api.directory.bitcoiners.africa/api/v1/countries"

Categories

GET/api/v1/categories

Directory categories with project counts.

/api/v1/categories
curl "https://api.directory.bitcoiners.africa/api/v1/categories"

Tags

GET/api/v1/tags

Tags with project counts.

/api/v1/tags
curl "https://api.directory.bitcoiners.africa/api/v1/tags"

Manifest

GET/api/v1/manifest

id, slug and updatedAt for every approved project. Use it to detect removals when syncing a local copy.

/api/v1/manifest
curl "https://api.directory.bitcoiners.africa/api/v1/manifest"

Bulk export

GET/api/v1/exportAPI key

Full dataset in one download. Requires an API key. Separate daily export quota.

Parameters

format
string
json (default) or csv.
/api/v1/export
curl -H "X-API-Key: $KEY" "https://api.directory.bitcoiners.africa/api/v1/export?format=json"
Response401 Unauthorized
{
  "success": false,
  "error": {
    "message": "API key required",
    "code": "API_KEY_REQUIRED"
  }
}

OpenAPI spec

GET/api/v1/openapi.json

Machine-readable OpenAPI 3 description of the public v1 API.

/api/v1/openapi.json
curl "https://api.directory.bitcoiners.africa/api/v1/openapi.json"

Growth overview

GET/api/growth/overview

Combined growth metrics: latest snapshot, historical totals, and latest-vs-previous comparison.

/api/growth/overview
curl "https://api.directory.bitcoiners.africa/api/growth/overview"

List snapshots

GET/api/growth/snapshots

All quarterly snapshots (totals only, no per-project entries).

/api/growth/snapshots
curl "https://api.directory.bitcoiners.africa/api/growth/snapshots"

Snapshot by quarter

GET/api/growth/snapshots/{quarterLabel}

One quarterly snapshot including every project entry for that quarter.

Parameters

quarterLabelrequired
string
Quarter label, e.g. Q4-2026.
/api/growth/snapshots/{quarterLabel}
curl "https://api.directory.bitcoiners.africa/api/growth/snapshots/Q4-2026"

Compare quarters

GET/api/growth/compare

Diff two snapshots: new, removed and rebranded projects, plus total and percent change.

Parameters

fromrequired
string
Earlier quarter, e.g. Q2-2026.
torequired
string
Later quarter, e.g. Q4-2026.
/api/growth/compare
curl "https://api.directory.bitcoiners.africa/api/growth/compare?from=Q3-2026&to=Q4-2026"

Historical totals

GET/api/growth/historical

Pre-snapshot quarter totals used by the growth tracker (e.g. Q4 2023 – Q4 2025).

/api/growth/historical
curl "https://api.directory.bitcoiners.africa/api/growth/historical"

The project object

Every project returned by /api/v1/projects has this shape. Founder contact details and owner user ids are never included.

FieldTypeDescription
idstringStable cuid for the project.
slugstringURL slug, e.g. sabi-wallet.
namestringProject name as listed in the directory.
descriptionstringShort public description.
locationstring | nullFree-text location string when present.
citystring | nullCity, if set.
countryobject | null{ code, name } — ISO alpha-2 code uppercased.
categoriesarray[{ name, slug }, …] — one or more directory categories.
tagsarray[{ name, slug }, …].
logostring | nullAbsolute or relative logo URL.
websitestring | nullProject website.
emailstring | nullPublic contact email for the project (not the founder’s private email).
socialLinksobjectOnly networks that are filled in: twitter, linkedin, instagram, facebook, youtube, telegram, nostr.
paymentsobject{ onchain, lightning, giftCards } — booleans.
foundedYearstring | nullYear founded, when known.
verifiedbooleanDirectory verified badge.
featuredbooleanFeatured listing flag.
claimedbooleantrue when an owner has claimed the listing. Never exposes the owner’s user id.
createdAtstringISO 8601 timestamp.
updatedAtstringISO 8601 timestamp.

Statuses

The public project API only returns listings that are approved and active. Growth snapshot entries use a separate status so quarterly history stays complete.

approved

Listed in the Live Directory and returned by /api/v1/projects.

inactive

No longer operating or verifiable. Kept in growth history; not returned by the public v1 API.

new / continuing / removed / rebranded

Snapshot entry statuses on /api/growth/snapshots/{quarterLabel} and compare responses — how a project moved between quarters.

Directory data is available under CC-BY-4.0. Attribution: Data from the Bitcoin in Africa Directory (https://directory.bitcoiners.africa)

Coming next

Webhooks

Get a notification the moment a new project is added to the directory.

Higher limits

Partner keys with higher rate limits for heavy users and data platforms.

Built something?

Show us what you make

Dashboards, research, maps, bots. We’ll feature the best builds and help others find them. Or list your own project in the directory.

Free to browse without a key
Same data as the quarterly infographic
Country, category, tag and date filters
Growth history back through 2024