Create a Sheet definition.
Creates a root-level Sheet (ADR-0031). Stores only metadata — no row data. kind must be standard (a manual mapping table) — standard is the only creatable kind today. kind: linked and any non-empty seedQuery are REJECTED with 400 (DVT-2928): the legacy seed-copy shape (a linked sheet materialized once from seedQuery) never had a working execution path and is retired. linked is reserved for a future live-join sheet surface (DVT-2932) with different semantics — not yet ratified. If connectionId is provided it must reference a connection with kind: writeback; a pushdown connection is rejected with 400 (DVT-904). In the Snowflake Native App, connectionId may be omitted — it auto-binds to the boot-provisioned Host Snowflake Writeback connection (ADR-0077 r3, DVT-2905), which requires an admin to have provisioned its in-account dvt_writeback database first (Sheets page → Set up writeback).
Changed 2026-08-10: columns names must be unique when matched case-insensitively, and a definition that breaks this is rejected with 400 (DVT-2476). Declaring both Title and title was previously accepted and has no defined meaning: the warehouse's quoted identifiers are case-sensitive, so the two are distinct names there, while every lookup around them collapses the pair to a single entry — the server's type check, the engine's projection, and the warehouse catalog the flush reconciles against.
Depending on the two declared types, the warehouse, and the target table's current columns, such a sheet either fails every flush that carries an upsert, or flushes while writing the same submitted value into both columns. Where the two exist in the table with different types AND both declared types are accepted against the column dvt matches them to, the outcome is value-dependent: a flush that succeeded for earlier rows can start failing on a later value that only one of the two accepts — so rows may already have been written before the sheet jams — and where both accept it, the two can hold values that differ by the warehouse's own coercion. Once a flush fails it keeps failing until the definition is repaired.
A definition that repeats a name exactly, rather than differing only in case, declares one column twice rather than two columns, and no batch containing an upsert can ever flush.
(Only Postgres and Snowflake reach these outcomes. A Redshift sheet reaches none of them: the flusher skips Redshift connections before the table is created, so nothing is written and nothing fails. Every other warehouse type is rejected outright by the engine's writeback gate.) Existing sheets are not migrated — appending to one that is already in this state returns 400 until it is corrected here or via PATCH /v1/sheets/{sheetId}.
Request
- Base URL: http://localhost:8080
- URL: http://localhost:8080/v1/sheets
- Auth: one of:
- API key in cookie dvt_session
- HTTP bearer
Query parameters
Optional change note recorded as this revision's summary (≤280 chars); when absent the server writes a default summary. May also be supplied via the X-Dvt-Change-Reason header. Over-cap values return 400.
Request body
Response
Sheet created.
Changes
No recorded changes to this operation across all 1 revision of this API.