How to Get a Company Logo

October 08, 2026
How to Get a Company Logo

You need a reliable way to get a company’s logo from a domain, so you can enrich signups, render partner lists, or keep your CRM visually consistent. By the end of this guide, you’ll be able to request a hosted logo URL for any domain via API, plug it into your product, and optionally enrich the result with categories and company data for downstream workflows like brand safety, lead scoring, and analytics.

Why Klazify is the right fit when your goal is to fetch a logo

When your pipeline depends on clear brand visuals, you also care about domain intelligence that keeps those visuals correct and up to date. Klazify analyzes full website content and structure, which helps it find the right logo assets tied to the canonical domain instead of stale icons or third-party images. That same analysis powers accurate categorization using the IAB taxonomy, so you can pair the logo with trustworthy categories for ad tech and filtering decisions.

Illustration: How to Get a Company Logo
  • Accurate website categorization using AI: Full-site analysis improves detection of the primary brand entity and its correct logo, reducing false matches from metadata alone.
  • Global coverage: Multi-language content analysis helps you retrieve logos for international sites that may localize their branding and assets.
  • Real-time classification: You can re-check domains to refresh logos when sites rebrand or redesign.
  • Industry-level categories: IAB mapping enables immediate brand safety and contextual workflows alongside logo retrieval.
  • Simple API integration: A REST POST to request a hosted logo URL; optionally call the categorization endpoint to enrich your record in a single flow.
  • Compliance and filtering: Combine the returned logo with IAB categories to enforce allow/deny lists visually and semantically in your product.

Create a free account to get an API key and start testing the endpoints: Register. You can also browse the Documentation.

What you’ll build: a logo-first enrichment flow

We’ll implement a small, production-ready flow:

  1. Call the logo endpoint with a domain to retrieve a hosted logo URL.
  2. Cache the result by domain to avoid repeated lookups and reduce latency.
  3. Optionally, call the categorization endpoint to add IAB categories, company details, and related signals.
  4. Map Klazify categories to your internal taxonomy if needed.
  5. Handle unknown/new domains gracefully with retries or asynchronous completion.

All calls use Bearer authentication and JSON. Failed or unreachable calls are not billed. The Starter plan is $39.99/mo with a 7-day trial.

Endpoint overview for logos and enrichment

  • Logo-only: POST https://www.klazify.com/api/domain_logo
  • Categorization and enrichment: POST https://www.klazify.com/api/categorize

Use the logo endpoint when you only need the image URL. Use the categorization endpoint when you need IAB categories, social detection, logo_url inside the domain object, company details, and additional domain signals in one response.

Approach API Path Primary Output IAB Categories Company Data Similar Domains
Logo only /api/domain_logo Hosted logo URL No No No
Enriched (logo + categories) /api/categorize Logo URL + domain categories Yes Yes Yes

Make your first logo request (curl)

The request below sends a domain and returns a hosted logo URL in the JSON response. Replace YOUR_API_KEY with your token.

curl -X POST "https://www.klazify.com/api/domain_logo" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://cbsnews.com"}'

Store the returned logo URL in your system and render it in your UI. If you need categories or company details for the same domain, call the categorization endpoint explained below.

Official categorization response (useful fields for logo + enrichment)

Below is the official categorization response example. It includes a domain-level logo_url, hierarchical categories with confidence, company details, domain registration data, and similar domains. Use this when you want both a logo and enrichment in one step.

