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

# Update partially custom widget by ID

> Partially updates a custom widget of the caller's organization. Only the fields sent are changed. Cards that already use the widget keep their own copy and do not change.



## OpenAPI

````yaml /openapi/public/openapi-analytics.json patch /dynamic-dashboard-widget/{id}
openapi: 3.0.0
info:
  title: MileApp API - Analytics
  version: 3.0.0
  description: MileApp API Documentation - RESTful API for field operations management.
servers:
  - url: https://apiweb.mile.app/api/v3
security:
  - bearerAuth: []
tags:
  - name: Dashboard
    description: >-
      Dashboard lets a user compose their own dashboard from any number of
      cards, start from a template, duplicate a dashboard, share it with roles,
      and save it back as an organization template. Each card owns its own
      widget row (a chart type plus a query spec), cloned from the widget
      catalogue (built-in widgets plus the organization's custom widgets), so
      renaming or editing a card never touches the catalogue or another
      dashboard. Dashboards are owned by their creator: roles they are shared
      with can view, duplicate and save as template, but only the owner can edit
      or delete. Every write reuses the dashboard permission family (view, add,
      edit and delete dashboard).


      The numbers behind each card come from one generic aggregation endpoint
      instead of one endpoint per chart: the client sends a batch of up to 12
      declarative query specs, the server injects the caller's organization, hub
      and soft-delete scope from the session, runs each spec read-only, and
      returns a flat columns and rows table per item. The catalog endpoints
      describe the data sources, fields and limits a client may use.
paths:
  /dynamic-dashboard-widget/{id}:
    patch:
      tags:
        - Dashboard
      summary: Update partially custom widget by ID
      description: >-
        Partially updates a custom widget of the caller's organization. Only the
        fields sent are changed. Cards that already use the widget keep their
        own copy and do not change.
      operationId: patchDynamicDashboardWidget
      parameters:
        - name: id
          in: path
          required: true
          description: Custom widget `_id`
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  maxLength: 200
                  description: Literal display name, never translated
                description:
                  type: string
                viz:
                  type: string
                  maxLength: 50
                  description: >-
                    Chart type: one of the chart types used by the built-in
                    query widgets (currently `bar`, `donut`, `heatmap`, `kpi`,
                    `line`, `table`)
                spec:
                  type: object
                  description: >-
                    Query spec, validated the same way as Run analytics query.
                    Do not send `timeRange`; the dashboard supplies it.
                  additionalProperties: true
                defaultLayout:
                  type: object
                  description: Default card size when the widget is added to a dashboard
                  properties:
                    w:
                      type: integer
                      minimum: 2
                      maximum: 48
                      description: Width in grid columns, 2-48
                    h:
                      type: integer
                      minimum: 3
                      maximum: 18
                      description: Height in rows, 3-18; `null` = as tall as its content
              example:
                name: Done tasks per hub (top 5)
                spec:
                  specVersion: 1
                  dataSourceId: task
                  timeField: doneTime
                  measures:
                    - id: m1
                      fn: count
                  dimensions:
                    - id: d1
                      kind: terms
                      field: hubName
                      limit: 5
                  filters:
                    - id: f1
                      field: status
                      operator: eq
                      value: DONE
        description: Fields to change
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: boolean
                    example: true
                  code:
                    type: integer
                  message:
                    type: string
                  data:
                    type: object
                    properties:
                      schemaVersion:
                        type: integer
                        example: 1
                      name:
                        type: string
                        maxLength: 200
                        description: Literal display name, never translated
                      description:
                        type: string
                      category:
                        type: string
                        enum:
                          - custom
                        description: Always `custom`; set by the server
                      viz:
                        type: string
                        description: >-
                          Visualization: kpi, bar, line, donut, table, heatmap,
                          text, banner
                      spec:
                        type: object
                        description: >-
                          Neutral analytics query spec executed by POST
                          /analytics/query. See Run analytics query for the full
                          grammar.
                        properties:
                          specVersion:
                            type: integer
                          dataSourceId:
                            type: string
                          timeField:
                            type: string
                          measures:
                            type: array
                            items:
                              type: object
                              additionalProperties: true
                          dimensions:
                            type: array
                            items:
                              type: object
                              additionalProperties: true
                          filters:
                            type: array
                            items:
                              type: object
                              additionalProperties: true
                      composite:
                        type: object
                        description: >-
                          Multi-query widget `{kind, queries: {key: spec}}`;
                          `null` for ordinary widgets
                        additionalProperties: true
                      content:
                        type: object
                        description: '`{body}` for text and banner widgets; `null` otherwise'
                        properties:
                          body:
                            type: string
                            maxLength: 2000
                      defaultLayout:
                        type: object
                        description: Card placement on the grid
                        properties:
                          w:
                            type: integer
                            minimum: 2
                            description: Width in grid columns, 2 to `grid.columns`
                          h:
                            type: integer
                            minimum: 3
                            maximum: 18
                            description: >-
                              Height in rows, 3-18; `null` = as tall as its
                              content
                          x:
                            type: integer
                            minimum: 0
                            maximum: 48
                            description: >-
                              Optional column offset (free placement accepted,
                              not required)
                          'y':
                            type: integer
                            minimum: 0
                            description: Optional row offset
                      isCustom:
                        type: boolean
                        description: Always `true`; set by the server
                      _id:
                        type: string
                      organizationId:
                        type: string
                        description: The caller's organization id
                      createdBy:
                        type: string
                      updatedBy:
                        type: string
                      createdTime:
                        type: string
                        format: date-time
                      updatedTime:
                        type: string
                        format: date-time
              examples:
                response:
                  value:
                    status: true
                    code: 200
                    message: Widget has been updated successfully.
                    data:
                      _id: 66fcd2a1e4b0a7d3c1f20c01
                      organizationId: 6650c2a1f3b9e4001c7d2a10
                      schemaVersion: 1
                      name: Done tasks per hub (top 5)
                      description: Completed tasks per hub in the selected range.
                      category: custom
                      viz: bar
                      spec:
                        specVersion: 1
                        dataSourceId: task
                        timeField: doneTime
                        measures:
                          - id: m1
                            fn: count
                        dimensions:
                          - id: d1
                            kind: terms
                            field: hubName
                            limit: 5
                        filters:
                          - id: f1
                            field: status
                            operator: eq
                            value: DONE
                      composite: null
                      content: null
                      defaultLayout:
                        w: 6
                        h: 6
                      isCustom: true
                      createdBy: planner@example.com
                      updatedBy: planner@example.com
                      createdTime: '2026-10-02T03:00:00.000000Z'
                      updatedTime: '2026-10-02T04:10:00.000000Z'
        '400':
          description: >-
            Bad Request - `dydsh-001` no editable field sent or a blank required
            field, `dydsh-009` length or range, `dydsh-011` `spec` or
            `defaultLayout` is not an object, `dydsh-014` `viz` is not an
            allowed chart type or `spec` is not valid
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: boolean
                    example: false
                  message:
                    type: string
                    description: Human-readable reason
                  failedCode:
                    type: string
                    description: Structured error code, see Status Codes
                  error:
                    type: object
                    description: >-
                      Present when the spec was refused by the analytics
                      validator
                    properties:
                      code:
                        type: string
                        description: Analytics rule, for example `field_unknown`
                      message:
                        type: string
                      field:
                        type: string
                        description: The offending field, when there is one
              examples:
                response:
                  value:
                    status: false
                    message: >-
                      Unknown chart type 'pie'. Allowed: bar, donut, heatmap,
                      kpi, line, table.
                    failedCode: dydsh-014
        '401':
          description: Unauthorized - missing, invalid or expired access token
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: boolean
                    example: false
                  message:
                    type: string
                    description: Human-readable reason
                  failedCode:
                    type: string
                    description: Structured error code, see Status Codes
              examples:
                response:
                  value:
                    status: false
                    message: Unauthenticated.
                    failedCode: auth-034
        '403':
          description: Forbidden - the caller's role lacks `edit/dashboard`
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: boolean
                    example: false
                  message:
                    type: string
                    description: Human-readable reason
                  failedCode:
                    type: string
                    description: Structured error code, see Status Codes
              examples:
                response:
                  value:
                    status: false
                    message: >-
                      Access denied. You do not have permission for edit
                      dashboard. Please contact your admin to request access.
                    failedCode: sys-035
        '404':
          description: >-
            Not Found - unknown id, a built-in widget, a card's widget row, or
            another organization's widget
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: boolean
                    example: false
                  message:
                    type: string
                    description: Human-readable reason
                  failedCode:
                    type: string
                    description: Structured error code, see Status Codes
                  code:
                    type: integer
                    description: >-
                      HTTP status repeated in the body (repository failures
                      only)
                  data:
                    type: array
                    items:
                      type: object
                      additionalProperties: true
                    description: Empty on most failures
              examples:
                response:
                  value:
                    status: false
                    code: 404
                    message: Custom widget not found.
                    data: []
                    failedCode: dydsh-041
        '500':
          description: Server Error - unexpected exception, logged server-side
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: boolean
                    example: false
                  message:
                    type: string
                    description: Human-readable reason
                  failedCode:
                    type: string
                    description: Structured error code, see Status Codes
                  code:
                    type: integer
                    description: >-
                      HTTP status repeated in the body (repository failures
                      only)
                  data:
                    type: array
                    items:
                      type: object
                      additionalProperties: true
                    description: Empty on most failures
              examples:
                response:
                  value:
                    status: false
                    code: 500
                    message: something_wrong
                    failedCode: dydsh-045
      security:
        - bearerAuth: []
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Use a valid Bearer token to authenticate.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.