---
title: "Create dashboard"
method: POST
path: "/api/v1/projects/{projectUuid}/dashboards"
tags: ["Projects"]
---

# Create dashboard

`POST /api/v1/projects/{projectUuid}/dashboards`

Create a new dashboard in a project

## Path parameters

- `projectUuid` string, required

## Query parameters

- `duplicateFrom` string

## Request body

- union
  - DuplicateDashboardParams
    - `dashboardDesc` string, required
    - `dashboardName` string, required
  - CreateDashboard
    - `colorPaletteUuid` string, nullable
    - `config` DashboardConfig
      - `requiredFiltersNote` string — Editor-authored note shown to viewers while filter rules are unmet
      - `dateZoomConfig` DateZoomConfig
        - `tileTargets` RecordStringDateZoomTileTarget, required — Construct a type with a set of properties K of type T
        - `controls` DateZoomControl[], required
          - `hidden` boolean
          - `granularity` union, required
            - 'Second' | 'Minute' | 'Hour' | 'Day' | 'Week' | 'Month' | 'Quarter' | 'Year'
            - string
          - `name` string, required
          - `uuid` string, required
      - `defaultDateZoomGranularity` union
        - 'Second' | 'Minute' | 'Hour' | 'Day' | 'Week' | 'Month' | 'Quarter' | 'Year'
        - string
      - `dateZoomGranularities` union[]
        - union
          - 'Second' | 'Minute' | 'Hour' | 'Day' | 'Week' | 'Month' | 'Quarter' | 'Year'
          - string
      - `parameterOrder` string[]
      - `pinnedParameters` string[]
      - `isAddFilterDisabled` boolean
      - `isDateZoomDisabled` boolean, required
    - `tabs` DashboardTab[], required
      - `hidden` boolean
      - `order` number, double, required
      - `name` string, required
      - `uuid` string, required
    - `spaceUuid` string
    - `updatedByUser` PickUpdatedByUserUserUuid — From T, pick a set of properties whose keys are in the union K
      - `userUuid` string, required
    - `pinnedParameters` string[]
    - `parameters` DashboardParameters — Construct a type with a set of properties K of type T
    - `filters` DashboardFilters
      - `tableCalculations` DashboardFilterRule[], required
        - `includeNull` boolean — For the `equals` operator on string fields, also match rows where the field is null (compiles to `field IN (...) OR field IS NULL`). Lets users combine null with selected values in a single "is" rule.
        - `values` AnyType[] — Values to filter by
          - unknown
        - `operator` 'isNull' | 'notNull' | 'equals' | 'notEquals' | 'startsWith' | 'endsWith' | 'include' | 'doesNotInclude' | 'lessThan' | 'lessThanOrEqual' | 'greaterThan' | 'greaterThanOrEqual' | 'inThePast' | 'notInThePast' | 'inTheNext' | 'inTheCurrent' | 'notInTheCurrent' | 'inBetween' | 'notInBetween' | 'inPeriodToDate', required
        - `id` string, required — Unique identifier for the filter
        - `target` DashboardFieldTarget, required
          - `fallbackType` 'string' | 'number' | 'timestamp' | 'date' | 'boolean'
          - `isSqlColumn` boolean
          - `tableName` string, required
          - `fieldId` string, required
        - `settings` unknown
        - `disabled` boolean — Whether this filter is disabled
        - `required` boolean — Whether this filter is required
        - `caseSensitive` boolean — Overrides the field/explore case-sensitivity for this rule only. Used by internal features like autocomplete search that must always match case-insensitively regardless of the field's configured setting.
        - `lockedTabUuids` string[] — Tab UUIDs where this filter is locked. When the active tab is in this list, viewers see the filter but cannot change it, and URL / embed filter overrides targeting the same field are ignored on that tab. Empty or omitted means the filter is not locked anywhere.
        - `requiredGroupId` string — Dashboard filters sharing a requiredGroupId form an "any-one required" group: the dashboard is locked until at least one member has a value.
        - `singleValue` boolean
        - `label` string
        - `tileTargets` DashboardTileTargets — Deliberately an index-signature literal, not `Record<string, ...>`. When TSOA first resolves `Record<string, DashboardTileTarget>` inside a mapped type (e.g. `Omit<DashboardFilterRule, 'id'>` in content-as-code types), it caches an EMPTY model under the shared `Record_string.DashboardTileTarget_` name, and request validation then strips every tileTargets entry from bodies — silently breaking dashboard filters on SQL chart tiles. The index-signature form resolves correctly in every context.
      - `metrics` DashboardFilterRule[], required
        - `includeNull` boolean — For the `equals` operator on string fields, also match rows where the field is null (compiles to `field IN (...) OR field IS NULL`). Lets users combine null with selected values in a single "is" rule.
        - `values` AnyType[] — Values to filter by
          - unknown
        - `operator` 'isNull' | 'notNull' | 'equals' | 'notEquals' | 'startsWith' | 'endsWith' | 'include' | 'doesNotInclude' | 'lessThan' | 'lessThanOrEqual' | 'greaterThan' | 'greaterThanOrEqual' | 'inThePast' | 'notInThePast' | 'inTheNext' | 'inTheCurrent' | 'notInTheCurrent' | 'inBetween' | 'notInBetween' | 'inPeriodToDate', required
        - `id` string, required — Unique identifier for the filter
        - `target` DashboardFieldTarget, required
          - `fallbackType` 'string' | 'number' | 'timestamp' | 'date' | 'boolean'
          - `isSqlColumn` boolean
          - `tableName` string, required
          - `fieldId` string, required
        - `settings` unknown
        - `disabled` boolean — Whether this filter is disabled
        - `required` boolean — Whether this filter is required
        - `caseSensitive` boolean — Overrides the field/explore case-sensitivity for this rule only. Used by internal features like autocomplete search that must always match case-insensitively regardless of the field's configured setting.
        - `lockedTabUuids` string[] — Tab UUIDs where this filter is locked. When the active tab is in this list, viewers see the filter but cannot change it, and URL / embed filter overrides targeting the same field are ignored on that tab. Empty or omitted means the filter is not locked anywhere.
        - `requiredGroupId` string — Dashboard filters sharing a requiredGroupId form an "any-one required" group: the dashboard is locked until at least one member has a value.
        - `singleValue` boolean
        - `label` string
        - `tileTargets` DashboardTileTargets — Deliberately an index-signature literal, not `Record<string, ...>`. When TSOA first resolves `Record<string, DashboardTileTarget>` inside a mapped type (e.g. `Omit<DashboardFilterRule, 'id'>` in content-as-code types), it caches an EMPTY model under the shared `Record_string.DashboardTileTarget_` name, and request validation then strips every tileTargets entry from bodies — silently breaking dashboard filters on SQL chart tiles. The index-signature form resolves correctly in every context.
      - `dimensions` DashboardFilterRule[], required
        - `includeNull` boolean — For the `equals` operator on string fields, also match rows where the field is null (compiles to `field IN (...) OR field IS NULL`). Lets users combine null with selected values in a single "is" rule.
        - `values` AnyType[] — Values to filter by
          - unknown
        - `operator` 'isNull' | 'notNull' | 'equals' | 'notEquals' | 'startsWith' | 'endsWith' | 'include' | 'doesNotInclude' | 'lessThan' | 'lessThanOrEqual' | 'greaterThan' | 'greaterThanOrEqual' | 'inThePast' | 'notInThePast' | 'inTheNext' | 'inTheCurrent' | 'notInTheCurrent' | 'inBetween' | 'notInBetween' | 'inPeriodToDate', required
        - `id` string, required — Unique identifier for the filter
        - `target` DashboardFieldTarget, required
          - `fallbackType` 'string' | 'number' | 'timestamp' | 'date' | 'boolean'
          - `isSqlColumn` boolean
          - `tableName` string, required
          - `fieldId` string, required
        - `settings` unknown
        - `disabled` boolean — Whether this filter is disabled
        - `required` boolean — Whether this filter is required
        - `caseSensitive` boolean — Overrides the field/explore case-sensitivity for this rule only. Used by internal features like autocomplete search that must always match case-insensitively regardless of the field's configured setting.
        - `lockedTabUuids` string[] — Tab UUIDs where this filter is locked. When the active tab is in this list, viewers see the filter but cannot change it, and URL / embed filter overrides targeting the same field are ignored on that tab. Empty or omitted means the filter is not locked anywhere.
        - `requiredGroupId` string — Dashboard filters sharing a requiredGroupId form an "any-one required" group: the dashboard is locked until at least one member has a value.
        - `singleValue` boolean
        - `label` string
        - `tileTargets` DashboardTileTargets — Deliberately an index-signature literal, not `Record<string, ...>`. When TSOA first resolves `Record<string, DashboardTileTarget>` inside a mapped type (e.g. `Omit<DashboardFilterRule, 'id'>` in content-as-code types), it caches an EMPTY model under the shared `Record_string.DashboardTileTarget_` name, and request validation then strips every tileTargets entry from bodies — silently breaking dashboard filters on SQL chart tiles. The index-signature form resolves correctly in every context.
    - `tiles` union[], required
      - union
        - CreateDashboardChartTile
          - `tabUuid` string, nullable
          - `w` number, double, required
          - `h` number, double, required
          - `y` number, double, required
          - `x` number, double, required
          - `type` 'saved_chart', required
          - `uuid` string
          - `properties` object, required
            - `chartSlug` string, nullable
            - `lastVersionChartKind` 'line' | 'horizontal_bar' | 'vertical_bar' | 'scatter' | 'area' | 'mixed' | 'pie' | 'table' | 'big_number' | 'funnel' | 'custom' | 'treemap' | 'gauge' | 'map' | 'sankey' | 'data_app_viz'
            - `chartName` string, nullable
            - `belongsToDashboard` boolean
            - `savedChartUuid` string, nullable, required
            - `hideTitle` boolean
            - `title` string
        - CreateDashboardMarkdownTile
          - `tabUuid` string, nullable
          - `w` number, double, required
          - `h` number, double, required
          - `y` number, double, required
          - `x` number, double, required
          - `type` 'markdown', required
          - `uuid` string
          - `properties` object, required
            - `hideFrame` boolean
            - `content` string, required
            - `title` string, required
        - CreateDashboardLoomTile
          - `tabUuid` string, nullable
          - `w` number, double, required
          - `h` number, double, required
          - `y` number, double, required
          - `x` number, double, required
          - `type` 'loom', required
          - `uuid` string
          - `properties` object, required
            - `url` string, required
            - `hideTitle` boolean
            - `title` string, required
        - CreateDashboardSqlChartTile
          - `tabUuid` string, nullable
          - `w` number, double, required
          - `h` number, double, required
          - `y` number, double, required
          - `x` number, double, required
          - `type` 'sql_chart', required
          - `uuid` string
          - `properties` object, required
            - `chartSlug` string, nullable
            - `hideTitle` boolean
            - `chartName` string, required
            - `savedSqlUuid` string, nullable, required
            - `title` string
        - CreateDashboardHeadingTile
          - `tabUuid` string, nullable
          - `w` number, double, required
          - `h` number, double, required
          - `y` number, double, required
          - `x` number, double, required
          - `type` 'heading', required
          - `uuid` string
          - `properties` object, required
            - `showDivider` boolean
            - `text` string, required
            - `title` unknown
        - CreateDashboardDataAppTile
          - `tabUuid` string, nullable
          - `w` number, double, required
          - `h` number, double, required
          - `y` number, double, required
          - `x` number, double, required
          - `type` 'data_app', required
          - `uuid` string
          - `properties` object, required
            - `appDeletedAt` string, nullable
            - `appUuid` string, required
            - `hideTitle` boolean
            - `title` string, required
    - `description` string
    - `name` string, required

