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.
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.
Caller
Requests
Exports
No key (per IP)
60 / hour
—
Free key
1,000 / hour
10 / day
Partner key
10,000 / hour
100 / day
Errors
Errors use standard HTTP status codes and return a short JSON body you can show or log.
Status
Code
When it happens
400
VALIDATION_ERROR
A query parameter is invalid. The message names it.
Every project returned by /api/v1/projects has this shape. Founder contact details and owner user ids are never included.
Field
Type
Description
id
string
Stable cuid for the project.
slug
string
URL slug, e.g. sabi-wallet.
name
string
Project name as listed in the directory.
description
string
Short public description.
location
string | null
Free-text location string when present.
city
string | null
City, if set.
country
object | null
{ code, name } — ISO alpha-2 code uppercased.
categories
array
[{ name, slug }, …] — one or more directory categories.
tags
array
[{ name, slug }, …].
logo
string | null
Absolute or relative logo URL.
website
string | null
Project website.
email
string | null
Public contact email for the project (not the founder’s private email).
socialLinks
object
Only networks that are filled in: twitter, linkedin, instagram, facebook, youtube, telegram, nostr.
payments
object
{ onchain, lightning, giftCards } — booleans.
foundedYear
string | null
Year founded, when known.
verified
boolean
Directory verified badge.
featured
boolean
Featured listing flag.
claimed
boolean
true when an owner has claimed the listing. Never exposes the owner’s user id.
createdAt
string
ISO 8601 timestamp.
updatedAt
string
ISO 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.