Skip to content
Back to skills

Twelvedata Api

ASecurity

Twelve Data financial API for stocks, forex, crypto, ETFs, and 100+ technical indicators. Use when fetching time series data, technical analysis, fundamentals, or real-time streaming quotes.

  • 3 stars
  • 0 votes
  • 0 copies
  • 4 views
  • Added February 8, 2026
documentationpythongobashgitapidocumentation

Works with

  • cli
  • api

Security analysis

A96/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro scans all 3 files and shows the line behind each finding

Scanned February 12, 2026

npx -y skills add adaptationio/Skrillz --skill twelvedata-api --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Twelvedata Api?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Twelvedata Api
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/adaptationio-twelvedata-api/badge)](https://www.skillsdirectory.com/skills/adaptationio-twelvedata-api)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: twelvedata-api
description: Twelve Data financial API for stocks, forex, crypto, ETFs, and 100+ technical indicators. Use when fetching time series data, technical analysis, fundamentals, or real-time streaming quotes.
version: 1.0.0
---

# Twelve Data API Integration

Comprehensive financial data API providing stocks, forex, crypto, ETFs, indices, and 100+ technical indicators with excellent Python SDK support.

## Quick Start

### Authentication
```bash
# Environment variable (recommended)
export TWELVEDATA_API_KEY="your_api_key"

# Or in .env file
TWELVEDATA_API_KEY=your_api_key
```

### Basic Usage (Python)
```python
import requests
import os

API_KEY = os.getenv("TWELVEDATA_API_KEY")
BASE_URL = "https://api.twelvedata.com"

def get_quote(symbol: str) -> dict:
    """Get real-time quote for a symbol."""
    response = requests.get(
        f"{BASE_URL}/quote",
        params={"symbol": symbol, "apikey": API_KEY}
    )
    return response.json()

# Example
quote = get_quote("AAPL")
print(f"AAPL: ${quote['close']} ({quote['percent_change']}%)")
```

### Using Official SDK
```python
from twelvedata import TDClient

td = TDClient(apikey="your_api_key")

# Get time series
ts = td.time_series(
    symbol="AAPL",
    interval="1day",
    outputsize=30
).as_pandas()

# Get quote
quote = td.quote(symbol="AAPL").as_json()

# Get with technical indicators
ts_with_indicators = td.time_series(
    symbol="AAPL",
    interval="1day",
    outputsize=50
).with_sma(time_period=20).with_rsi().as_pandas()
```

## API Endpoints Reference

### Core Data

| Endpoint | Description | Credits |
|----------|-------------|---------|
| `/quote` | Real-time quote | 1 |
| `/price` | Current price only | 1 |
| `/eod` | End of day price | 1 |
| `/time_series` | Historical OHLCV | 1 |
| `/exchange_rate` | Currency conversion | 1 |

### Reference Data

| Endpoint | Description | Credits |
|----------|-------------|---------|
| `/symbol_search` | Search symbols | 1 |
| `/instruments` | List all instruments | Free |
| `/exchanges` | List exchanges | Free |
| `/instrument_type` | List types | Free |
| `/earliest_timestamp` | Data start date | Free |

### Fundamental Data

| Endpoint | Description | Credits |
|----------|-------------|---------|
| `/income_statement` | Income statement | 100 |
| `/balance_sheet` | Balance sheet | 100 |
| `/cash_flow` | Cash flow | 100 |
| `/earnings` | Earnings history | 100 |
| `/earnings_calendar` | Upcoming earnings | 100 |
| `/dividends` | Dividend history | 1 |
| `/splits` | Split history | 1 |
| `/statistics` | Key statistics | 100 |
| `/profile` | Company profile | 100 |

### Technical Indicators (100+)

All indicators cost 1 credit and are included with time_series:

**Trend:** SMA, EMA, WMA, DEMA, TEMA, KAMA, MAMA, T3, TRIMA, VWMA
**Momentum:** RSI, MACD, Stochastic, Williams %R, ADX, CCI, MFI, ROC, AROON
**Volatility:** Bollinger Bands, ATR, Keltner Channels, Donchian
**Volume:** OBV, AD, ADOSC, VWAP

## Rate Limits

| Tier | Calls/Min | Daily | WebSocket |
|------|-----------|-------|-----------|
| Free | 8 | 800 | Trial only |
| Grow ($29) | 55-377 | Unlimited | ❌ |
| Pro ($99) | 610-1597 | Unlimited | ✅ |
| Enterprise ($329) | 2584+ | Unlimited | ✅ |

**Credit System:**
- Standard endpoints: 1 credit per symbol
- Fundamental data: 100 credits per symbol
- Batch requests: Same cost as individual

## Common Tasks

### Task: Get Time Series with Pandas
```python
from twelvedata import TDClient
import pandas as pd

td = TDClient(apikey=API_KEY)

def get_historical_data(symbol: str, days: int = 100) -> pd.DataFrame:
    """Get historical OHLCV data as DataFrame."""
    ts = td.time_series(
        symbol=symbol,
        interval="1day",
        outputsize=days
    )
    return ts.as_pandas()

# Example
df = get_historical_data("AAPL", 100)
print(df.head())
```

### Task: Technical Analysis with Multiple Indicators
```python
def get_technical_analysis(symbol: str) -> pd.DataFrame:
    """Get price data with technical indicators."""
    ts = td.time_series(
        symbol=symbol,
        interval="1day",
        outputsize=100
    )

    # Chain indicators
    df = (ts
        .with_sma(time_period=20)
        .with_sma(time_period=50)
        .with_rsi(time_period=14)
        .with_macd()
        .with_bbands()
        .as_pandas()
    )

    return df

# Example
analysis = get_technical_analysis("AAPL")
```

### Task: Get Multiple Symbols (Batch)
```python
def get_batch_quotes(symbols: list) -> dict:
    """Get quotes for multiple symbols efficiently."""
    symbol_str = ",".join(symbols)

    response = requests.get(
        f"{BASE_URL}/quote",
        params={
            "symbol": symbol_str,
            "apikey": API_KEY
        }
    )
    return response.json()

# Example: Up to 120 symbols per request
quotes = get_batch_quotes(["AAPL", "MSFT", "GOOGL", "AMZN"])
```

### Task: Get Fundamental Data
```python
def get_fundamentals(symbol: str) -> dict:
    """Get comprehensive fundamental data."""
    # Note: Each call costs 100 credits

    profile = requests.get(
        f"{BASE_URL}/profile",
        params={"symbol": symbol, "apikey": API_KEY}
    ).json()

    stats = requests.get(
        f"{BASE_URL}/statistics",
        params={"symbol": symbol, "apikey": API_KEY}
    ).json()

    return {
        "name": profile.get("name"),
        "sector": profile.get("sector"),
        "industry": profile.get("industry"),
        "market_cap": stats.get("statistics", {}).get("valuations_metrics", {}).get("market_capitalization"),
        "pe_ratio": stats.get("statistics", {}).get("valuations_metrics", {}).get("trailing_pe"),
        "dividend_yield": stats.get("statistics", {}).get("dividends_and_splits", {}).get("dividend_yield")
    }
```

### Task: Get Forex Rates
```python
def get_forex_rate(from_currency: str, to_currency: str) -> dict:
    """Get currency exchange rate."""
    response = requests.get(
        f"{BASE_URL}/exchange_rate",
        params={
            "symbol": f"{from_currency}/{to_currency}",
            "apikey": API_KEY
        }
    )
    return response.json()

# Example
rate = get_forex_rate("USD", "EUR")
print(f"USD/EUR: {rate['rate']}")
```

### Task: Get Crypto Data
```python
def get_crypto_price(symbol: str, exchange: str = "Binance") -> dict:
    """Get cryptocurrency price."""
    response = requests.get(
        f"{BASE_URL}/quote",
        params={
            "symbol": f"{symbol}/USD",
            "exchange": exchange,
            "apikey": API_KEY
        }
    )
    return response.json()

# Example
btc = get_crypto_price("BTC")
print(f"BTC: ${btc['close']}")
```

### Task: Search for Symbols
```python
def search_symbols(query: str, show_plan: bool = False) -> list:
    """Search for stock/crypto symbols."""
    params = {
        "symbol": query,
        "apikey": API_KEY
    }
    if show_plan:
        params["show_plan"] = "true"

    response = requests.get(f"{BASE_URL}/symbol_search", params=params)
    return response.json().get("data", [])

# Example
results = search_symbols("Apple")
for r in results[:5]:
    print(f"{r['symbol']}: {r['instrument_name']}")
```

## WebSocket Real-Time Streaming

```python
from twelvedata import TDClient

td = TDClient(apikey=API_KEY)

def on_event(event):
    """Handle real-time price updates."""
    print(f"{event['symbol']}: ${event['price']}")

# Create WebSocket (requires Pro plan)
ws = td.websocket(
    symbols=["AAPL", "MSFT", "GOOGL"],
    on_event=on_event
)

ws.connect()
ws.keep_alive()
```

## Error Handling

```python
def safe_api_call(endpoint: str, params: dict) -> dict:
    """Make API call with error handling."""
    params["apikey"] = API_KEY

    try:
        response = requests.get(f"{BASE_URL}/{endpoint}", params=params)
        data = response.json()

        # Check for API errors
        if "status" in data and data["status"] == "error":
            print(f"API Error: {data.get('message', 'Unknown error')}")
            return {}

        # Check remaining credits
        credits_used = response.headers.get("api-credits-used")
        credits_left = response.headers.get("api-credits-left")
        if credits_left:
            print(f"Credits remaining: {credits_left}")

        return data

    except Exception as e:
        print(f"Request error: {e}")
        return {}
```

## Free vs Premium Features

### Free Tier Includes
- 8 API calls/minute, 800/day
- US stocks, forex, crypto
- Time series data (end of day)
- All technical indicators
- Basic reference data
- 1-2 years intraday history
- 30+ years daily history

### Premium Required
- Higher rate limits
- International stocks (Grow+)
- WebSocket streaming (Pro+)
- Pre/post market data (Pro+)
- Extended hours trading
- Mutual funds & ETF breakdown (Enterprise)
- No daily limits

## Best Practices

1. **Use batch requests** - Up to 120 symbols per call
2. **Cache reference data** - Exchanges, instruments rarely change
3. **Use SDK pandas output** - Easier data manipulation
4. **Chain indicators** - Include with time_series (1 credit total)
5. **Monitor credits** - Check response headers
6. **Use appropriate intervals** - 1day for analysis, 1min for trading

## Installation

```bash
# Python SDK with all features
pip install twelvedata[matplotlib,plotly]

# Basic installation
pip install twelvedata

# For WebSocket
pip install websocket-client
```

## Related Skills
- `finnhub-api` - Real-time news focus
- `alphavantage-api` - Alternative indicator source
- `fmp-api` - Fundamental analysis focus

## References
- [Official Documentation](https://twelvedata.com/docs)
- [Python SDK](https://github.com/twelvedata/twelvedata-python)
- [Technical Indicators](https://twelvedata.com/docs#technical-indicators)
- [Pricing](https://twelvedata.com/pricing)

Files in this skill

  • SKILL.md9.6 KB
  • references/ENDPOINTS.md6.6 KB
  • scripts/twelvedata_client.py14.1 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…