Query an ETF-only site. For example, https://etfdb.com/etf/TSLA/#etf-ticker-profile has But https://etfdb.com/etf/GUNR/#etf-ticker-profile has This doesn't look too hard to determine ETF or not.
Update: NxCore has deprecated ETF classifications, so that field is always is 0. Confirmed by their support. Given that I would rather classify too many symbols as ETF rather than too few, if I can't find an API source, I will go with a combination of name rules (thanks @guru) and scraping as suggested by @ph1l.
This is easy. NASDAQ symbol lists have a field called "ETF" (Y/N). That's what I use. Scraping is so unnecessary for this.
It's been around for 10 years or more I believe. It's official NASDAQ. I'll just add the links for memo: Not NASDAQ listed: http://www.nasdaqtrader.com/dynamic/SymDir/otherlisted.txt NASDAQ listed: http://www.nasdaqtrader.com/dynamic/SymDir/nasdaqlisted.txt All traded on NASDAQ (Complete list of stocks and ETFs): http://www.nasdaqtrader.com/dynamic/SymDir/nasdaqtraded.txt