---
title: "Get Dataset Endpoint"
method: GET
path: "/api/v2/datasets/{name}"
tags: ["APPS_V2"]
---

# Get Dataset Endpoint

`GET /api/v2/datasets/{name}`

Return a single dataset's descriptor.

Resolved via `visible_dataset` — the SAME platform-visibility gate `POST
/datasets/{name}/query` uses — so a dataset registered for another
platform 404s (`DATASET_NOT_FOUND`) rather than confirming its existence
to a tenant on the wrong platform. Route ordering matters here: this
route is declared AFTER `GET /datasets` (the bare-path list endpoint)
but that is not what prevents shadowing — `/datasets/{name}` requires an
extra path segment that a request for plain `/datasets` never supplies,
so the two can never collide regardless of registration order. Verified
by the throwaway script's `TestClient` check that both still resolve.

## Path parameters

- `name` string, required

## Headers

- `x-tenant` string, required
- `x-user-group-id` string, nullable
- `x-timezone` string, nullable

## Response `200`

Successful Response

- DatasetDescriptor — Public projection of a `DatasetSpec`. Column-level capabilities (`sortable`/`filterable`/`searchable`/...) are fully published per-column via `ColumnDescriptor`. These three fields are the DATASET-level counterpart — without them a client cannot tell which top-level request fields this dataset actually honours versus silently ignores; both are the same status code (200) and the same shape of envelope either way, so there is no other way to find out short of reading the `build` SQL. `paginated`: governs `DatasetQueryRequest.page`/`size`. `True` means those fields select which page of rows comes back and `DatasetMeta.total`/`pages` are populated. `False` means `page`/`size` are IGNORED — the dataset's own SQL renders a plain `LIMIT`, and every request returns the same first slice regardless of what `page` was sent. `time_bounded`: governs `DatasetQueryRequest.start_date`/`end_date`. `True` means those fields scope the query's time window. `False` means they are IGNORED — the dataset's source table has no time dimension at all (a precomputed rollup, where the period IS the table), so every window requested returns identical rows. `searchable`: whether at least one column declares `searchable=True`. `True` tells the client it may render a free-text search box for this dataset. `False` means `DatasetQueryRequest.search` is not silently ignored — a non-blank value is rejected with 400 — but the client should not offer the control in the first place. `downloadable`: mirrors `DatasetSpec.downloadable`. `True` means `POST /datasets/{name}/export` will serve this dataset as a CSV download — the frontend should render the Download button. `False` (the default for every dataset that hasn't opted in) means that same endpoint refuses with 400 `DATASET_NOT_DOWNLOADABLE`, so the client should not render the button in the first place.
  - `name` string, required
  - `label` string, required
  - `platform` string, required
  - `filters` FilterDescriptor[], required
    - `key` string, required
    - `label` string, required
    - `listable` boolean, required
    - `options` OptionDescriptor[], nullable
      - `value` string, required
      - `label` string, nullable
  - `columns` ColumnDescriptor[], required
    - `key` string, required
    - `label` string, required
    - `type` string, required
    - `unit` string, nullable
    - `sortable` boolean, required
    - `filterable` boolean, required
    - `searchable` boolean, required
    - `hideable` boolean, required
    - `hidden_by_default` boolean, required
    - `info` string, nullable
    - `edit` EditDescriptor
      - `action` string, required
      - `options_from` string, nullable
    - `header` boolean, required
    - `link` LinkDescriptor — Wire form of `apps.specs.links.LinkSpec` — the in-app route template a header (or other) column's row value resolves into, per that module's docstring.
      - `template` string, required
    - `icon` string, nullable
    - `decoration` DecorationDescriptor — Wire form of `apps.specs.decorations.Decoration` — see that module's docstring for the core design rule (semantic `Tone`, never a colour) this descriptor carries onto the wire unchanged.
      - `display` string, required
      - `tone` string, nullable
      - `values` ValueStyleDescriptor[], required
        - `value` string, required
        - `tone` string, required
        - `label` string, nullable
        - `icon` string, nullable
      - `thresholds` ThresholdDescriptor[], required
        - `tone` string, required
        - `min` number, nullable
        - `max` number, nullable
    - `compose` ComposeDescriptor — Wire form of `apps.specs.compose.ComposeSpec` — the stacked-cell declaration on a composed column. `show_value` renders the composed column's own value as the leading line; `badge` names a sibling BADGE-decorated column whose badge renders under the lines.
      - `lines` ComposeLineDescriptor[], required
        - `parts` ComposePartDescriptor[], required
          - `column` string, required
          - `tone` string, nullable
        - `label` string, nullable
        - `separator` string
        - `when` ComposeWhenDescriptor — Wire form of `apps.specs.compose.ComposeWhen` — render the line only when the row's `column` value equals `equals` (string comparison).
          - `column` string, required
          - `equals` string, required
      - `badge` string, nullable
      - `show_value` boolean
    - `internal` boolean
    - `order` integer, required
  - `row_key` string[], required
  - `paginated` boolean, required
  - `time_bounded` boolean, required
  - `searchable` boolean, required
  - `downloadable` boolean, required
  - `related` RelatedDescriptor, required — Wire form of `apps.catalog.relations.RelatedNames` — the symmetrised page-affinity edges of one dataset/chart/summary, split by kind. This module owns no catalog lookups (see the module docstring's import rules), so nothing here builds a `RelatedDescriptor` from a `RelatedNames` — that projection lives in `apps.api.serializers`, the layer that already resolves `apps.catalog.RELATIONS`.
    - `datasets` string[], required
    - `charts` string[], required
    - `summaries` string[], required

## Other responses

- `403` — Not supported for public user
- `422` — Validation Error

---

[API](https://skmtc.net/myaltimate/apis/fastapi.md) · [All operations](https://skmtc.net/myaltimate/apis/fastapi/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/myaltimate/fastapi/revisions/33e87d9898ad/schema)