{
"domain": {
"categories": [
{
"confidence": 0.92,
"name": "/Computers & Electronics/Consumer Electronics",
"IAB-632-596": "Consumer Electronics/Technology & Computing/Consumer Electronics"
},
{
"confidence": 0.89,
"name": "/Internet & Telecom/Mobile & Wireless/Mobile Phones"
}
],
"social_media": null,
"logo_url": "https://klazify.s3.amazonaws.com/2110787991611585019600ed5fb1d1300.04730104.png"
},
"success": true,
"objects": {
"company": {
"url": "https://www.apple.com/",
"name": "Apple",
"city": "Cupertino",
"stateCode": "CA",
"countryCode": "US",
"employeesRange": "100K+",
"revenue": 274515000000,
"raised": null,
"tags": [
"E-commerce",
"Consumer Electronics",
"Mobile",
"B2C"
],
"tech": [
"omniture_adobe_analytics",
"atlassian_confluence",
"successfactors",
"apache_apex",
"talend",
"oracle_peoplesoft",
"salesforce",
"stripe",
"dell_boomi_atomsphere",
"gigya",
"sage_50cloud",
"quickbooks",
"webmethods",
"apache_tomcat",
"alteryx",
"tibco_rendezvous",
"atlassian_jira",
"..."
]
}
},
"domain_registration_data": {
"domain_age_date": "1987-02-19",
"domain_age_days_ago": "13026",
"domain_expiration_date": "2030-02-20",
"domain_expiration_days_left": "123"
},
"similar_domains": [
"bestbuy.com",
"icloud.com",
"microsoft.com",
"macrumors.com",
"google.com",
"samsung.com",
"twitter.com",
"hp.com",
"bhphotovideo.com",
"dell.com"
]
}

Fields you’ll likely use:

  • domain.logo_url: hosted URL of the logo to display or cache.
  • domain.categories: hierarchical categories; the IAB mapping helps align with ad tech and brand safety rules.
  • objects.company: company profile details (name, HQ location, employeesRange, revenue, tags, tech).
  • domain_registration_data: dates and counters useful for heuristics and scoring.
  • similar_domains: a list you can use for recommendations, clustering, or deduplication checks.

JavaScript example: fetch a logo, then enrich if needed

This example calls the logo endpoint first. If you also need categories, it calls the categorization endpoint and reads logo_url inside the domain object along with categories and company data. Adjust error handling and timeouts for your environment.

async function fetchJson(url, opts) {
const res = await fetch(url, opts);
// Failed or unreachable calls are not billed; still handle status codes here.
if (!res.ok) {
const body = await res.text().catch(() => "");
throw new Error(`HTTP ${res.status} - ${body}`);
}
return res.json();
}

async function getLogoAndEnrichment(domain) {
const token = process.env.KLAZIFY_API_KEY || "YOUR_API_KEY";
const headers = {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
};

// 1) Get logo-only (hosted URL returned in JSON)
const logoResp = await fetchJson("https://www.klazify.com/api/domain_logo", {
method: "POST",
headers,
body: JSON.stringify({ url: domain })
});

// Store the logo URL from logoResp as returned. Render in your product.

// 2) Optionally enrich with categories + company + logo_url
const enrichResp = await fetchJson("https://www.klazify.com/api/categorize", {
method: "POST",
headers,
body: JSON.stringify({ url: domain })
});

// Use fields in enrichResp.domain.logo_url, enrichResp.domain.categories, and enrichResp.objects.company
return { logoOnly: logoResp, enriched: enrichResp };
}

// Example usage:
getLogoAndEnrichment("https://example.com")
.then(({ logoOnly, enriched }) => {
console.log("Logo-only response:", logoOnly);
console.log("Enriched response logo:", enriched?.domain?.logo_url);
console.log("Enriched categories:", enriched?.domain?.categories);
console.log("Company:", enriched?.objects?.company?.name);
})
.catch(err => {
console.error(err);
});

How to use the returned fields for real workflows

  • UI enrichment on signups: Save the hosted logo URL with the customer’s domain. Display in the admin dashboard and CRM profiles.
  • Ad and brand safety: Use domain.categories and IAB mapping to maintain allow/deny lists. The logo helps your reviewers confirm site identity at a glance.
  • Lead enrichment: With categorize, read objects.company fields to auto-fill company name and size before SDR handoff.
  • Security and analytics: Pair logo_url and categories with domain_registration_data to flag very new or soon-to-expire domains in dashboards.
  • Recommendations: Leverage similar_domains to expand prospecting lists or surface alternates in your UI.

