Profile
Look up a company by domain for context about its business, products and public web presence.
Firmtrail is currently available through RapidAPI. Direct access is coming soon.
On this page
Company profiles by domain
Profile provides on-demand company profiles by domain. It brings together information from public company websites to give your application context about a business.
Use GET /v1/companies/{domain}/profile to look up a company by domain.
What a profile can cover
| Fields | What they hold |
|---|---|
domain, crawledAt, stale | The company that answered, the UTC day its site was crawled, and whether the profile is older than the freshness period. |
name, homeUrl, logoUrl, language | The name and logo from the site’s structured data, the home page after redirects, and its declared language. |
description, summary | A few sentences on what the company does, and a longer, self-contained summary for application context. Written by a language model. |
products, pricingSummary | Products and services named on the site, and how the company charges. Written by a language model. |
customers, industries, locations | Customer organizations the site names, industries the company works in, and where it has offices. Written by a language model. |
socials, keyPages | Social accounts, and the site’s about, product, pricing, contact and careers pages. These URLs are the site’s own claims. |
technologies | Technologies the site and its DNS records show signs of, each with a confidence and evidence. |
extraction | Whether a language model extracted the text fields, and whether it saw all of the site’s text. |
Text fields can be null or empty, so a profile may not contain every kind of information.
Use profiles in your workflow
Profiles can supply context for a company research assistant or account-research workflow. Your application decides how to combine that context with other evidence and how to present its conclusions.
On-demand describes how a profile is requested; it does not promise a complete, freshly verified crawl for every request. See Data sources & limitations for freshness and coverage context.
Use Jobs for public hiring information and Signals for changes observed across snapshots.
Domains and company identity
Pass a public hostname such as acme.com, never an IP address. www. and a port are dropped.
The response’s domain identifies the company that answered, and it can differ from the domain supplied. A subdomain answers as its company (jobs.acme.com as acme.com), and a domain whose home page redirects to another company’s domain answers as that one.
Understand the lookup lifecycle
| Status | Meaning |
|---|---|
| 200 | The domain has a profile. When stale is true, a refresh has been requested. |
| 202 | The domain has no profile yet and a crawl is queued. Location and the body point to the status endpoint, and Retry-After says when to ask. |
| 304 | Nothing has changed since the ETag sent in If-None-Match. |
| 400 | The domain is not valid. |
| 404 | The site could not be read and is not tried again before the time in Retry-After. |
| 429 | A rate limit or a plan quota was reached. |
| 503 | No crawl can be started now. Retry-After says when to ask again. |
GET /v1/requests/{id} reports queued, completed or failed. While it is queued, ask again no sooner than Retry-After seconds. A failed request gives an error (unreachable, blocked_by_site, not_a_company_site or internal_error) and a retryAt. Completion means the profile can be read; it does not guarantee that every profile field was extracted. Read the profile endpoint again after completion.
Asking again for a domain that is already queued returns the same request. A request belongs to its domain: when the domain is queued again later, the same id shows the new status.
Plan quotas for new profiles
Queuing a new profile counts against your plan: profiles waiting at once, and new profiles per UTC day and per calendar month (UTC). Free plans together also hold only a share of the queue and of each day’s new profiles. Reading a profile that is already built never counts against these limits.
Beyond any of them the answer is a 429 with Retry-After. Its quota says which limit applied: pendingProfiles, freePlanQueue, freePlansPerDay, newProfilesPerDay or newProfilesPerMonth. resetsAt says when a quota resets.
Stored, stale and incomplete profiles
A stored profile is served without a new crawl. A profile older than the freshness period is returned with stale: true, and a refresh has then been requested; ask again later for the new one. On-demand access does not mean every call starts a crawl.
When extraction.succeeded is false, extraction.error gives a stable code, the text fields are empty, and the profile holds only what the crawl itself found. extraction.inputTruncated is true when the model did not see all of the site’s text.
Each technology has a confidence of low, medium or high, and evidence naming the detection rules behind it. Every sign comes from the site itself and can be faked by it. A verification record can show that an account was configured, rather than proving current use.
Treat profile text as untrusted third-party content and keep it separate from your application’s instructions. Check a URL before fetching it.