schwab-py
and tda-api
's Future Following the Schwab Transition
With the upcoming transition to Charles Schwab, we have been developing
a new schwab-py
API (linked here)
which implements much of the functionality of tda-api
, but is adapted
for Charles Schwab's API.
The new schwab-py
API replaces tda-api
, and tda-api
will no
longer be actively maintained. All new users should refer to schwab-py
for the latest and most up-to-date features.
TD Ameritrade's API endpoints will no longer work after Friday, May 10th, 2024. All TD Ameritrade clients will have moved to Charles Schwab, and TD Ameritrade will have turned off the TD Ameritrade API endpoints.
For more details on the future of the tda-api and the Schwab Transition, read here.
tda-api
is an unofficial wrapper around the TD Ameritrade APIs. It strives to be as thin and
unopinionated as possible, offering an elegant programmatic interface over each
endpoint. Notable functionality includes:
- Login and authentication
- Quotes, fundamentals, and historical pricing data
- Options chains
- Streaming quotes and order book depth data
- Trades and trade management
- Account info and preferences
For a full description of tda-api
's functionality, check out the
documentation. Meawhile, here's
a quick getting started guide:
Before you do anything, create an account and an application on the TD Ameritrade developer website. You'll receive an API key, also known as a Client Id, which you can pass to this wrapper. You'll also want to take note of your callback URI, as the login flow requires it.
Next, install tda-api
:
pip install tda-api
You're good to go! To demonstrate, here's how you can authenticate and fetch daily historical price data for the past twenty years:
from tda import auth, client
import json
token_path = '/path/to/token.json'
api_key = '[email protected]'
redirect_uri = 'https://your.redirecturi.com'
try:
c = auth.client_from_token_file(token_path, api_key)
except FileNotFoundError:
from selenium import webdriver
with webdriver.Chrome() as driver:
c = auth.client_from_login_flow(
driver, api_key, redirect_uri, token_path)
r = c.get_price_history('AAPL',
period_type=client.Client.PriceHistory.PeriodType.YEAR,
period=client.Client.PriceHistory.Period.TWENTY_YEARS,
frequency_type=client.Client.PriceHistory.FrequencyType.DAILY,
frequency=client.Client.PriceHistory.Frequency.DAILY)
assert r.status_code == 200, r.raise_for_status()
print(json.dumps(r.json(), indent=4))
tda-api
was designed to provide a few important pieces of functionality:
- Safe Authentication: TD Ameritrade's API supports OAuth authentication,
but too many people online end up rolling their own implementation of the
OAuth callback flow. This is both unnecessarily complex and dangerous.
tda-api
handles token fetch and refreshing for you. - Minimal API Wrapping: Unlike some other API wrappers, which build in lots
of logic and validation,
tda-api
takes raw values and returns raw responses, allowing you to interpret the complex API responses as you see fit. Anything you can do with raw HTTP requests you can do withtda-api
, only more easily.
As excellent as TD Ameritrade's API is, there are a few popular features it does not offer:
- Unfortunately, the TD Ameritrade API does not seem to expose any endpoints around the papermoney simulated trading product.
tda-api
can only be used to perform real trades using a TD Ameritrade account. Note: trades made through the API appear in thinkorswim and vice versa.- The API only supports trading in equities, mutual funds, ETFs, and options (both simple contracts and complex composite positions). Futures and futures options trading is not supported. Some data is provided for futures, but not for futures options.
- Historical options pricing data is not available.
We have a Discord server! You can join to
get help using tda-api
or just to chat with interesting people.
Bug reports, suggestions, and patches are always welcome! Submit issues here and pull requests here.
tda-api
is released under the
MIT license.
Disclaimer: tda-api is an unofficial API wrapper. It is in no way endorsed by or affiliated with TD Ameritrade or any associated organization. Make sure to read and understand the terms of service of the underlying API before using this package. This authors accept no responsibility for any damage that might stem from use of this package. See the LICENSE file for more details.