Operational guidance: batching, caching, and unknown domains

Batching and concurrency: If you process large domain lists, send concurrent POSTs within your rate limit profile. Stagger bursts using a token bucket or small worker pool to keep latency stable.

Caching: Cache results per domain. For most products, cache the logo and enrichment together; refresh on schedule or when you detect a rebrand. The logo URL is hosted, so you can serve it directly from your CDN if you prefer.

Handling unknown or new domains: Implement retries with exponential backoff for initial classification. If a domain has no detectable logo yet, store a null state and re-check later. Provide a UI fallback (e.g., initials) without blocking the flow.

Mapping categories to your taxonomy: Maintain a translation table from the returned category names and IAB mapping codes to your internal categories. Keep this table in source control and version it so changes to your taxonomy are trackable and testable.

Multiple official JSON examples for development and testing

Use these canonical samples to build and test your parsers, data models, and mapping logic. They are the same official example shown earlier, repeated here for convenience during implementation.

Example A: Full enrichment object (reference)

{
"domain": {
"categories": [
{
"confidence": 0.92,
"name": "/Computers & Electronics/Consumer Electronics",
"IAB-632-596": "Consumer Electronics/Technology & Computing/Consumer Electronics"
},
{
"confidence": 0.89,
"name": "/Internet & Telecom/Mobile & Wireless/Mobile Phones"
}
],
"social_media": null,
"logo_url": "https://klazify.s3.amazonaws.com/2110787991611585019600ed5fb1d1300.04730104.png"
},
"success": true,
"objects": {
"company": {
"url": "https://www.apple.com/",
"name": "Apple",
"city": "Cupertino",
"stateCode": "CA",
"countryCode": "US",
"employeesRange": "100K+",
"revenue": 274515000000,
"raised": null,
"tags": [
"E-commerce",
"Consumer Electronics",
"Mobile",
"B2C"
],
"tech": [
"omniture_adobe_analytics",
"atlassian_confluence",
"successfactors",
"apache_apex",
"talend",
"oracle_peoplesoft",
"salesforce",
"stripe",
"dell_boomi_atomsphere",
"gigya",
"sage_50cloud",
"quickbooks",
"webmethods",
"apache_tomcat",
"alteryx",
"tibco_rendezvous",
"atlassian_jira",
"..."
]
}
},
"domain_registration_data": {
"domain_age_date": "1987-02-19",
"domain_age_days_ago": "13026",
"domain_expiration_date": "2030-02-20",
"domain_expiration_days_left": "123"
},
"similar_domains": [
"bestbuy.com",
"icloud.com",
"microsoft.com",
"macrumors.com",
"google.com",
"samsung.com",
"twitter.com",
"hp.com",
"bhphotovideo.com",
"dell.com"
]
}

Example B: Parsing categories and logo_url across services

{
"domain": {
"categories": [
{
"confidence": 0.92,
"name": "/Computers & Electronics/Consumer Electronics",
"IAB-632-596": "Consumer Electronics/Technology & Computing/Consumer Electronics"
},
{
"confidence": 0.89,
"name": "/Internet & Telecom/Mobile & Wireless/Mobile Phones"
}
],
"social_media": null,
"logo_url": "https://klazify.s3.amazonaws.com/2110787991611585019600ed5fb1d1300.04730104.png"
},
"success": true,
"objects": {
"company": {
"url": "https://www.apple.com/",
"name": "Apple",
"city": "Cupertino",
"stateCode": "CA",
"countryCode": "US",
"employeesRange": "100K+",
"revenue": 274515000000,
"raised": null,
"tags": [
"E-commerce",
"Consumer Electronics",
"Mobile",
"B2C"
],
"tech": [
"omniture_adobe_analytics",
"atlassian_confluence",
"successfactors",
"apache_apex",
"talend",
"oracle_peoplesoft",
"salesforce",
"stripe",
"dell_boomi_atomsphere",
"gigya",
"sage_50cloud",
"quickbooks",
"webmethods",
"apache_tomcat",
"alteryx",
"tibco_rendezvous",
"atlassian_jira",
"..."
]
}
},
"domain_registration_data": {
"domain_age_date": "1987-02-19",
"domain_age_days_ago": "13026",
"domain_expiration_date": "2030-02-20",
"domain_expiration_days_left": "123"
},
"similar_domains": [
"bestbuy.com",
"icloud.com",
"microsoft.com",
"macrumors.com",
"google.com",
"samsung.com",
"twitter.com",
"hp.com",
"bhphotovideo.com",
"dell.com"
]
}

