API Documentation
Base URL: https://api.irrationalsignals.com
Quick Start
Get your first signal in under a minute:
- Create an account to get your API key
- Call the signals endpoint with your key
- Receive live trading signals during market hours (10:47 AM – 3:47 PM ET) — see schedule
curl -H "X-API-Key: YOUR_API_KEY" \
https://api.irrationalsignals.com/v1/signals
Python SDK
The official Python SDK wraps the API with typed models and error handling. Requires Python 3.9+.
Install
pip install irrationalsignals
Usage
from irrationalsignals import Client
client = Client("YOUR_API_KEY")
response = client.get_signals()
for signal in response.signals:
print(f"{signal.symbol} {signal.direction} (win rate: {signal.win_rate:.0%})")
if signal.execution_guidance:
eg = signal.execution_guidance
print(f" Entry: ${eg.entry_price} Exit: ${eg.exit_target}")
Filter by Sector or Hour
# Filter by sector
response = client.get_signals(sector="Technology")
# Same-day lookback (Max tier only)
response = client.get_signals(hour=14)
Error Handling
from irrationalsignals import Client, AuthError, RateLimitError, APIError
client = Client("YOUR_API_KEY")
try:
response = client.get_signals()
except AuthError:
print("Invalid API key")
except RateLimitError as e:
print(f"Rate limited. Retry after: {e.retry_after}s")
except APIError as e:
print(f"API error {e.status_code}: {e.detail}")
Authentication
All API requests require authentication via the X-API-Key header:
X-API-Key: isk_free_abc123...
Create an account to get your API key. Keys are prefixed with your tier (e.g., isk_free_, isk_pro_, isk_max_). You can manage your keys from the dashboard.
Signals
Get live trading signals. Available during US market hours — see signal schedule for exact times.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| sector | string | Filter by sector. One of: Technology, Consumer Cyclical, Communication Services |
| hour | int | ET hour for same-day lookback (10–15). Max only. See schedule. |
Request
# Basic — get latest signals
curl -H "X-API-Key: YOUR_API_KEY" \
"https://api.irrationalsignals.com/v1/signals"
# Filter by sector
curl -H "X-API-Key: YOUR_API_KEY" \
"https://api.irrationalsignals.com/v1/signals?sector=Technology"
# Same-day lookback (Max only)
curl -H "X-API-Key: YOUR_API_KEY" \
"https://api.irrationalsignals.com/v1/signals?hour=14"
Response
Free tier gets 1 signal per day from the first market hour (10:47 AM ET); Pro gets up to 8 per hour; Pro Max gets all signals. Fields not available for your tier are omitted entirely.
{
"market_hour": "2026-03-13T17:00:00+00:00",
"signal_count": 1,
"tier": "free",
"next_update": "2026-03-13T17:50:00+00:00",
"signals": [
{
"symbol": "MRVL",
"direction": "BUY",
"win_rate": 0.78,
"win_rate_type": "per_symbol",
"current_price": 87.52,
"vix_at_signal": 18.4,
"sector": "Technology",
"industry": "Semiconductors",
"execution_guidance": {
"entry_price": 87.45,
"expected_return_pct": 0.0123,
"exit_target": 88.52,
"primary_horizon": "2h"
}
}
],
"disclaimer": "Not investment advice. Signals are statistical observations, not recommendations."
}
Response Fields
| Field | Type | Description |
|---|---|---|
market_hour | string | ISO 8601 timestamp of the market hour these signals cover. |
signal_count | int | Number of signals in this response. |
tier | string | Your current tier (free, pro, or max). |
next_update | string | ISO 8601 timestamp of when the next batch of signals will be available. null after the last signal of the day. |
signals | array | Array of signal objects (see below). |
disclaimer | string | Legal disclaimer included in every response. |
Signal Fields
| Field | Type | Tier | Description |
|---|---|---|---|
symbol | string | All | Ticker symbol (e.g., MRVL, AAPL). |
direction | string | All | BUY or SELL — the predicted direction. |
win_rate | float | All | Historical win rate for this signal pattern (0.0 – 1.0). E.g., 0.78 means 78% of past signals with similar characteristics were correct. See win_rate_type for how this value was derived. |
win_rate_type | string | All | Source of the win_rate value. One of:
null — treat null as equivalent to pooled. Filter on win_rate_type == "per_symbol" if you only want individually validated signals. |
current_price | float | All | Price of the stock at the time the signal was generated. |
vix_at_signal | float | All | CBOE Volatility Index (VIX) at signal time. Lower VIX (<20) generally means calmer markets with more signals; higher VIX (>25) means fewer but potentially higher-conviction signals. |
sector | string | All | GICS sector: Technology, Consumer Cyclical, or Communication Services. |
industry | string | All | Industry within the sector (e.g., Semiconductors, Software). |
Execution Guidance Fields
Included in every signal. Pro Max tier adds additional fields marked below.
| Field | Type | Tier | Description |
|---|---|---|---|
entry_price | float | All | Suggested entry price. Compare to current_price to gauge whether the opportunity is still within range. |
expected_return_pct | float | All | Expected return from entry to exit target, expressed as a decimal (e.g., 0.008 = 0.8%). Derived from the signal type's per-signal empirical 2.5-hour (150-minute) paper-forward return over the trailing 90 days of historical price data, refreshed weekly. Values are clipped to a sensible range (0.3% minimum, 1.5% maximum) and default to 0.5% for signal types with insufficient historical data (<30 samples in the 90-day window). |
exit_target | float | All | Suggested exit price for the signal. Computed as entry_price × (1 + expected_return_pct). Intended as an execution reference — you're free to exit earlier or later based on your own risk tolerance. |
primary_horizon | string | All | Expected time horizon for the signal (typically 2h). Signals are designed for intraday holds. |
horizon_end | string | Pro Max | ISO 8601 timestamp for when the signal's effective window closes (signal_time + 2h30m, capped at 15:50 ET). After this time, the statistical edge is no longer expected to hold. |
Preflight Fields Pro Max only
Live market conditions fetched at request time. Use these to validate whether the signal's assumptions still hold before entering a trade.
| Field | Type | Description |
|---|---|---|
price_vs_entry_pct | float | How far the current price has drifted from the suggested entry price, as a percentage. A large positive value means the price has moved away from entry — the opportunity may have passed. |
intraday_range_position | float | Where the current price sits within today's high-low range (0.0 = at the low, 1.0 = at the high). Useful for gauging intraday momentum. |
relative_volume | float | Current volume relative to the average for this time of day. Values >1.0 indicate above-average activity, which can confirm conviction in the signal. |
checked_at | string | ISO 8601 timestamp of when the preflight data was fetched. Preflight data is live — this tells you how fresh it is. |
Signal Schedule
Signals are generated 6 times per trading day, at approximately :47 past each hour from 10 AM to 3 PM Eastern Time. Each batch analyzes the current hour's :30 mid-hour bar.
Daily Signal Timetable
The schedule is the same year-round in ET. UTC times shift with US Daylight Saving Time (DST).
| Signal Available (ET) | Bar Analyzed | UTC (EDT, Mar–Nov) | UTC (EST, Nov–Mar) |
|---|---|---|---|
| 10:47 AM | 10:00 – 10:30 AM | 14:47 | 15:47 |
| 11:47 AM | 11:00 – 11:30 AM | 15:47 | 16:47 |
| 12:47 PM | 12:00 – 12:30 PM | 16:47 | 17:47 |
| 1:47 PM | 1:00 – 1:30 PM | 17:47 | 18:47 |
| 2:47 PM | 2:00 – 2:30 PM | 18:47 | 19:47 |
| 3:47 PM | 3:00 – 3:30 PM | 19:47 | 20:47 |
Key Details
- Timezone: All times are US Eastern (ET), which automatically adjusts for Daylight Saving Time. EDT (UTC-4) runs from the 2nd Sunday of March through the 1st Sunday of November; EST (UTC-5) runs the rest of the year.
- No signals before 10:47 AM ET: The first half-hour bar of each market hour must complete before signals can be generated.
- Last signal at 3:47 PM ET: The final signal analyzes the 3:00–3:30 PM bar. There is no signal for the 3:30–4:00 PM window as the market closes at 4:00 PM, leaving no actionable window.
- Non-trading days: No signals on weekends or US market holidays. The API returns an empty
signalsarray. next_updatefield: Every API response includes anext_updatetimestamp (ISO 8601 / UTC) so you always know exactly when fresh signals will be available.hourparameter: Use thehourquery parameter (ET hour, 10–15) to request signals for a specific market hour within the current day.
Rate Limits
Requests are limited per day based on your tier:
| Tier | Daily Limit | Per Hour (approx) |
|---|---|---|
| Free | 25 | ~4 |
| Pro | 100 | ~14 |
| Max | 500 | ~71 |
Rate limit info is included in response headers:
X-RateLimit-Limit— your daily limitX-RateLimit-Remaining— requests remaining today
Errors
All errors follow RFC 7807 problem details format:
{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Invalid or revoked API key."
}
Common Status Codes
| Code | Meaning |
|---|---|
401 | Invalid or missing authentication |
403 | Account deactivated |
409 | Duplicate email (registration) |
429 | Rate limit exceeded |
Response by Tier
Each tier builds on the previous. Free gets 1 signal per day from the first market hour, Pro up to 8/hour, Max sees all (~16/hr avg). Signals are proportionally sampled across win-rate buckets.
| Feature | Free | Pro | Pro Max |
|---|---|---|---|
| Signals | 1 / day (first hour) | Up to 8 / hour | All (~16/hr avg) |
| Daily requests | 25 | 100 | 500 |
| Symbol, direction, industry | ✓ | ✓ | ✓ |
| Win rate, current price, sector | ✓ | ✓ | ✓ |
| Execution guidance (entry, expected return, exit target, horizon) | ✓ | ✓ | ✓ |
| Horizon end timestamp | — | — | ✓ |
| Preflight checks (VIX, drift, momentum, volume) | — | — | ✓ |
| Same-day historical lookback | — | — | ✓ |
Free & Pro Tiers
All tiers include direction, win rate, current price, VIX at signal time, sector, industry, and execution guidance (entry price, expected return, exit target, primary horizon). Free gets 1 signal from the first market hour; Pro gets up to 8/hr across all hours. Same response fields. See the Signals response example above.
Pro Max Tier — adds horizon end, preflight, and lookback
Adds a precise horizon end timestamp and live preflight checks (price drift vs. entry, intraday momentum, and relative volume — fetched at request time). Pro Max also unlocks same-day historical lookback via the hour query parameter. Fields not available for lower tiers are simply absent from their responses.
{
"symbol": "MRVL",
"direction": "BUY",
"win_rate": 0.78,
"win_rate_type": "per_symbol",
"current_price": 87.52,
"vix_at_signal": 18.4,
"sector": "Technology",
"industry": "Semiconductors",
"execution_guidance": {
"entry_price": 87.45,
"expected_return_pct": 0.0123,
"exit_target": 88.52,
"primary_horizon": "2h",
"horizon_end": "2026-03-13T19:30:00+00:00"
},
"preflight": {
"price_vs_entry_pct": 0.0008,
"intraday_range_position": 0.62,
"relative_volume": 1.34,
"checked_at": "2026-03-13T17:52:00+00:00"
}
}