## Response `201`

Created

- ApiCreateDashboardResponse
  - `results` Dashboard, required
    - `deletedBy` object, nullable
      - `lastName` string, required
      - `firstName` string, required
      - `userUuid` string, required
    - `deletedAt` string, date-time
    - `colorPaletteUuid` string, nullable, required
    - `config` DashboardConfig
      - `requiredFiltersNote` string — Editor-authored note shown to viewers while filter rules are unmet
      - `dateZoomConfig` DateZoomConfig
        - `tileTargets` RecordStringDateZoomTileTarget, required — Construct a type with a set of properties K of type T
        - `controls` DateZoomControl[], required
          - `hidden` boolean
          - `granularity` union, required
            - 'Second' | 'Minute' | 'Hour' | 'Day' | 'Week' | 'Month' | 'Quarter' | 'Year'
            - string
          - `name` string, required
          - `uuid` string, required
      - `defaultDateZoomGranularity` union
        - 'Second' | 'Minute' | 'Hour' | 'Day' | 'Week' | 'Month' | 'Quarter' | 'Year'
        - string
      - `dateZoomGranularities` union[]
        - union
          - 'Second' | 'Minute' | 'Hour' | 'Day' | 'Week' | 'Month' | 'Quarter' | 'Year'
          - string
      - `parameterOrder` string[]
      - `pinnedParameters` string[]
      - `isAddFilterDisabled` boolean
      - `isDateZoomDisabled` boolean, required
    - `slug` string, required
    - `access` SpaceAccess[], nullable, required
      - `inheritedFrom` 'organization' | 'project' | 'group' | 'space_group' | 'parent_space'
      - `inheritedRole` union
        - 'member' | 'viewer' | 'interactive_viewer' | 'editor' | 'developer' | 'admin'
        - 'viewer' | 'interactive_viewer' | 'editor' | 'developer' | 'admin'
      - `projectRole` 'viewer' | 'interactive_viewer' | 'editor' | 'developer' | 'admin'
      - `hasDirectAccess` boolean, required
      - `role` 'viewer' | 'editor' | 'admin', required
      - `userUuid` string, required
    - `inheritsFromOrgOrProject` boolean, required
    - `tabs` DashboardTab[], required
      - `hidden` boolean
      - `order` number, double, required
      - `name` string, required
      - `uuid` string, required
    - `pinnedListOrder` number, double, nullable, required
    - `pinnedListUuid` string, nullable, required
    - `firstViewedAt` union, required
      - string, date-time
      - string
    - `views` number, double, required
    - `spaceName` string, required
    - `spaceUuid` string, required
    - `updatedByUser` UpdatedByUser
      - `userUuid` string, required
      - `firstName` string, required
      - `lastName` string, required
    - `parameters` DashboardParameters — Construct a type with a set of properties K of type T
    - `filters` DashboardFilters, required
      - `tableCalculations` DashboardFilterRule[], required
        - `includeNull` boolean — For the `equals` operator on string fields, also match rows where the field is null (compiles to `field IN (...) OR field IS NULL`). Lets users combine null with selected values in a single "is" rule.
        - `values` AnyType[] — Values to filter by
          - unknown
        - `operator` 'isNull' | 'notNull' | 'equals' | 'notEquals' | 'startsWith' | 'endsWith' | 'include' | 'doesNotInclude' | 'lessThan' | 'lessThanOrEqual' | 'greaterThan' | 'greaterThanOrEqual' | 'inThePast' | 'notInThePast' | 'inTheNext' | 'inTheCurrent' | 'notInTheCurrent' | 'inBetween' | 'notInBetween' | 'inPeriodToDate', required
        - `id` string, required — Unique identifier for the filter
        - `target` DashboardFieldTarget, required
          - `fallbackType` 'string' | 'number' | 'timestamp' | 'date' | 'boolean'
          - `isSqlColumn` boolean
          - `tableName` string, required
          - `fieldId` string, required
        - `settings` unknown
        - `disabled` boolean — Whether this filter is disabled
        - `required` boolean — Whether this filter is required
        - `caseSensitive` boolean — Overrides the field/explore case-sensitivity for this rule only. Used by internal features like autocomplete search that must always match case-insensitively regardless of the field's configured setting.
        - `lockedTabUuids` string[] — Tab UUIDs where this filter is locked. When the active tab is in this list, viewers see the filter but cannot change it, and URL / embed filter overrides targeting the same field are ignored on that tab. Empty or omitted means the filter is not locked anywhere.
        - `requiredGroupId` string — Dashboard filters sharing a requiredGroupId form an "any-one required" group: the dashboard is locked until at least one member has a value.
        - `singleValue` boolean
        - `label` string
        - `tileTargets` DashboardTileTargets — Deliberately an index-signature literal, not `Record<string, ...>`. When TSOA first resolves `Record<string, DashboardTileTarget>` inside a mapped type (e.g. `Omit<DashboardFilterRule, 'id'>` in content-as-code types), it caches an EMPTY model under the shared `Record_string.DashboardTileTarget_` name, and request validation then strips every tileTargets entry from bodies — silently breaking dashboard filters on SQL chart tiles. The index-signature form resolves correctly in every context.
      - `metrics` DashboardFilterRule[], required
        - `includeNull` boolean — For the `equals` operator on string fields, also match rows where the field is null (compiles to `field IN (...) OR field IS NULL`). Lets users combine null with selected values in a single "is" rule.
        - `values` AnyType[] — Values to filter by
          - unknown
        - `operator` 'isNull' | 'notNull' | 'equals' | 'notEquals' | 'startsWith' | 'endsWith' | 'include' | 'doesNotInclude' | 'lessThan' | 'lessThanOrEqual' | 'greaterThan' | 'greaterThanOrEqual' | 'inThePast' | 'notInThePast' | 'inTheNext' | 'inTheCurrent' | 'notInTheCurrent' | 'inBetween' | 'notInBetween' | 'inPeriodToDate', required
        - `id` string, required — Unique identifier for the filter
        - `target` DashboardFieldTarget, required
          - `fallbackType` 'string' | 'number' | 'timestamp' | 'date' | 'boolean'
          - `isSqlColumn` boolean
          - `tableName` string, required
          - `fieldId` string, required
        - `settings` unknown
        - `disabled` boolean — Whether this filter is disabled
        - `required` boolean — Whether this filter is required
        - `caseSensitive` boolean — Overrides the field/explore case-sensitivity for this rule only. Used by internal features like autocomplete search that must always match case-insensitively regardless of the field's configured setting.
        - `lockedTabUuids` string[] — Tab UUIDs where this filter is locked. When the active tab is in this list, viewers see the filter but cannot change it, and URL / embed filter overrides targeting the same field are ignored on that tab. Empty or omitted means the filter is not locked anywhere.
        - `requiredGroupId` string — Dashboard filters sharing a requiredGroupId form an "any-one required" group: the dashboard is locked until at least one member has a value.
        - `singleValue` boolean
        - `label` string
        - `tileTargets` DashboardTileTargets — Deliberately an index-signature literal, not `Record<string, ...>`. When TSOA first resolves `Record<string, DashboardTileTarget>` inside a mapped type (e.g. `Omit<DashboardFilterRule, 'id'>` in content-as-code types), it caches an EMPTY model under the shared `Record_string.DashboardTileTarget_` name, and request validation then strips every tileTargets entry from bodies — silently breaking dashboard filters on SQL chart tiles. The index-signature form resolves correctly in every context.
      - `dimensions` DashboardFilterRule[], required
        - `includeNull` boolean — For the `equals` operator on string fields, also match rows where the field is null (compiles to `field IN (...) OR field IS NULL`). Lets users combine null with selected values in a single "is" rule.
        - `values` AnyType[] — Values to filter by
          - unknown
        - `operator` 'isNull' | 'notNull' | 'equals' | 'notEquals' | 'startsWith' | 'endsWith' | 'include' | 'doesNotInclude' | 'lessThan' | 'lessThanOrEqual' | 'greaterThan' | 'greaterThanOrEqual' | 'inThePast' | 'notInThePast' | 'inTheNext' | 'inTheCurrent' | 'notInTheCurrent' | 'inBetween' | 'notInBetween' | 'inPeriodToDate', required
        - `id` string, required — Unique identifier for the filter
        - `target` DashboardFieldTarget, required
          - `fallbackType` 'string' | 'number' | 'timestamp' | 'date' | 'boolean'
          - `isSqlColumn` boolean
          - `tableName` string, required
          - `fieldId` string, required
        - `settings` unknown
        - `disabled` boolean — Whether this filter is disabled
        - `required` boolean — Whether this filter is required
        - `caseSensitive` boolean — Overrides the field/explore case-sensitivity for this rule only. Used by internal features like autocomplete search that must always match case-insensitively regardless of the field's configured setting.
        - `lockedTabUuids` string[] — Tab UUIDs where this filter is locked. When the active tab is in this list, viewers see the filter but cannot change it, and URL / embed filter overrides targeting the same field are ignored on that tab. Empty or omitted means the filter is not locked anywhere.
        - `requiredGroupId` string — Dashboard filters sharing a requiredGroupId form an "any-one required" group: the dashboard is locked until at least one member has a value.
        - `singleValue` boolean
        - `label` string
        - `tileTargets` DashboardTileTargets — Deliberately an index-signature literal, not `Record<string, ...>`. When TSOA first resolves `Record<string, DashboardTileTarget>` inside a mapped type (e.g. `Omit<DashboardFilterRule, 'id'>` in content-as-code types), it caches an EMPTY model under the shared `Record_string.DashboardTileTarget_` name, and request validation then strips every tileTargets entry from bodies — silently breaking dashboard filters on SQL chart tiles. The index-signature form resolves correctly in every context.
    - `tiles` DashboardTile[], required
      - union
        - DashboardChartTile — Make all properties in T required
          - `uuid` string, required
          - `type` 'saved_chart', required
          - `x` number, double, required
          - `y` number, double, required
          - `h` number, double, required
          - `w` number, double, required
          - `tabUuid` string, nullable
          - `properties` object, required
            - `chartSlug` string, nullable
            - `lastVersionChartKind` 'line' | 'horizontal_bar' | 'vertical_bar' | 'scatter' | 'area' | 'mixed' | 'pie' | 'table' | 'big_number' | 'funnel' | 'custom' | 'treemap' | 'gauge' | 'map' | 'sankey' | 'data_app_viz'
            - `chartName` string, nullable
            - `belongsToDashboard` boolean
            - `savedChartUuid` string, nullable, required
            - `hideTitle` boolean
            - `title` string
        - DashboardMarkdownTile — Make all properties in T required
          - `uuid` string, required
          - `type` 'markdown', required
          - `x` number, double, required
          - `y` number, double, required
          - `h` number, double, required
          - `w` number, double, required
          - `tabUuid` string, nullable
          - `properties` object, required
            - `hideFrame` boolean
            - `content` string, required
            - `title` string, required
        - DashboardLoomTile — Make all properties in T required
          - `uuid` string, required
          - `type` 'loom', required
          - `x` number, double, required
          - `y` number, double, required
          - `h` number, double, required
          - `w` number, double, required
          - `tabUuid` string, nullable
          - `properties` object, required
            - `url` string, required
            - `hideTitle` boolean
            - `title` string, required
        - DashboardSqlChartTile — Make all properties in T required
          - `uuid` string, required
          - `type` 'sql_chart', required
          - `x` number, double, required
          - `y` number, double, required
          - `h` number, double, required
          - `w` number, double, required
          - `tabUuid` string, nullable
          - `properties` object, required
            - `chartSlug` string, nullable
            - `hideTitle` boolean
            - `chartName` string, required
            - `savedSqlUuid` string, nullable, required
            - `title` string
        - DashboardHeadingTile — Make all properties in T required
          - `uuid` string, required
          - `type` 'heading', required
          - `x` number, double, required
          - `y` number, double, required
          - `h` number, double, required
          - `w` number, double, required
          - `tabUuid` string, nullable
          - `properties` object, required
            - `showDivider` boolean
            - `text` string, required
            - `title` unknown
        - DashboardDataAppTile — Make all properties in T required
          - `uuid` string, required
          - `type` 'data_app', required
          - `x` number, double, required
          - `y` number, double, required
          - `h` number, double, required
          - `w` number, double, required
          - `tabUuid` string, nullable
          - `properties` object, required
            - `appDeletedAt` string, nullable
            - `appUuid` string, required
            - `hideTitle` boolean
            - `title` string, required
    - `updatedAt` string, date-time, required
    - `description` string
    - `verification` ContentVerificationInfo, required
      - `verifiedAt` string, date-time, required
      - `verifiedBy` object, required
        - `lastName` string, required
        - `firstName` string, required
        - `userUuid` string, required
    - `name` string, required
    - `uuid` string, required
    - `versionUuid` string, required
    - `dashboardVersionId` number, double, required
    - `projectUuid` string, required
    - `organizationUuid` string, required
  - `status` 'ok', required

## Other responses

- `default` — Error

---

[API](https://skmtc.net/lightdash/apis/lightdash-api.md) · [All operations](https://skmtc.net/lightdash/apis/lightdash-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/lightdash/lightdash-api/versions/40c933755c9a/schema)
