Angolin Docs

Universe endpoint

The historical universe of an exchange: which pairs it listed against a quote, and when, delisted pairs included. Use it to backtest on what was tradable back then rather than on today's survivors. It is the same data as the Periods download. Authenticated with X-API-Key, see Authentication.

Conventions

  • Unlike the other /v1 endpoints, a successful response is an object, not a bare array: the periods come with known_until, which says how far the universe is known.
  • There is no pagination. A call returns every matching period at once: a few hundred to a few thousand (about 750 for Binance USDT, around 70 KB).
  • A period runs from listed_from (inclusive) to listed_until (exclusive), both on the hour, UTC. There is one period per actual listing: a pair has several only if it was delisted and listed again, always with a gap in between. Periods are sorted by base, then listed_from.
  • start and end keep the periods that overlap the window, both bounds inclusive, with their real bounds: a period is not cut to the window.
  • Your plan's history depth applies as for OHLCV: a start before it is a 403. Without start, the periods are cut at that depth: a period running across it starts there.
  • Calls are counted in your usage under exchange_universe, like the OHLCV endpoints.

GET /v1/exchange_universe

The listing periods of every pair an exchange listed against one quote, or of one pair with base. A base with no period is not an error: the response has an empty periods.

ParameterTypeRequiredDescription
exchangestringYesExchange natural key, e.g. "binance". There is no aggregated universe: a listing is a per-exchange fact.
quotestringYesQuote asset ticker, e.g. "USDT". One quote per call.
basestringNoBase asset ticker, e.g. "LUNA". Only that pair's periods. Omit for every pair listed against the quote.
startdatetime (ISO 8601)NoOnly periods still listed at or after start. A datetime without a timezone is UTC.
enddatetime (ISO 8601)NoOnly periods listed at or before end. A datetime without a timezone is UTC.
curl "https://api.angolin.com/v1/exchange_universe?exchange=binance&quote=USDT&base=LUNC" \
  -H "X-API-Key: YOUR_API_KEY"
{
  "exchange": "binance",
  "quote": "USDT",
  "known_until": "2026-10-30T00:00:00Z",
  "periods": [
    {
      "base": "LUNC",
      "quote": "USDT",
      "listed_from": "2020-08-21T10:00:00Z",
      "listed_until": "2022-05-13T01:00:00Z"
    },
    {
      "base": "LUNC",
      "quote": "USDT",
      "listed_from": "2022-09-09T08:00:00Z",
      "listed_until": null
    }
  ]
}

Response

FieldTypeDescription
exchangestringThe exchange asked for.
quotestringThe quote asked for.
known_untildatetimeHow far the universe is known: the last midnight UTC our daily processing has reached.
periods[].basestringThe listed asset (LUNA for LUNA/USDT).
periods[].quotestringThe quote asset, the same as the top-level quote.
periods[].listed_fromdatetimeFirst hour the pair was tradable, inclusive.
periods[].listed_untildatetime | nullEnd of the last tradable hour, exclusive. null while the pair is still listed, i.e. at least until known_until.

A null listed_until doesn't mean the pair is listed today, only that it still was at known_until. A delisting after that shows up once our daily processing has reached it.

Pairs listed at a given time

Set start and end to the same instant: the periods that overlap it are the pairs listed then.

curl "https://api.angolin.com/v1/exchange_universe?exchange=binance&quote=USDT&start=2022-05-13T12:00:00Z&end=2022-05-13T12:00:00Z" \
  -H "X-API-Key: YOUR_API_KEY"

Unknown exchanges and quotes the exchange never listed are 404s; see Errors & rate limits. To find valid values first, use the public Catalog endpoints.