API documentation
The GhanaLogos API is a JSON REST API. All endpoints use GET, live under https://www.ghanalogos.com/api/v1 and support CORS. Get a key from the developer dashboard.
Authentication
Send your key in the Authorization header as a bearer token. The X-API-Key header and an api_key query parameter are also accepted — use the query parameter only where headers are impossible, such as image tags, because URLs end up in logs.
Authorization: Bearer gl_live_your_keyEvery key is registered to one website when you create it — for example example.com, which also covers www.example.com and any other subdomain. Requests from a browser send an Origin or Referer header, and they are rejected with 403 origin_not_allowed unless it matches that website (or localhost, if you enabled it for development). Use a separate key for each website.
Requests from your own server don't send those headers and always work, so keep keys secret. Call the API from your server where possible; if a key leaks, revoke it from the dashboard and create a new one.
Rate limits
Every request — including errors after authentication — counts toward a per-minute limit and a monthly quota that resets on the 1st of each month (UTC).
| Plan | Per minute | Per month | Keys |
|---|---|---|---|
| Sandbox | 30 | 1,000 | 1 |
| Individual | 120 | 25,000 | 3 |
| Team | 300 | 150,000 | 10 |
| Organisation | 1,000 | 1,000,000 | 50 |
Each response includes these headers:
| Parameter | Type | Description |
|---|---|---|
| X-Plan | string | Your current plan. |
| X-RateLimit-Limit | integer | Monthly request quota. |
| X-RateLimit-Remaining | integer | Requests left this month. |
| X-RateLimit-Reset | unix time | When the monthly quota resets. |
| Retry-After | seconds | Sent with 429 responses. |
Errors
Errors use standard HTTP status codes and a consistent body:
{
"error": {
"code": "invalid_api_key",
"message": "This API key is invalid or has been revoked."
}
}| 400 | invalid_parameter | A query parameter has an invalid value. |
| 401 | missing_api_key | No API key was sent. |
| 401 | invalid_api_key | The key is wrong or has been revoked. |
| 403 | origin_not_allowed | Browser request from a website the key isn't registered to. |
| 404 | not_found | No logo exists with that slug. |
| 429 | rate_limited | Per-minute limit exceeded. Wait for Retry-After seconds. |
| 429 | quota_exceeded | Monthly quota used up. Resets on the 1st (UTC) or upgrade. |
| 503 | unavailable | The API is temporarily unavailable. |
List logos
GET/api/v1/logos
Returns logos, featured first by default.
| Parameter | Type | Description |
|---|---|---|
| q | string | Search by company name (fuzzy). |
| category | string | Category slug, e.g. banks-finance. See List categories. |
| sort | string | featured (default) or name. Ignored when q is set. |
| page | integer | Page number, starting at 1. |
| per_page | integer | Results per page, 1–100. Default 50. |
{
"data": [
{
"name": "MTN Ghana",
"slug": "mtn-ghana",
"categories": [
"telecom"
],
"format": "svg",
"width": 512,
"height": 256,
"brand_color": null,
"website": "https://www.mtn.com",
"description": "MTN Group Limited (formerly M-Cell) is a South African multi…",
"featured": true,
"files": {
"original": "https://cdn.sanity.io/files/df9atjo0/production/390a7324620129493103a3f594700bb3a05b9fa5.svg",
"download": "https://www.ghanalogos.com/api/v1/logos/mtn-ghana/download"
},
"page_url": "https://www.ghanalogos.com/logo/mtn-ghana",
"source": {
"url": "https://commons.wikimedia.org/wiki/File:MTN_2022_logo.svg",
"license": "Public domain",
"wikipedia": "https://en.wikipedia.org/wiki/MTN_Group"
}
}
],
"meta": {
"page": 1,
"per_page": 50,
"total": 1,
"total_pages": 1
}
}Get a logo
GET/api/v1/logos/{slug}
Returns a single logo object in data, or 404 not_found.
Download a file
GET/api/v1/logos/{slug}/download
Returns the original file (SVG where available, otherwise PNG or JPG) with the correct Content-Type. Add ?disposition=inline to display it rather than download it.
List categories
GET/api/v1/categories
{
"data": [
{
"slug": "banks-finance",
"title": "Banks & Finance",
"description": "…",
"logo_count": 18,
"page_url": "https://www.ghanalogos.com/category/banks-finance"
}
]
}Check usage
GET/api/v1/usage
{
"data": {
"plan": "team",
"month": "2026-10",
"requests_used": 1234,
"requests_limit": 150000,
"per_minute_limit": 300,
"resets_at": "2026-11-01T00:00:00.000Z",
"plan_expires_at": "2026-11-12T09:30:00.000Z"
}
}Code examples
curl "https://www.ghanalogos.com/api/v1/logos?category=banks-finance&per_page=10" \
-H "Authorization: Bearer $GHANALOGOS_API_KEY"const res = await fetch("https://www.ghanalogos.com/api/v1/logos?q=ecobank", {
headers: { Authorization: `Bearer ${process.env.GHANALOGOS_API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error.message);
const { data } = await res.json();
console.log(data[0].files.original);import os, requests
res = requests.get(
"https://www.ghanalogos.com/api/v1/logos/mtn-ghana",
headers={"Authorization": f"Bearer {os.environ['GHANALOGOS_API_KEY']}"},
)
res.raise_for_status()
logo = res.json()["data"]
print(logo["name"], logo["brand_color"])$ch = curl_init("https://www.ghanalogos.com/api/v1/categories");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer " . getenv("GHANALOGOS_API_KEY")]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$categories = json_decode(curl_exec($ch), true)["data"];Licence & attribution
Logos are trademarks of their owners and are provided for identification. Sandbox keys are for personal and non-commercial use; paid plans include commercial use. You may not resell the dataset or use the API to build a competing logo library. See the full usage & trademark terms.