Economic Calendar API
Access scheduled economic events — NFP, CPI, FOMC, interest rate decisions, and 100+ more — with impact ratings, forecasts, previous readings, and actuals published the moment they release.
Endpoint
GET https://tickatlas.com/v1/calendar Requires X-API-Key header. Returns upcoming scheduled events with optional filtering.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
from | string | today | Start date, ISO 8601 or YYYY-MM-DD. Ignored when next_hours/prev_hours is set. |
to | string | +7 days | End date. Maximum 30-day range from from. |
next_hours | integer | — | Look-ahead window in hours for next_hours (1–720, i.e. up to 30 days). Overrides from/to.
A wide window spans several pages — follow pagination.has_more and use offset to read its far end. |
prev_hours | integer | — | Look-back window in hours (1–96) — returns recently released events with their actual values (Starter+). Overrides from/to; combine with next_hours to straddle now. Values above 96 return 422. |
impact | string | all | Filter by impact: low, medium, high, or omit for all. |
currencies | string | — | Comma-separated currency codes: USD,EUR,GBP |
country | string | — | Alias for currencies (same comma-separated codes). |
q | string | — | Search event titles, case-insensitive substring (max 100 chars). |
offset | integer | 0 | Number of results to skip for pagination. |
limit | integer | 100 | Max events to return (1-500). |
source | string | both | Restrict to one stream: primary or secondary (lowercase, single value, exact match). Omitted returns both streams, unchanged. secondary is the raw secondary stream: it can include a duplicate of a primary release that the default view hides when both fall on the same page, so pagination.total of primary plus secondary always equals the default total, while the default count can be lower by those hidden duplicates. Any other value — including an empty one — returns 400 INVALID_SOURCE. |
Response Fields
Events are returned under data.events[];
data.count,
data.range and
data.pagination sit alongside them. Each event carries:
| Field | Description |
|---|---|
id | Event identifier, stable across polls: 16 hexadecimal characters. Treat it as opaque; use series_id to link releases of the same indicator. |
datetime | ISO 8601 UTC timestamp of the event release (e.g., 2026-08-07T12:30:00+00:00) |
currency | Affected currency (USD, EUR, GBP, JPY, etc.) |
event | Full event name (e.g., "Non-Farm Payrolls") |
impact | Event market impact: low, medium, or high |
forecast | Analyst consensus forecast (string, may include units) |
previous | Prior period reading |
actual | The released figure, populated the moment it prints — on primary rows only; a secondary row's actual stays null permanently. A Starter+ feature. Note there are two separate gates: free and trial keys cannot call this endpoint at all (403 PLAN_UPGRADE_REQUIRED); PAYG and Tool keys can call it but always receive null here; Starter and above see the released value, null only until the event prints. Use prev_hours to fetch recently released events with their actuals. |
source | primary or secondary — always present, never null. The primary stream is the only one that ever receives an actual; the secondary stream carries schedule, forecast and previous only. Filter with ?source=. |
series_id | Stable per-indicator key (string) on every primary row; null on every secondary row. Group releases by it to build a per-indicator history. |
Example Response
{
"success": true,
"data": {
"events": [
{
"id": "acb808eac77e0bbe",
"datetime": "2026-09-08T23:50:00+00:00",
"currency": "JPY",
"event": "M2 Money Stock y/y",
"impact": "low",
"forecast": "2.2%",
"previous": "2.2%",
"actual": null,
"source": "secondary",
"series_id": null
},
{
"id": "7c1e9a04b2f35d68",
"datetime": "2026-09-08T23:50:04+00:00",
"currency": "JPY",
"event": "BoJ M2 Money Stock y/y",
"impact": "low",
"forecast": "2.0%",
"previous": "2.2%",
"actual": "2.0%",
"source": "primary",
"series_id": "3f8a21c07d9e5b46"
}
],
"count": 2,
"range": {
"from": "2026-09-08T13:45:00",
"to": "2026-09-12T19:45:00"
},
"pagination": {
"offset": 0,
"limit": 100,
"total": 2,
"has_more": false
}
}
} Code Examples
cURL
# Upcoming — high-impact events in the next 24 hours
curl -X GET "https://tickatlas.com/v1/calendar?impact=high&next_hours=24&offset=0&limit=100" \
-H "X-API-Key: YOUR_API_KEY"
# Just released — events from the last 48 hours WITH their actuals (max prev_hours=96)
curl -X GET "https://tickatlas.com/v1/calendar?prev_hours=48&impact=high&limit=100" \
-H "X-API-Key: YOUR_API_KEY"
# Filter by currency
curl -X GET "https://tickatlas.com/v1/calendar?currencies=USD,EUR&next_hours=48&offset=0&limit=100" \
-H "X-API-Key: YOUR_API_KEY"
# All events this week (168 hours)
curl -X GET "https://tickatlas.com/v1/calendar?next_hours=168&offset=0&limit=100" \
-H "X-API-Key: YOUR_API_KEY" Python
import requests
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://tickatlas.com/v1/calendar"
# Events are under data.events; pagination + range under data too.
def get_events(**params):
r = requests.get(BASE_URL, headers={"X-API-Key": API_KEY}, params=params)
return r.json()["data"]["events"]
# Upcoming: high-impact events in the next 24 hours
upcoming = get_events(impact="high", next_hours=24)
for e in upcoming:
print(f"{e['datetime']} | {e['currency']} | {e['event']} | Impact: {e['impact']}")
# Just released: what came out in the last 48 hours, WITH actuals (Starter+).
# prev_hours is a rolling backward window (max 96h), newest-first.
released = get_events(prev_hours=48, impact="high")
for e in released:
if e["actual"] is not None:
print(f"{e['event']}: actual {e['actual']} vs forecast {e['forecast']}") Common Use Cases
News Trading Bot
Poll the calendar before each new position entry. If a high-impact event's datetime is less than 30 minutes away (compute datetime − now), hold off on new trades until after the release.
Beat/Miss Momentum Signal
After datetime passes, poll until actual is non-null. Compare to forecast — a significant beat often triggers a momentum move in the affected currency.
Pre-Event Discord Alert
Run every 5 minutes. When a high-impact event's datetime is 30 minutes out or less, fire a Discord or Slack webhook to alert your team.