PipAtlas API

Free · no key · JSON · CORS open · ✍️ The PipAtlas Team

The same feed that powers the Economic Calendar is available as plain JSON. No account, no key, no tracking — request a URL, get JSON back.

Fair use: the shared rate limit is roughly 20 requests per minute per IP across all API routes. Cache responses on your side — the calendar payload already carries stale-while-revalidate cache headers and only changes every few minutes.
Terms: personal, educational and non-commercial use. There is no SLA, the shape can change with notice on this page, and PipAtlas is a reference — please don't wire it into automated or signal trading. Market data may be delayed; nothing here is investment advice.

Endpoints

GET /api/calendar   GET /api/rates   GET /rss/high-impact-events.xml   GET /healthz   GET /sitemap.xml   GET /VERSION

Machine-readable spec: openapi.json (OpenAPI 3.0) — point any agent or code generator at it. Cached server-side: /api/rates consolidates the ECB daily reference rates, metals and crypto spot into one JSON payload (30-minute cache) so your client makes one request, not five.

GET /api/calendar — this week's live calendar

Returns the current week's economic events (Fri → Sun) with actual numbers merged in where officially published. If the upstream provider is unreachable, the last saved copy is served with "stale":true so your integration can react honestly.

curl -s https://pipatlas.com/api/calendar
{
  "source": "forexfactory",
  "updated": "2026-10-06T09:12:00.000Z",
  "cacheMinutes": 5,
  "count": 82,
  "events": [
    {
      "name": "Non-Farm Payrolls",
      "currency": "USD",
      "impact": "High",
      "date": "2026-11-06T13:30:00+01:00",
      "forecast": "170K",
      "previous": "119K",
      "url": "https://www.forexfactory.com/calendar/…"
    }
  ]
}
FieldTypeNotes
namestringEvent title as shown on the calendar.
currencystringISO code — USD, EUR, ALL (holidays), etc.
impactstringOne of High, Medium, Low, Holiday.
dateISO 8601Includes the source's UTC offset — parse, don't slice.
actualstring | absentPresent once the real print is merged in from the official page.
forecast / previousstringAs published by the source; may be empty.
urlstringOfficial source page for the event.
stalebooleantrue only when the upstream is down and a saved copy is being served.

GET /rss/high-impact-events.xml — events RSS

The next high-impact releases (up to 30) as a standard RSS feed — for RSS readers, community calendars, or anything that polls a plain XML URL. Item times are UTC; descriptions carry forecast/previous and the merged actual once published. Cached for 5 minutes.

curl -s https://pipatlas.com/rss/high-impact-events.xml | head -12

GET /healthz — feed health

curl -s https://pipatlas.com/healthz
{
  "ok": true,
  "version": "5.99",
  "uptimeSec": 12345,
  "feeds": {
    "calendar": { "cached": true, "ageMin": 2, "count": 82 },
    "actuals":  { "cached": true, "ageMin": 31, "count": 21 },
    "twelveData": { "configured": true }
  },
  "backupsOnDisk": 3
}

GET /sitemap.xml and GET /VERSION

The sitemap is generated live (it includes forum threads that exist in folder mode). /VERSION returns the deployed site version as plain text.

Copy-paste clients

JavaScript (browser or Node 18+)

const r = await fetch('https://pipatlas.com/api/calendar');
const { events = [] } = await r.json();
const next = events.find(e => e.impact === 'High' && new Date(e.date) > new Date());
console.log(next && [next.currency, next.name, next.date].join(' · '));

Python

import requests
d = requests.get("https://pipatlas.com/api/calendar", timeout=10).json()
high = [e for e in d.get("events", []) if e.get("impact") == "High"]
for e in high[:5]:
    print(e["date"], e["currency"], e["name"])

Also available, without code