AnnualReports APIannualreports.com ↗
Access thousands of company annual reports, PDF/HTML links, and company profiles filtered by exchange, industry, sector, or ticker via the AnnualReports.com API.
What is the AnnualReports API?
The AnnualReports.com API provides access to annual report documents and company profiles across thousands of international companies through 5 endpoints. Use search_companies to filter by ticker, exchange, industry, or sector and retrieve matched companies with metadata. Use get_company_profile to pull a full profile including report listings with direct PDF and HTML download URLs, ticker, exchange, sector, industry, employee data, and company description.
curl -X GET 'https://api.parse.bot/scraper/1e417564-2412-4b67-ad27-9ddb3d1b8000/search_companies?alpha=A&query=apple§or_id=1&exchange_id=8&industry_id=i1' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace annualreports-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: AnnualReports SDK — search companies, browse exchanges, and retrieve profiles."""
from parse_apis.annualreports_com_api import AnnualReports, Program, Alpha, CompanyNotFound
client = AnnualReports()
# List available stock exchanges for filtering.
for exchange in client.exchanges.list(limit=5):
print(exchange.name, exchange.full_name)
# Search companies by name/ticker; results are CompanySummary instances.
for company in client.companies.search(query="microsoft", limit=3):
print(company.name, company.sector, company.is_premium)
# Drill into a single company's full profile via .first() then .details().
summary = client.companies.search(query="apple", limit=1).first()
if summary:
profile = summary.details()
print(profile.name, profile.ticker, profile.exchange)
print(profile.headquarters, profile.employee_count)
for report in (profile.reports or [])[:2]:
print(report.title, report.year, report.is_most_recent)
# Browse companies by alphabetical letter using the Alpha enum.
for company in client.companies.search(alpha=Alpha.Z, limit=3):
print(company.name, company.slug)
# Retrieve Russell 1000 program companies using the Program enum.
for pc in client.programcompanies.list(program_id=Program.RUSSELL_1000, limit=3):
print(pc.name, pc.industry, pc.sector)
# Typed error handling: catch CompanyNotFound for an invalid slug.
try:
bad = client.companies.get(slug="nonexistent-company-xyz-99999")
print(bad.name)
except CompanyNotFound as exc:
print(f"Not found: {exc.slug}")
print("exercised: exchanges.list / companies.search / companies.get / summary.details / programcompanies.list")
Search for companies by name, ticker, or using filters for exchange, industry, sector, or first letter. Returns matching companies with basic metadata including name, slug, industry, sector, and premium status. At least one filter parameter should be provided. Results are not paginated — the full matching set is returned.
| Param | Type | Description |
|---|---|---|
| alpha | string | First letter of company name (A-Z or # for numeric) |
| query | string | Search keyword (company name or ticker symbol) |
| sector_id | string | Sector ID for filtering |
| exchange_id | string | Exchange ID for filtering (use browse_exchanges to get available IDs) |
| industry_id | string | Industry ID for filtering (use browse_industries to get available IDs, e.g. 'i1') |
{
"type": "object",
"fields": {
"total": "integer count of companies returned",
"companies": "array of company objects with name, slug, industry, sector, and is_premium fields"
},
"sample": {
"data": {
"total": 2,
"companies": [
{
"name": "Apple Hospitality REIT Inc",
"slug": "apple-hospitality-reit-inc",
"sector": "Real Estate",
"industry": "REIT - Hotel/Motel",
"is_premium": true
},
{
"name": "Apple Inc.",
"slug": "apple-inc",
"sector": "Technology",
"industry": "Consumer Services",
"is_premium": true
}
]
},
"status": "success"
}
}About the AnnualReports API
What the API Covers
The API surfaces annual report data and company metadata from AnnualReports.com, a directory of investor-facing documents for publicly listed companies worldwide. It includes 5 endpoints covering company search, profile retrieval, exchange and industry browsing, and program-based company lists. Core response fields include report PDFs and HTML versions, year labels, ticker symbols, exchange names, sector and industry classifications, company descriptions, websites, and user ratings.
Searching and Filtering Companies
search_companies accepts a query parameter for name or ticker lookups, an alpha parameter to browse companies by first letter, and optional filter parameters — exchange_id, industry_id, and sector_id — to narrow results. IDs for exchanges and industries come from browse_exchanges and browse_industries respectively. browse_industries returns industries grouped by sector, each with a unique id (e.g. i1) ready for use in filters. browse_exchanges includes each exchange's name, full_name, numeric id, and logo_url.
Company Profiles and Annual Reports
get_company_profile takes a slug from search results and returns the full company record. The reports array contains one object per available annual report, each with title, year, pdf_url, html_url, and an is_most_recent flag. Additional profile fields include ticker, exchange, sector, industry, description, website, rating, and employees. This makes it straightforward to iterate over all historical reports for a given company.
Program-Based Company Lists
get_companies_by_program returns all companies belonging to a named financial program. Currently supported program IDs are 9 (REIT), 14 (Russell 1000), 15 (Russell 2000), and 16 (Russell Microcap). Results include each company's name, slug, industry, and sector, making it easy to build a focused list for further profile lookups.
The AnnualReports API is a managed, monitored endpoint for annualreports.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when annualreports.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official annualreports.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build an annual report archive by iterating get_company_profile across a list of company slugs to collect all PDF and HTML report URLs.
- Filter Russell 1000 companies by industry using get_companies_by_program and browse_industries to identify sector breakdowns.
- Track annual report publication by monitoring is_most_recent flags across a portfolio of companies.
- Populate an investor research tool with company descriptions, ticker symbols, and exchange names from get_company_profile.
- Build an exchange-specific company directory by combining browse_exchanges IDs with search_companies exchange_id filtering.
- Aggregate REIT company profiles using program ID 9 for real estate investment analysis.
- Cross-reference industry classifications by pulling browse_industries sector groupings and matching them to company search results.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does AnnualReports.com have an official developer API?+
What does get_company_profile return for annual reports?+
reports array where each object includes title, year, pdf_url, html_url, and an is_most_recent boolean. This covers all historically available reports for the company, not just the most recent one.Can I retrieve financial statement data — revenue, earnings, balance sheet figures — from these endpoints?+
Are there any known limitations on company coverage or premium reports?+
is_premium field per company, indicating that some companies or reports are marked as premium on AnnualReports.com. Coverage is international but weighted toward companies that have submitted reports directly to the platform, so smaller or non-English-market companies may have limited or no report history.