ParseForge Scrapers

ETF.com Scraper | ETF Data Holdings and Returns

parseforge/etf-com-scraper

BusinessNews & mediaLead generation

Scrapes the ETF.com directory for fund metrics including AUM, expense ratio, YTD return, average volume, and asset class. Returns each ETF as a flat row, filterable by asset class and sortable by assets, return, or volume.

Run this scraper See the API call
Total users
9
Monthly active
0
Total runs
135
Bookmarked
0
Rating
Not rated yet
Last modified
12 days ago

Overview

ParseForge

ETF.com Scraper | ETF Data Holdings and Returns

Scrape ETF holdings, returns, and fund metrics from ETF.com, up to a million ETFs per run. Every fund row includes AUM, expense ratio, YTD return, average volume, and asset class. No API key. Export to CSV, JSON, Excel, or XML.

ETF.com lists every exchange-traded fund with its holdings, performance, and key metrics, but browsing the directory page by page is slow and manual. This Actor reads the public ETF directory directly, filters by asset class, and sorts by assets, YTD return, or volume, so you get a clean dataset in minutes.

Who uses it What they scrape ETF.com for
Portfolio analysts Screen the entire ETF universe for funds matching a specific asset class and size threshold.
Quantitative researchers Build a daily-updated dataset of ETF returns and volume for factor model inputs.
Financial advisors Compare expense ratios and YTD performance across all equity ETFs for client recommendations.
Data vendors Populate an internal ETF database with current AUM and return figures from a single source.

What it does

This Actor collects ETF directory listings from ETF.com, filtered by asset class and sorted by your chosen metric, and returns each fund as a flat row.

  • ๐Ÿ“Š Full directory coverage: scrape every ETF on ETF.com, or narrow by asset class like Equity, Fixed Income, or Commodity.
  • ๐Ÿ“ˆ Performance sorting: order results by assets under management, YTD return, or average volume to surface the most relevant funds first.
  • ๐Ÿ”ข Flat row output: each ETF returns as one row with its ticker, name, AUM, expense ratio, YTD return, volume, and asset class.
  • โš™๏ธ Pay-as-you-go: free users get a 10-ETF preview; paid users can pull up to one million funds in a single run.

Results export to CSV, JSON, Excel, or XML, or straight from the API.

What you can do with ETF.com data

๐Ÿ“‹ Build a daily ETF watchlist.

A portfolio analyst runs the Actor each morning with Equity selected and sorted by YTD return, then imports the CSV into a spreadsheet to flag top movers.

๐Ÿ“Š Feed a quantitative model.

A researcher scrapes all Fixed Income ETFs sorted by average volume, pulls the dataset into Python, and uses the AUM and return columns as model features.

๐Ÿ’ฐ Compare fund costs at scale.

A financial advisor scrapes every ETF, filters for expense ratios under 0.20% in Excel, and identifies the cheapest funds in each asset class for client portfolios.

๐Ÿ” Audit an ETF universe.

A data vendor runs the Actor weekly with no filter, sorts by assets, and loads the full directory into a SQL database to power an internal screening tool.

Why choose this scraper

What you get
No API registration Reads the public ETF.com directory with zero authentication or rate-limit headaches.
One fixed schema Every fund arrives with the same columns, ready for analysis or a database load.
Sort before export Get the largest funds, best performers, or most liquid ETFs at the top of your file.

How it compares

No other Store actor targets ETF.com the same way, so the honest comparison is with the alternatives teams actually weigh.

| | ETF.com Scraper | ETF Data Holdings and Returns | Build it in-house | By hand | |---|---|---|---| | Setup | Run it now, zero config | Days of engineering | None, but hours per pull | | When ETF.com changes | Maintained for you | You fix it | You re-learn the page | | Proxies, retries, anti-bot | Built in | Your problem | Browser only | | Output | Fixed JSON schema, CSV/Excel export | Whatever you build | Copy-paste | | Cost | Pay per result | Engineering time | Analyst hours |

Configure the run

Drive the Actor with an optional asset class filter and a sort order; filtering runs as the directory is read so only matching ETFs reach your dataset. The Input tab lists every parameter.

A first run with the defaults:

{
 "maxItems": 10,
 "sortBy": "assets"
}

A larger pull:

{
 "maxItems": 200,
 "sortBy": "assets"
}

Pricing

Pay-per-result: $0.021 per result collected. You pay only for the results written to your dataset.

Results collected Approximate cost
100 results $2.10
1,000 results $21.00
10,000 results $210.00

New Apify accounts start with $5 in free credit.

Free users

Free-plan runs return up to 10 results as a preview. Upgrade your Apify plan to collect up to 1,000,000 results per run.

Run it

  1. Create a free Apify account with $5 in credit.
  2. Open the ETF.com Scraper | ETF Data Holdings and Returns.
  3. Set your inputs and any filters, then click Start.
  4. Export the results as CSV, Excel, JSON, or XML from the Dataset tab.

