API Documentation

Everything you need to integrate company logos into your application.

Introduction

The CompanyLogo.xyz API provides programmatic access to high-quality 200x200 PNG logos for 47,700+ publicly listed companies across 71 global stock exchanges. All responses are returned in JSON format.

Base URL

https://companylogo.xyz/api/v1

Authentication

The recommended approach is to pass your API key as a ?token= query parameter. This is client-safe and works directly in <img> tags without any backend.

Recommended: direct image URL
<img src="https://companylogo.xyz/api/v1/img/US/AAPL.png?token=your_api_key_here" />

For the JSON metadata endpoint, you can also authenticate with the x-api-key header:

JSON endpoint (alternative)
curl -H "x-api-key: your_api_key_here" \
  https://companylogo.xyz/api/v1/logo/US/AAPL

DJ30 (Dow Jones 30) tickers are publicly accessible and do not require an API key. For all other tickers, you must include a valid key. You can generate an API key from your dashboard.

Rate Limits

Rate limits are applied per API key (or per IP for unauthenticated requests). Exceeding the limit returns a 429 response.

TierRate LimitAccess
Public (no key)10 requests/minDJ30 tickers only
Free100 requests/minDJ30 + 30 unique tickers
Paid (PNG)1,000 requests/minAll 47,700+ tickers + bulk downloads

Endpoints

GET/api/v1/img/:exchange/:ticker.png?token=KEY

Direct image endpoint. Returns the PNG image bytes directly — use in <img> tags, CSS, or anywhere you need a logo URL. No backend required. DJ30 tickers work without a token.

Parameters

:exchangepathExchange code (e.g. US, LSE, XETRA)
:ticker.pngpathTicker symbol with .png extension (e.g. AAPL.png)
tokenqueryYour API key. Safe to use client-side. Optional for DJ30 tickers.

Response

<!-- Direct image response — use in an <img> tag -->
<img src="https://companylogo.xyz/api/v1/img/US/AAPL.png?token=YOUR_KEY" alt="Apple" />

<!-- Or in React -->
<img src={`https://companylogo.xyz/api/v1/img/${exchange}/${ticker}.png?token=${key}`} />

<!-- DJ30 logos — no token needed -->
<img src="https://companylogo.xyz/api/v1/img/US/AAPL.png" alt="Apple" />
GET/api/v1/logo/:exchange/:ticker

Retrieve a logo for a specific ticker on a given exchange. Returns a signed URL and metadata as JSON.

Parameters

:exchangepathExchange code (e.g. US, LSE, XETRA)
:tickerpathTicker symbol (e.g. AAPL, MSFT)

Response

{
  "ticker": "AAPL",
  "exchange": "US",
  "companyName": "Apple Inc",
  "logoUrl": "https://cdn.companylogo.xyz/US/AAPL.png?...",
  "format": "png",
  "width": 200,
  "height": 200
}
GET/api/v1/logo/:exchange/:ticker?download=true

Download the logo file directly. Returns the image binary with appropriate content headers.

Parameters

downloadquerySet to "true" to download the image file directly

Response

Binary PNG image
Content-Type: image/png
Content-Disposition: attachment; filename="AAPL.png"
GET/api/v1/search

Search for tickers by company name, ticker symbol, exchange, or sector.

Parameters

qquerySearch query (company name or ticker)
exchangequeryFilter by exchange code
sectorqueryFilter by sector
pagequeryPage number (default: 1)
limitqueryResults per page (default: 20, max: 100)

Response

{
  "results": [
    {
      "ticker": "AAPL",
      "exchange": "US",
      "companyName": "Apple Inc",
      "sector": "Technology",
      "hasLogo": true
    }
  ],
  "page": 1,
  "limit": 20,
  "total": 1
}
GET/api/v1/exchanges

List all available exchanges with their logo counts.

Response

{
  "exchanges": [
    {
      "code": "US",
      "name": "United States",
      "country": "US",
      "logoCount": 3500
    }
  ]
}
GET/api/v1/exchange/:code

Get details for a specific exchange, including a paginated list of its tickers.

Parameters

:codepathExchange code (e.g. US, LSE)

Response

{
  "code": "US",
  "name": "United States",
  "country": "US",
  "logoCount": 3500,
  "tickers": [
    {
      "ticker": "AAPL",
      "companyName": "Apple Inc",
      "hasLogo": true
    }
  ]
}
GET/api/v1/bulk/:exchange

Download a ZIP archive of all logos for a given exchange. Paid tier only.

Requires a paid subscription. Returns 403 for free-tier users.

Parameters

:exchangepathExchange code (e.g. US, LSE)

Response

{
  "downloadUrl": "https://cdn.companylogo.xyz/bulk/US.zip?...",
  "logoCount": 3500,
  "sizeBytes": 12450000
}
GET/api/v1/usage

Get API usage statistics for the authenticated user.

Response

{
  "plan": "PNG_200",
  "requestsToday": 142,
  "requestsThisMonth": 3850,
  "uniqueLogosAccessed": 520,
  "rateLimit": 1000,
  "rateLimitRemaining": 858
}

Code Examples

HTML (direct image)

Direct image tag — recommended
<!-- No backend needed — works in any HTML page -->
<img src="https://companylogo.xyz/api/v1/img/US/AAPL.png?token=your_api_key_here"
     alt="AAPL logo" width="200" height="200" />

React

CompanyLogo.tsx
function CompanyLogo({ exchange, ticker }: { exchange: string; ticker: string }) {
  return (
    <img
      src={`https://companylogo.xyz/api/v1/img/${exchange}/${ticker}.png?token=your_api_key_here`}
      alt={`${ticker} logo`}
      width={200}
      height={200}
    />
  );
}

cURL

Download image directly
curl -o AAPL.png "https://companylogo.xyz/api/v1/img/US/AAPL.png?token=your_api_key_here"
JSON metadata (alternative)
curl -H "x-api-key: your_api_key_here" \
  https://companylogo.xyz/api/v1/logo/US/AAPL
Search tickers
curl -H "x-api-key: your_api_key_here" \
  "https://companylogo.xyz/api/v1/search?q=apple&exchange=US"

JavaScript (fetch)

get-logo.js
// Direct image — use in an <img> tag, no fetch needed!
// For metadata, use the JSON endpoint:
const response = await fetch(
  "https://companylogo.xyz/api/v1/logo/US/AAPL",
  {
    headers: {
      "x-api-key": "your_api_key_here",
    },
  }
);

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

Python (requests)

get_logo.py
import requests

# Direct image URL — use in templates: /api/v1/img/US/AAPL.png?token=KEY
# For metadata, use the JSON endpoint:
response = requests.get(
    "https://companylogo.xyz/api/v1/logo/US/AAPL",
    headers={"x-api-key": "your_api_key_here"},
)

data = response.json()
print(data["logoUrl"])

Error Codes

All errors return a JSON body with a message field describing the issue.

StatusMeaningDescription
401UnauthorizedInvalid or missing API key.
403ForbiddenYour plan does not include access to this resource (e.g. bulk downloads on free tier).
404Not FoundThe requested ticker, exchange, or resource does not exist.
429Too Many RequestsRate limit exceeded. Wait and retry, or upgrade your plan for higher limits.
Example error response
{
  "error": "Unauthorized",
  "message": "Invalid or missing API key.",
  "statusCode": 401
}

Ready to start?

Create a free account to get your API key, or explore DJ30 logos without authentication.