Quickstart

Make your first request and read the response.

Fetch current halts

curl https://upcuit.com/api/v1/halts

Response shape

A { data, meta } envelope — data is the list of halts, meta carries freshness.

{
  "api_version": 1,
  "data": [
    {
      "symbol": "ABCD",
      "name": "Example Corp",
      "market": "NASDAQ",
      "status": "halted",
      "reasons": [{ "code": "LUDP", "title": "Volatility Trading Pause" }],
      "pause_threshold_price": 12.34,
      "halted_at": "2026-06-11T13:30:05-04:00",
      "halted_at_epoch_ms": 1781112605000,
      "halted_at_local": { "date": "06/11/2026", "time": "13:30:05", "tz": "America/New_York" },
      "resumed_at": null,
      "resumed_at_epoch_ms": null,
      "resumed_at_local": null,
      "quote_resumed_at": null,
      "quote_resumed_at_epoch_ms": null
    }
  ],
  "meta": {
    "generated_at": "2026-06-11T17:30:08Z",
    "fetched_at": "2026-06-11T17:30:06Z",
    "data_changed_at": "2026-06-11T17:29:55Z",
    "data_age_ms": 2000,
    "stale": false,
    "count": 1,
    "source": "nasdaq"
  }
}

Conditional requests

Each list response carries an ETag. Send it back to skip an unchanged payload:

curl -H 'If-None-Match: "v1-..."' https://upcuit.com/api/v1/halts   # -> 304 when unchanged

Polling

Poll no faster than every ~3 seconds — responses are edge-cached, so faster polling returns identical data. Read meta.stale and meta.data_age_ms to judge freshness.