Example C: Using registration and similar domains for QA

{
"domain": {
"categories": [
{
"confidence": 0.92,
"name": "/Computers & Electronics/Consumer Electronics",
"IAB-632-596": "Consumer Electronics/Technology & Computing/Consumer Electronics"
},
{
"confidence": 0.89,
"name": "/Internet & Telecom/Mobile & Wireless/Mobile Phones"
}
],
"social_media": null,
"logo_url": "https://klazify.s3.amazonaws.com/2110787991611585019600ed5fb1d1300.04730104.png"
},
"success": true,
"objects": {
"company": {
"url": "https://www.apple.com/",
"name": "Apple",
"city": "Cupertino",
"stateCode": "CA",
"countryCode": "US",
"employeesRange": "100K+",
"revenue": 274515000000,
"raised": null,
"tags": [
"E-commerce",
"Consumer Electronics",
"Mobile",
"B2C"
],
"tech": [
"omniture_adobe_analytics",
"atlassian_confluence",
"successfactors",
"apache_apex",
"talend",
"oracle_peoplesoft",
"salesforce",
"stripe",
"dell_boomi_atomsphere",
"gigya",
"sage_50cloud",
"quickbooks",
"webmethods",
"apache_tomcat",
"alteryx",
"tibco_rendezvous",
"atlassian_jira",
"..."
]
}
},
"domain_registration_data": {
"domain_age_date": "1987-02-19",
"domain_age_days_ago": "13026",
"domain_expiration_date": "2030-02-20",
"domain_expiration_days_left": "123"
},
"similar_domains": [
"bestbuy.com",
"icloud.com",
"microsoft.com",
"macrumors.com",
"google.com",
"samsung.com",
"twitter.com",
"hp.com",
"bhphotovideo.com",
"dell.com"
]
}

Python snippet: minimal ingestion worker

This script fetches the logo-only response, then enriches with categorization for the same domain and prints the fields you’ll store. Add your own persistence and retries around it.

import os
import json
import requests

API_KEY = os.getenv("KLAZIFY_API_KEY", "YOUR_API_KEY")
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}

def fetch_logo(domain):
resp = requests.post(
"https://www.klazify.com/api/domain_logo",
headers=HEADERS,
data=json.dumps({"url": domain}),
timeout=20,
)
resp.raise_for_status()
return resp.json()

def categorize(domain):
resp = requests.post(
"https://www.klazify.com/api/categorize",
headers=HEADERS,
data=json.dumps({"url": domain}),
timeout=30,
)
resp.raise_for_status()
return resp.json()

if __name__ == "__main__":
domain = "https://example.com"
logo_only = fetch_logo(domain)
print("Logo-only JSON:", logo_only)

enriched = categorize(domain)
print("Logo URL (enriched):", enriched.get("domain", {}).get("logo_url"))
print("Categories:", enriched.get("domain", {}).get("categories"))
print("Company:", enriched.get("objects", {}).get("company", {}))

