I woke up to dozens of error notifications. Every trading bot had the same error: \"HTTP 401: Unauthorized - API access has been terminated.\"
That's how I found out Schwab killed the TD API. No email, no fucking warning - just error logs full of Connection refused
and 401 Unauthorized
bullshit.
The Only API That Actually Worked
For six years, I ran automated trading strategies on TD Ameritrade's API. It wasn't perfect, but it was the only major broker that didn't treat retail developers like criminals.
While Fidelity and E*Trade told you to fuck off if you wanted API access, TD actually gave you:
- Real-time streaming data that didn't randomly disconnect
- OAuth tokens that lasted 90 days, not minutes
- Options trading support for complex spreads
- Documentation written by humans, not lawyers
I had DCA bots buying SPY every morning at 9:31 AM - learned to wait 60 seconds after open because the first minute is chaos. Momentum strategies catching breakouts in premarket. Options wheel selling 16-delta puts and 30-delta calls based on IV percentiles above 25%.
Six years of automation running without babysitting. Dead overnight in May 2024.
The Schwab Takeover: A Masterclass in Destroying Developer Trust
Schwab bought TD Ameritrade and immediately started dismantling everything that made it useful for automation.
First, they moved all accounts to Schwab's systems. Fine, I thought, just redirect the API endpoints.
Then they announced the API would be "temporarily" shut down for "integration purposes." Classic corporate bullshit - anyone who's been around long enough knows "temporary" means "fuck you, we're done with this."
Spring 2024: ECONNREFUSED
errors everywhere. No migration guide. No advance warning to existing developers. Just a middle finger to anyone who'd built their trading infrastructure on their platform.
I spent three days debugging what I thought was a config issue on my end. Checked OAuth tokens (still valid), tested endpoints manually with curl, spun up a new VPS thinking it was AWS network issues. Even tried the backup endpoint api.tdameritrade.com/v1/
- same dead response. Finally found a Reddit post on r/algotrading confirming the API was dead. Apparently that's how you communicate with developers - through fucking Reddit comments instead of developer emails.
What's Left After the Carnage
thinkorswim still works if you enjoy clicking buttons like a caveman. The platform is solid - decent charting, thinkScript for custom indicators, paperMoney for testing strategies.
But if you want automation? You're screwed.
Schwab eventually rolled out a "replacement" API that's designed to make you hate your life:
- Token refresh every 7 days kills automation reliability - Set a calendar reminder or watch your strategies fail during market hours. What's the fucking point of automation if you need to babysit it weekly?
- No futures trading - Because apparently retail traders can't be trusted with /ES contracts via API
- No fractional shares - Welcome back to 1995 when you could only buy whole shares
- Institutional focus - The API is "primarily intended for fintech companies" - translation: peasants need not apply
I tested the Schwab API for two weeks in October 2024. The weekly auth refresh killed my momentum strategies twice - forgot to update tokens over a long weekend in Colorado with spotty cell service, and my cron job refresh script failed at 2:17 AM on Sunday with some bullshit SSL error. Lost profitable SPY breakouts at $542 and $549 both times. Complete fucking joke of an API.
The Migration Nightmare
I ended up moving everything to Interactive Brokers, which has its own special flavor of developer hostility, but at least their API doesn't require weekly manual intervention.
Migrating six years of trading code took 3.5 months working evenings and weekends. Different API endpoints (/iserver/
instead of /v1/
), different order types (IB calls them "combo orders" instead of "spreads"), different data formats (JSON vs XML nonsense). Had to rewrite the entire portfolio management system because IB's position tracking uses contract IDs instead of simple symbols - a single SPY position shows up as 3 different entries depending on whether it's from options assignment, direct purchase, or dividend reinvestment.
The tda-api
Python library that thousands of developers relied on? The last working version was 1.4.0 from March 2024 before the shutdown. 847 stars on GitHub, completely useless overnight. The repo became a graveyard of "RIP TD API" comments and migration horror stories. Alex Golec's beautiful API wrapper - dead because Schwab decided retail developers aren't worth the hosting costs.
If you had trading automation running on TD Ameritrade, you know the pain. Schwab took the best retail trading API and turned it into an unusable mess that requires more maintenance than a 1990s Honda Civic.