> ## Documentation Index
> Fetch the complete documentation index at: https://docs.serval.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Create Dashboard

> Create a dashboard on a team. team_id is in the body because there is no row to read it from yet; every other dashboard call takes only the id in the path. tabs sets up the initial tab structure and each tab's widgets list must be empty: widgets are created against an existing dashboard, so a new one has nothing to place yet. Create the widgets against the dashboard, then place them with the tabs field on PUT /v2/dashboards/{id}. Note the shape differs across the three calls: tabs is a bare list at the root of the create body and of the GET response, but a wrapper object ({"tabs": [...]}) on update. A GET response is therefore not a create body -- to clone a dashboard, wrap its tabs for the update call, and empty their widgets lists for the create call. Excluded from the generated MCP tools: Catalyst changes dashboards through staged, human-published change sets, and an auto-generated tool would be an unstaged second path to the same rows.



## OpenAPI

````yaml /sections/api-reference/openapi-spec-v2.yaml post /v2/dashboards
openapi: 3.1.0
info:
  title: Serval Public API
  description: Serval Public API
  contact:
    name: Serval
    url: https://serval.com
    email: support@serval.com
  license:
    name: Serval License
    url: https://serval.com/license
  version: 2.0.0
servers:
  - url: https://public.api.serval.com
security:
  - BearerAuth: []
tags:
  - name: Access Policy API
  - name: Access Policy Approval Procedure API
  - name: Access Profile API
  - name: Access Relationship API
  - name: Access Request API
  - name: Agent API
  - name: App Instance API
  - name: App Resource API
  - name: App Resource Role API
  - name: Approval Delegation API
  - name: Approval Procedure API
  - name: Approval Request API
  - name: Assignment Rules API
  - name: Audit Log API
  - name: Change Blackout API
  - name: Change Model API
  - name: Custom Field API
  - name: Custom Service API
  - name: Dashboards API
  - name: Entity API
  - name: Entity Field Mapping API
  - name: Entity Ingestion Config API
  - name: Entity Type API
  - name: Folder API
  - name: Forms API
  - name: Group API
  - name: Guidance API
  - name: Help Agent API
  - name: Journey API
  - name: Knowledge API
  - name: Knowledge Base API
  - name: One-Time Window API
  - name: Report API
  - name: Roles API
  - name: SLA API
  - name: Schedule API
  - name: Tag API
  - name: Team API
  - name: Team Group API
  - name: Team User API
  - name: Ticket API
  - name: Topic API
  - name: User API
  - name: User Relationship API
  - name: Workflow API
  - name: Workflow Approval Procedure API
  - name: Workflow Run API
paths:
  /v2/dashboards:
    post:
      tags:
        - Dashboards API
      summary: Create Dashboard
      description: >-
        Create a dashboard on a team. team_id is in the body because there is no
        row to read it from yet; every other dashboard call takes only the id in
        the path. tabs sets up the initial tab structure and each tab's widgets
        list must be empty: widgets are created against an existing dashboard,
        so a new one has nothing to place yet. Create the widgets against the
        dashboard, then place them with the tabs field on PUT
        /v2/dashboards/{id}. Note the shape differs across the three calls: tabs
        is a bare list at the root of the create body and of the GET response,
        but a wrapper object ({"tabs": [...]}) on update. A GET response is
        therefore not a create body -- to clone a dashboard, wrap its tabs for
        the update call, and empty their widgets lists for the create call.
        Excluded from the generated MCP tools: Catalyst changes dashboards
        through staged, human-published change sets, and an auto-generated tool
        would be an unstaged second path to the same rows.
      operationId: svrelay.publicv2.PublicAPIServiceV2.CreateDashboard
      requestBody:
        content:
          application/json:
            schema:
              $ref: >-
                #/components/schemas/svanalytics.publicapi.CreateDashboardRequest
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/svanalytics.publicapi.CreateDashboardResponse
      security:
        - BearerAuth: []
