---
title: "Earnings + economic calendar events"
method: GET
path: "/api/calendar"
tags: ["Market Data"]
---

# Earnings + economic calendar events

`GET /api/calendar`

## Request

- Base URL: `https://www.oxfordledge.com` (the document declares no server; this is the origin it was published from)
- URL: `https://www.oxfordledge.com/api/calendar`
- Auth: none declared

Earnings calendar events. Includes `last_fetched` so the UI can
surface a freshness timestamp (user-panel Marcus/Tom feedback:
stale-data paranoia for unlabeled calendars).

## Response `200`

Successful Response

- CalendarResponse: `GET /api/calendar` response. F4 schema-tightening (2026-04-30): `events` REQUIRED. Handler returns `{"events": events, "last_fetched": last_fetched}` on every 200 path; the 500 fallback uses ErrorResponse. Frontend `calendar-view.js:159` reads `payload.events` (with a defensive fallback to bare-array for stale dynos). `last_fetched` surfaces the freshness timestamp in the panel header. Note: previously declared `count`, `range_start`, `range_end` — none of which the handler returns. Removed to keep OpenAPI spec honest.
  - `events` CalendarEvent[], required
    - `date` string, nullable
    - `ticker` string, nullable
    - `daysAway` integer, nullable
    - `type` string, nullable
    - `label` string, nullable
  - `last_fetched` string, nullable

## Other responses

- `500`: Internal Server Error

---

[API](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api.md) · [All operations](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/llms.txt) · [OpenAPI document](https://skmtc.dev/oxfordledge/apis/oxford-ledge-api/revisions/e832a1260f0b?raw)