Run it programmatically through the Apify API (run-sync-get-dataset-items) or the ApifyClient for JavaScript and Python.

Use with AI agents (MCP)

Give an AI agent live access to ETF.com through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/etf-com-scraper"

Then prompt it in plain language to run the scraper and read back the results.

Troubleshooting

Why am I getting only 10 results?

You are likely on the free plan, which limits runs to a 10-ETF preview. Upgrade to a paid Apify plan and increase the 'Maximum ETFs' setting to pull more funds.

The run finished but my dataset is empty.

Check your asset class filter. If you selected an asset class that has no ETFs on ETF.com at the moment, the Actor returns nothing. Try running with 'All' to confirm the directory is reachable.

Why are the YTD return values different from my brokerage?

ETF.com calculates YTD return based on its own methodology and update schedule. Your brokerage may use a different pricing source or calculation date. The Actor returns exactly what ETF.com displays.

The Actor is timing out on large runs.

Set a lower 'Maximum ETFs' value or increase the Actor's timeout in the Apify run settings. The full directory is large, and a slow network can push a run past the default timeout.

Can I get real-time or intraday data?

No. ETF.com updates its directory daily, not intraday. The Actor scrapes the current snapshot, so you get end-of-day or latest-available figures, not streaming prices.

FAQ

Question Answer
Does this Actor get the underlying holdings of each ETF? No. This Actor scrapes the ETF directory listing, which includes summary metrics like AUM, expense ratio, YTD return, and volume. It does not drill into the individual stock or bond holdings of each fund.
Can I filter by expense ratio or AUM range? The input schema lets you filter by asset class and sort by AUM, YTD return, or volume. Range filters on numeric fields are not built into the Actor, but you can apply them in Excel or Python after export.
How many ETFs can I scrape in one run? Free users are limited to a 10-ETF preview. Paid Apify plans can scrape up to 1,000,000 ETFs per run, which covers the entire ETF.com directory many times over.
What asset classes are available? You can choose Equity, Fixed Income, Commodity, Currency, Alternatives, Asset Allocation, or leave the filter blank to scrape all asset classes at once.
Does this Actor require an ETF.com login or API key? No. It reads the public ETF.com directory pages directly. No account, no API key, and no OAuth flow are needed.
What export formats are supported? Your dataset can be exported to CSV, JSON, Excel, or XML from the Apify platform after the run completes.
How often is the ETF.com data updated? The Actor scrapes whatever ETF.com displays at the moment you run it. Most metrics like YTD return and AUM are updated daily by ETF.com, so a morning run gives you the latest figures.
Can I schedule this Actor to run automatically? Yes. Apify supports scheduled runs. You can set this Actor to run daily, weekly, or on any cron schedule and have the dataset waiting for you.
Does the Actor handle pagination automatically? Yes. It walks through every page of the ETF.com directory for you, respecting the maxItems limit you set.
What is the difference between this and the ETF Holdings Overlap Intelligence Scraper? That Actor analyzes overlap between the holdings of two specific ETFs. This Actor scrapes the full ETF.com directory to give you summary metrics on every fund, not the underlying holdings.

Related actors

Browse the full ParseForge collection for more scrapers.

๐Ÿ†˜ Need help? Email parseforge@protonmail.com with your run ID, your input, and what you expected.

โš ๏ธ Disclaimer. This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by ETF.com. It collects only publicly available data. You are responsible for using the collected data in compliance with the source's terms of service and applicable data-protection laws, including GDPR, CCPA, and PIPL. Do not use it to collect personal data unlawfully.

Input

FieldTypeWhat it doesDefault
maxItems integer Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000 10
assetClass string (7 options) Filter ETFs by asset class. Leave empty to scrape all asset classes. not set
sortBy string (3 options) Field to sort ETFs by. assets

Pricing

from $19.00 per 1,000 results

Charged forWhat it isPrice each
result Single result in the default dataset. $0.019 to $0.021

Tiered: the lower figure is the price on a higher Apify plan. Billing and the free credit live on Apify.

API

One POST returns the dataset directly. Same shape for every scraper in the library, so swapping the slug is the only change.

POST ยท run and get results
curl -X POST "https://api.apify.com/v2/acts/parseforge~etf-com-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "maxItems": 3,
    "sortBy": "assets"
  }'

Examples

Input that runs as-is.

input.json
{
  "maxItems": 3,
  "sortBy": "assets"
}

Reviews

No reviews yet. Be the first.

Issues

We build and maintain this scraper, so a problem with it comes to us. Report it on the Apify listing and the thread stays attached to the scraper where the next person can find it: open an issue.

Broken and urgent, or you would rather not post in public? Write to parseforge@protonmail.com and it reaches the people who wrote it.

Related scrapers

Run ETF.com Scraper | ETF Data Holdings and Returns on Apify All scrapers