components:
  schemas:
    svanalytics.publicapi.CreateDashboardRequest:
      type: object
      properties:
        teamId:
          type: string
          title: team_id
          x-stainless-terraform-configurability: optional
        name:
          type: string
          title: name
          x-stainless-terraform-configurability: optional
        description:
          type: string
          title: description
          x-stainless-terraform-configurability: optional
        tabs:
          type: array
          items:
            $ref: '#/components/schemas/svanalytics.pubapimodels.DashboardTab'
          title: tabs
          description: Tabs only; each tab's widgets must be empty on create.
          x-stainless-terraform-configurability: optional
        variables:
          type: array
          items:
            $ref: '#/components/schemas/svanalytics.pubapimodels.DashboardVariable'
          title: variables
          x-stainless-terraform-configurability: optional
      title: CreateDashboardRequest
      additionalProperties: false
    svanalytics.publicapi.CreateDashboardResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/svanalytics.pubapimodels.Dashboard'
          title: data
          x-stainless-terraform-configurability: optional
      title: CreateDashboardResponse
      additionalProperties: false
    svanalytics.pubapimodels.DashboardTab:
      type: object
      properties:
        key:
          type: string
          title: key
          minLength: 1
          description: Author-chosen stable key ("default"), not a UUID.
          x-stainless-terraform-configurability: optional
        name:
          type: string
          title: name
          x-stainless-terraform-configurability: optional
        widgets:
          type: array
          items:
            $ref: '#/components/schemas/svanalytics.pubapimodels.WidgetPlacement'
          title: widgets
          maxItems: 500
          description: A widget is placed at most once across the whole dashboard.
          x-stainless-terraform-configurability: optional
      title: DashboardTab
      additionalProperties: false
      description: >-
        One page of a dashboard: the widgets placed on it, by id and grid
        position.
    svanalytics.pubapimodels.DashboardVariable:
      type: object
      properties:
        name:
          type: string
          title: name
          minLength: 1
          x-stainless-terraform-configurability: optional
        type:
          $ref: '#/components/schemas/svanalytics.pubapimodels.VariableType'
          title: type
          x-stainless-terraform-configurability: optional
        timeRange:
          $ref: '#/components/schemas/svanalytics.pubapimodels.TimeRangeVariable'
          title: time_range
          x-stainless-terraform-configurability: optional
      title: DashboardVariable
      additionalProperties: false
      description: >
        Exactly the variant matching `type` is set.

        dashboard_variable.variant_matches_type // exactly the variant matching
        type must be set
    svanalytics.pubapimodels.Dashboard:
      type: object
      properties:
        id:
          type: string
          title: id
          readOnly: true
          x-stainless-terraform-configurability: computed
        scopedId:
          type: string
          title: scoped_id
          description: Portable identity (dash_<22>), stable across cross-team pushes.
          readOnly: true
          x-stainless-terraform-configurability: computed
        teamId:
          type: string
          title: team_id
          readOnly: true
          x-stainless-terraform-configurability: computed
        name:
          type: string
          title: name
          x-stainless-terraform-configurability: optional
        description:
          type: string
          title: description
          x-stainless-terraform-configurability: optional
        tabs:
          type: array
          items:
            $ref: '#/components/schemas/svanalytics.pubapimodels.DashboardTab'
          title: tabs
          x-stainless-terraform-configurability: optional
        variables:
          type: array
          items:
            $ref: '#/components/schemas/svanalytics.pubapimodels.DashboardVariable'
          title: variables
          x-stainless-terraform-configurability: optional
        createdAt:
          $ref: '#/components/schemas/google.protobuf.Timestamp'
          title: created_at
          readOnly: true
          x-stainless-terraform-configurability: computed
        updatedAt:
          $ref: '#/components/schemas/google.protobuf.Timestamp'
          title: updated_at
          readOnly: true
          x-stainless-terraform-configurability: computed
      title: Dashboard
      additionalProperties: false
      description: |-
        A dashboard owns its tabs and names each widget by id; widgets are their
         own resource. No list endpoint, no concurrency version.
    svanalytics.pubapimodels.WidgetPlacement:
      type: object
      properties:
        widgetId:
          type: string
          title: widget_id
          pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
          format: uuid
          description: |-
            Lowercase UUID. A deleted widget's placement stays and renders as an
             empty placeholder, as in the UI.
          x-stainless-terraform-configurability: optional
        x:
          exclusiveMaximum: 12
          type: integer
          title: x
          minimum: 0
          format: int32
          x-stainless-terraform-configurability: optional
        'y':
          type: integer
          title: 'y'
          minimum: 0
          format: int32
          x-stainless-terraform-configurability: optional
        w:
          type: integer
          title: w
          maximum: 12
          minimum: 1
          format: int32
          x-stainless-terraform-configurability: optional
        h:
          type: integer
          title: h
          maximum: 128
          minimum: 1
          format: int32
          x-stainless-terraform-configurability: optional
      title: WidgetPlacement
      additionalProperties: false
      description: >
        One widget's position on the 12-column grid.

        placement.fits_grid // placement must fit the 12-column grid (x + w <=
        12)
    svanalytics.pubapimodels.VariableType:
      type: string
      title: VariableType
      enum:
        - VARIABLE_TYPE_UNSPECIFIED
        - VARIABLE_TYPE_TIME_RANGE
    svanalytics.pubapimodels.TimeRangeVariable:
      type: object
      properties:
        defaultFrom:
          type: string
          title: default_from
          description: '"now", relative ("now-30d"), "all" (from only), ISO 8601, or a date.'
          x-stainless-terraform-configurability: optional
        defaultTo:
          type: string
          title: default_to
          x-stainless-terraform-configurability: optional
      title: TimeRangeVariable
      additionalProperties: false
      description: 'No timezone: only UTC is legal today.'
    google.protobuf.Timestamp:
      type: string
      examples:
        - '2025-01-15T01:30:15.000Z'
        - '2025-06-01T00:00:00.000Z'
      format: date-time
      description: A timestamp in RFC 3339 format (e.g., "2025-01-15T01:30:15Z").
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````