Notes
A few smaller behaviors worth knowing — long-running sessions, local-only operations, the public/gated split, and versioning.
Long-running sessions
Access to a dataset's underlying data is set up lazily — only once you
actually read rows, not at load_dataset() — and refreshes itself
automatically if it lapses mid-session. You don't need to handle this
yourself; a session that stays open for hours won't stall or need
re-authenticating.
Local-only operations
Some operations never touch the network, so they work instantly and never need an API key:
.describe()and.summary()summarize the metadataload_dataset()already fetched..describe()returns aDescribeTable(bordered text/HTML display, no pandas required) — call.to_frame()on it for a realpandas.DataFrame..summary()returns aSummary(same bordered text/HTML display) with name, slug, description, AI insights, a link to the dataset's Aesops page, and any linked community discussions.- Format conversion (CSV, Arrow, etc.) happens entirely on your machine once the data's been loaded — no extra wait on anything server-side.
Public catalog, gated data
list() and load_dataset() always work without an api_key — the full
catalog and every dataset's metadata are public. Loading actual data
(.to_pandas(), .to_polars(), .to_duckdb(), .sql(), .to_csv())
requires a key unless the dataset is currently keyless (ds.keyless). See
Loading data and
Authentication.
Versioning
Datasets are always served at their latest active version — there's no version pinning.