Plugging results into your pipeline

  • Data model: Store fields for logo URL, category names, IAB mapping codes, company name, and optional registration dates. Keep the raw JSON for auditability.
  • Caching policy: Cache per domain. Refresh logos on a schedule you control, and invalidate on user request or detected rebrand.
  • Error handling: If a logo isn’t available or a call fails, render a neutral fallback and re-try later. Because failed or unreachable calls are not billed, safe retries are reasonable within your own rate policies.
  • Observability: Log categorize confidences alongside the chosen categories to support QA and analyst review.
  • Governance: Version your taxonomy mapping rules. Add unit tests to validate that specific inputs map to the intended internal categories.

Brand safety and filtering with categories and visuals

When auditing where ads run or controlling placements, pair the logo with Klazify’s categories so reviewers can quickly confirm brand identity while automated rules enforce allow/deny lists. The IAB mapping found in category objects lets you align with existing ad taxonomies. For mixed-content sites, you can also classify specific URLs through the categorization endpoint and apply granular policies.

Testing and QA tips

  • Golden set: Maintain a list of 50–100 domains you know well. Run them through the categorization endpoint regularly and alert on changes in categories or missing logos.
  • TTL simulation: Emulate cache expiry in a staging environment to confirm that refreshes work as expected and that UI fallbacks render correctly if a logo isn’t immediately available.
  • Schema contracts: Generate and validate JSON Schemas for your internal storage based on observed fields in the official example, so ingestion code fails closed rather than silently discarding data.

What to expect in responses and units

  • Timestamps and dates: domain_registration_data includes dates in ISO format (YYYY-MM-DD) and counters as strings.
  • Numbers: revenue appears as a numeric value. Treat it as a number without assuming a currency unless you normalize it elsewhere in your system.
  • Logos: The logo URL is a hosted link you can serve directly. If you proxy via your CDN, keep the original URL in metadata for traceability.

For method details and any endpoint-specific nuances, always check the Documentation. You can also review the model compliance program here: MCP.

End-to-end example: enrich a signup event

  1. Incoming signup contains email domain acme.co.
  2. Call domain_logo with url=acme.co. Store the hosted logo URL on the account record.
  3. Call categorize with url=acme.co. Parse:
    • domain.logo_url to confirm or update the logo you cached.
    • domain.categories and the IAB mapping for your brand safety and routing rules.
    • objects.company fields to pre-fill company name and size for CRM.
  4. Cache the enrichment and publish a normalized payload to your events bus for downstream services.
  5. Render the logo on user dashboards and admin UIs immediately from cache.

Security and compliance notes

  • Auth: Use HTTPS and store your Bearer token in a secure secret manager.
  • PII: When enriching domains from user emails, ensure your privacy policy discloses the enrichment step and that you’re not storing unnecessary personal data.
  • Resilience: Because failed or unreachable calls are not billed, implement retries with jitter to handle transient network issues without cost surprises.

FAQ

  • How do I get a logo without any other data?
    Call POST https://www.klazify.com/api/domain_logo with the domain in the JSON body. Use the hosted logo URL from the JSON response in your UI.
  • How do I get a logo and categories together?
    Call POST https://www.klazify.com/api/categorize and read domain.logo_url plus domain.categories (with IAB mapping) from the response.
  • Can I cache results?
    Yes. Cache per domain and refresh on your own schedule. Keep a fallback in your UI if a logo is temporarily unavailable.
  • What happens if a request fails?
    Failed or unreachable calls are not billed. Implement retries with backoff and handle non-200 responses cleanly.
  • How do I map Klazify’s categories to my internal taxonomy?
    Maintain a translation table keyed by category names and IAB mapping codes. Version the table and include automated tests for critical mappings.

Ready to ship a better enrichment experience with logos and IAB categories? Create your free account and start testing today: Register. Explore more capabilities on https://www.klazify.com.

Ready to use Klazify?

Start classifying websites, enriching company data, and exploring web intelligence.

Get Started Free