---
title: "List the organization's uploaded CSV data sources."
method: GET
path: "/v1/uploads"
tags: ["uploads"]
---

# List the organization's uploaded CSV data sources.

`GET /v1/uploads`

## Request

- Base URL: `http://localhost:8080`
- URL: `http://localhost:8080/v1/uploads`
- Auth: one of:
  - API key in cookie `dvt_session`
  - HTTP bearer

Returns the org's uploaded (`platform_managed`) sources, newest first. Items share
the same field shapes as the `POST /v1/uploads` 201 body (`data`). The `data`
array is always present (never null; an empty org gets `"data": []`).

**Auth:** Requires `connection:manage` scope (admin or owner role) — same
entitlement gate as `POST /v1/uploads` and `DELETE /v1/uploads/{id}`. Unlike
`POST /v1/uploads`, this endpoint is **not** restricted to active trials — it lists
already-persisted rows regardless of the org's current trial status.

## Response `200`

The org's uploaded CSV data sources.

- object
  - `data` UploadedSource[], required
    - `id` string, uuid, required: The data source row UUID. This is the database primary key — not the query handle. Use `name` (not `id`) as `sourceId` in `POST /v1/data/query`.
    - `name` string, required: The source name derived from the uploaded filename (without extension). This is the query handle: use this value as `sourceId` in `POST /v1/data/query`. The query path resolves sources by name within the org, not by id.
    - `type` 'parquet_s3', required: Always `parquet_s3` for uploaded sources.
    - `columns` object[], required: Schema inferred by the engine from the CSV header row.
      - `name` string
      - `type` string
    - `createdAt` string, date-time, required
  - `meta` Meta, required: Response metadata.
    - `requestId` string, required: Correlates with the X-Request-Id header.
    - `total` integer: Item count, present on collection responses.
    - `nextCursor` string, nullable: Opaque keyset-pagination cursor, present on paginated responses (e.g. GET /v1/dashboards) when more rows exist beyond this page. Pass it back as the `cursor` query param to fetch the next page; absent or null on the last page.
    - `roleResolveDegraded` boolean: Snowflake mode only (DVT-2260), on GET /v1/dashboards: present and true when the caller's live Snowflake role resolution failed or was unavailable — role-shared dashboards may be missing from this page. Omitted (not merely false) whenever resolution succeeded or the role-share arm does not apply (off snowflake mode, an org admin/owner, or off the ingress listener).

## Other responses

- `401`: Missing, invalid, or expired session.
- `403`: The caller's role does not permit this action.

---

[API](https://skmtc.dev/dvt/apis/dvt-rest-api.md) · [All operations](https://skmtc.dev/dvt/apis/dvt-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/dvt/apis/dvt-rest-api/revisions/00016f504165?raw)
