x-api-key header against https://app.arize.com/graphql.
Find the IDs you need
Every dashboard mutation takes a space ID (to create a dashboard) or a dashboard ID (everything else), and every widget mutation also takes a model ID. Start fromviewer to find your space, then the space’s dashboards and models connections. See Using global node IDs for how these opaque IDs work.
node(id: "<ID>") { ... on Dashboard { ... } } (or ... on LineChartWidget, ... on StatisticWidget, and so on).
List dashboards and their widgets in a space
Each widget type lives on its own connection offDashboard (lineChartWidgets, statisticWidgets, textWidgets, barChartWidgets, pivotTableWidgets, experimentChartWidgets), so pull whichever ones you care about alongside the dashboard itself.
node and object graph.
Create a dashboard
An empty dashboard just needs a name and a space. You add widgets to it afterward with the widget mutations below.updateDashboardName and updateDashboardStatus take the same dashboardId plus a name or status string, and both can run as two fields in one mutation request since they’re independent fields on Mutation.
Reference: createDashboard, updateDashboardName, updateDashboardStatus.
Create a line chart widget with one or more plots
A line chart widget holds one or more plots, each scoped to its own model, environment, and metric. The widget-leveltimeSeriesMetricType picks whether the metrics come from model inference data (modelDataMetric) or LLM evaluation runs (evaluationMetric); each plot then picks its own metric (accuracy, count, and so on), modelEnvironmentName, and an optional dimension when the metric is scoped to one feature or tag instead of the whole model.
modelVersionIds and filters are required on every plot but accept an empty array (no version or filter restriction). Leave gridPosition off and Arize places the widget in the next open slot.
Reference: createLineChartWidget.
Create a statistic widget
A statistic widget shows a single number. Point it at a model and supply exactly one metric source:performanceMetric, aggregation (a data quality metric), or a saved customMetric.
dimension and dimensionCategory to scope the number to one feature or tag instead of the whole model.
Reference: createStatisticWidget.
Create a text widget
Text widgets add headings or notes between other widgets. Unlike the chart and statistic widgets,gridPosition and creationStatus are both required here, not defaulted.
createTextWidget.
Recreate a dashboard for another model
copyDashboard clones a dashboard and its widgets as-is, pointed at the same models, in the same space:
copyDashboard won’t help since it has no model argument. Use createDashboardFromTemplate with the original template and the new model’s ID instead:
copyDashboard, createDashboardFromTemplate.
Duplicate a widget
duplicateWidget works on any widget type. You pass the source widget’s ID and a new grid position and title; the mutation looks up the widget’s type itself, so you don’t specify it.
duplicateWidget.
Delete a widget
Each widget type has its own delete mutation, and each one returns the parentdashboard rather than a bare success flag, which is convenient for refreshing a cached widget list in the same request.
<type>WidgetId shape, with one exception: deleteStatisticWidget takes statWidgetId, not statisticWidgetId. See deleteBarChartWidget, deleteTextWidget, deletePivotTableWidget, and deleteExperimentChartWidget for the rest.
Gotchas and behavior notes
deleteStatisticWidget's argument is statWidgetId, not statisticWidgetId
deleteStatisticWidget's argument is statWidgetId, not statisticWidgetId
Every other delete mutation follows
<type>WidgetId (lineChartWidgetId, barChartWidgetId, textWidgetId, pivotTableWidgetId, experimentChartWidgetId). deleteStatisticWidget breaks the pattern with statWidgetId.needsInit is a frontend-only creationStatus value
needsInit is a frontend-only creationStatus value
The schema documents
needsInit as “a widget that does not exist in the backend yet (this value should only be seen on the frontend).” Send pending, created, or published from the API instead. unpublished is also internal: it’s how the UI “deletes” a widget during an edit session by cloning and unpublishing the old one rather than mutating it.updateDashboardStatus's status argument is a plain String
updateDashboardStatus's status argument is a plain String
Dashboard.status returns the DashboardStatusType enum (active, inactive, deleted), but UpdateDashboardStatusMutationInput.status is typed as a plain String!, not that enum. The schema won’t validate the value for you, so send exactly "active", "inactive", or "deleted".copyDashboard doesn't retarget the model
copyDashboard doesn't retarget the model
CopyDashboardMutationInput only takes dashboardId. To put an equivalent dashboard on a different model, use createDashboardFromTemplate with the same template value and the new model’s ID, as shown above.Plot-level lists are required but can be empty
Plot-level lists are required but can be empty
LineChartPlotInputInput.modelVersionIds and .filters are non-null lists ([ID!]!, [LineChartFilterItemInputInput!]!), so you must include the key, but [] is a valid value meaning “all versions” and “no filter.”positiveClass and customMetric.requiresPositiveClass travel together
positiveClass and customMetric.requiresPositiveClass travel together
positiveClass on a plot or widget only applies when the prediction value type is categorical and the metric needs a positive class (several field descriptions say “if timeseriesMetricType = ‘evaluationMetrics’”, which doesn’t match the actual enum value evaluationMetric (singular); treat it as a documentation typo, not a separate value). CustomMetricInput.requiresPositiveClass flags the same dependency for custom metric formulas.Dashboard mutations reference
Full arguments, return types and minimal examples for every dashboard and widget mutation.
All mutations
Browse mutations for every other domain: monitors, datasets, prompts and more.
API explorer
Run queries and mutations interactively against your own space.