Dashboard
Full dashboard with SQL query and Vega-Lite specification. **New architecture (v2):** - `dataSource` field with either SQL or Store Elasticsearch DSL - Single `spec` field with complete Vega-Lite spec (vconcat/hconcat for multiple panels) - Cross-panel interactivity via Vega selections - Legacy top-level `query` fields are treated as a SQL data source **Legacy architecture (v1, deprecated):** - Multiple `queries` with named data sources - Multiple `panels` with separate specs and dataSources references - `layout` for grid positioning - No cross-panel interactivity
Properties
| Name | Type | Description |
|---|---|---|
| id | string | Unique identifier for the object |
| edit_revision | integer | Monotonic edit revision used to detect concurrent updates. |
| name | string | Human-readable name or title |
| description | string | Optional detailed description of the object |
| tags | array | Tags for organization |
| updated_by | string | Identifier of the user who last modified the object |
| created_by | string | Identifier of the user who created the object |
| created_at | string | ISO timestamp of when the object was created |
| updated_at | string | ISO timestamp of when the object was last updated |
| store_id | string | Parent data store ID |
| status | object | Current status |
| panel_count | number | Number of panels (deprecated, kept for backwards compat) |
| query_count | number | Number of queries (deprecated, kept for backwards compat) |
| last_rendered_at | string | Last render timestamp |
| source | string | Source of the dashboard definition. Defaults to stored dashboards. |
| app_name | string | App name when `source` is `app`. |
| readonly | boolean | App dashboards are read-only until cloned into a stored dashboard. |
| dataSource | object | Data source used to populate Vega `data.values`. When omitted, top-level `query` is treated as a SQL data source for backwards compatibility. |
| query | string | SQL query that returns all data for the dashboard. Use JOINs, CTEs, or UNION ALL to combine data from multiple tables. Can include {{param_name}} placeholders for dynamic values. Deprecated: Use `data |
| queryLimit | number | Maximum rows to return from the query (default: 10000). Deprecated: Use `dataSource.queryLimit` instead. |
| queryParameters | object | Default values for SQL parameters. Deprecated: Use `dataSource.queryParameters` instead. |
| spec | object | Complete Vega-Lite specification for the entire dashboard. Use vconcat/hconcat for multiple panels, params for interactivity. Data is injected at runtime from query results. |
| queries | array | Deprecated: Use single `query` field instead. Named SQL queries (kept for backwards compatibility). |
| panels | array | Deprecated: Use single `spec` field with vconcat/hconcat instead. Panel definitions (kept for backwards compatibility). |
| layout | object | Deprecated: Layout is now handled within the Vega-Lite spec. Layout configuration (kept for backwards compatibility). |
| last_render_url | string | URL of last rendered image |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/api-evangelist/vertesiahq/main/json-schema/vertesiahq-dashboard-schema.json",
"title": "Dashboard",
"description": "Full dashboard with SQL query and Vega-Lite specification.\n\n**New architecture (v2):**\n- `dataSource` field with either SQL or Store Elasticsearch DSL\n- Single `spec` field with complete Vega-Lite spec (vconcat/hconcat for multiple panels)\n- Cross-panel interactivity via Vega selections\n- Legacy top-level `query` fields are treated as a SQL data source\n\n**Legacy architecture (v1, deprecated):**\n- Multiple `queries` with named data sources\n- Multiple `panels` with separate specs and dataSources references\n- `layout` for grid positioning\n- No cross-panel interactivity",
"x-generated": "2026-10-22",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/vertesia-openapi.json#/components/schemas/Dashboard",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the object"
},
"edit_revision": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "Monotonic edit revision used to detect concurrent updates."
},
"name": {
"type": "string",
"description": "Human-readable name or title"
},
"description": {
"type": "string",
"description": "Optional detailed description of the object"
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tags for organization"
},
"updated_by": {
"type": "string",
"description": "Identifier of the user who last modified the object"
},
"created_by": {
"type": "string",
"description": "Identifier of the user who created the object"
},
"created_at": {
"type": "string",
"description": "ISO timestamp of when the object was created"
},
"updated_at": {
"type": "string",
"description": "ISO timestamp of when the object was last updated"
},
"store_id": {
"type": "string",
"description": "Parent data store ID"
},
"status": {
"$ref": "#/$defs/DashboardStatus",
"description": "Current status"
},
"panel_count": {
"type": "number",
"description": "Number of panels (deprecated, kept for backwards compat)"
},
"query_count": {
"type": "number",
"description": "Number of queries (deprecated, kept for backwards compat)"
},
"last_rendered_at": {
"type": "string",
"description": "Last render timestamp"
},
"source": {
"type": "string",
"enum": [
"stored",
"app"
],
"description": "Source of the dashboard definition. Defaults to stored dashboards."
},
"app_name": {
"type": "string",
"description": "App name when `source` is `app`."
},
"readonly": {
"type": "boolean",
"description": "App dashboards are read-only until cloned into a stored dashboard."
},
"dataSource": {
"$ref": "#/$defs/DashboardDataSource",
"description": "Data source used to populate Vega `data.values`. When omitted, top-level `query` is treated as a SQL data source for backwards compatibility."
},
"query": {
"type": "string",
"deprecated": true,
"x-deprecated-message": "Use `dataSource: { kind: 'data_sql', query }` instead.",
"description": "SQL query that returns all data for the dashboard. Use JOINs, CTEs, or UNION ALL to combine data from multiple tables. Can include {{param_name}} placeholders for dynamic values.\n\nDeprecated: Use `dataSource: { kind: 'data_sql', query }` instead."
},
"queryLimit": {
"type": "number",
"deprecated": true,
"x-deprecated-message": "Use `dataSource.queryLimit` instead.",
"description": "Maximum rows to return from the query (default: 10000).\n\nDeprecated: Use `dataSource.queryLimit` instead."
},
"queryParameters": {
"deprecated": true,
"x-deprecated-message": "Use `dataSource.queryParameters` instead.",
"$ref": "#/$defs/StringValueMap",
"description": "Default values for SQL parameters.\n\nDeprecated: Use `dataSource.queryParameters` instead."
},
"spec": {
"type": "object",
"additionalProperties": true,
"description": "Complete Vega-Lite specification for the entire dashboard. Use vconcat/hconcat for multiple panels, params for interactivity. Data is injected at runtime from query results."
},
"queries": {
"type": "array",
"items": {
"$ref": "#/$defs/DashboardQuery"
},
"deprecated": true,
"x-deprecated-message": "Use single `query` field instead.\nNamed SQL queries (kept for backwards compatibility).",
"description": "Deprecated: Use single `query` field instead.\nNamed SQL queries (kept for backwards compatibility)."
},
"panels": {
"type": "array",
"items": {
"$ref": "#/$defs/DashboardPanel"
},
"deprecated": true,
"x-deprecated-message": "Use single `spec` field with vconcat/hconcat instead.\nPanel definitions (kept for backwards compatibility).",
"description": "Deprecated: Use single `spec` field with vconcat/hconcat instead.\nPanel definitions (kept for backwards compatibility)."
},
"layout": {
"deprecated": true,
"x-deprecated-message": "Layout is now handled within the Vega-Lite spec.\nLayout configuration (kept for backwards compatibility).",
"$ref": "#/$defs/DashboardLayout",
"description": "Deprecated: Layout is now handled within the Vega-Lite spec.\nLayout configuration (kept for backwards compatibility)."
},
"last_render_url": {
"type": "string",
"description": "URL of last rendered image"
}
},
"required": [
"id",
"edit_revision",
"name",
"tags",
"updated_by",
"created_by",
"created_at",
"updated_at",
"store_id",
"status",
"panel_count",
"query_count",
"queries",
"panels",
"layout"
],
"additionalProperties": false,
"$defs": {
"DashboardDataSource": {
"oneOf": [
{
"$ref": "#/$defs/DashboardSqlDataSource"
},
{
"$ref": "#/$defs/DashboardStoreElasticsearchDataSource"
}
],
"type": "object",
"required": [
"kind"
],
"description": "Data source for a Vega dashboard."
},
"DashboardElasticsearchDsl": {
"type": "object",
"properties": {
"query": {
"type": "object",
"additionalProperties": true
},
"aggs": {
"type": "object",
"additionalProperties": true
},
"size": {
"type": "number"
},
"from": {
"type": "number"
},
"sort": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
}
},
"additionalProperties": false,
"description": "Elasticsearch DSL supported by dashboard data sources. Queries execute through Vertesia Store, so project/security filtering remains server-side."
},
"DashboardElasticsearchResultMapping": {
"oneOf": [
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "hits"
}
},
"required": [
"type"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "aggregation_buckets"
},
"path": {
"type": "string",
"description": "Dot path under `aggregations` that contains a `buckets` array."
},
"keyField": {
"type": "string",
"description": "Output field name for bucket key. Defaults to `key`."
},
"countField": {
"type": "string",
"description": "Output field name for doc count. Defaults to `doc_count`."
}
},
"required": [
"type",
"path"
],
"additionalProperties": false
}
],
"type": "object",
"required": [
"type"
],
"description": "How an Elasticsearch DSL result should be converted into Vega rows."
},
"DashboardLayout": {
"type": "object",
"properties": {
"columns": {
"type": "number",
"description": "Number of columns in the grid (default: 2)"
},
"cellWidth": {
"type": "number",
"description": "Width of each cell in pixels (default: 600)"
},
"cellHeight": {
"type": "number",
"description": "Height of each cell in pixels (default: 400)"
},
"padding": {
"type": "number",
"description": "Padding between cells in pixels (default: 20)"
}
},
"required": [
"columns",
"cellWidth",
"cellHeight",
"padding"
],
"additionalProperties": false,
"description": "Dashboard layout configuration."
},
"DashboardPanel": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Panel ID (auto-generated if not provided)"
},
"title": {
"type": "string",
"description": "Panel title"
},
"spec": {
"type": "object",
"additionalProperties": true,
"description": "Vega or Vega-Lite specification"
},
"vegaLite": {
"type": "boolean",
"description": "Whether spec is Vega-Lite (default: true)"
},
"dataSources": {
"type": "array",
"items": {
"type": "string"
},
"description": "Query names that populate this panel's data sources"
},
"position": {
"$ref": "#/$defs/DashboardPanelPosition",
"description": "Position in the dashboard grid"
}
},
"required": [
"title",
"spec",
"dataSources",
"position"
],
"additionalProperties": false,
"description": "Dashboard panel with Vega/Vega-Lite visualization."
},
"DashboardPanelPosition": {
"type": "object",
"properties": {
"row": {
"type": "number",
"description": "Row index (0-based)"
},
"col": {
"type": "number",
"description": "Column index (0-based)"
},
"width": {
"type": "number",
"description": "Width in grid cells (default: 1)"
},
"height": {
"type": "number",
"description": "Height in grid cells (default: 1)"
}
},
"required": [
"row",
"col"
],
"additionalProperties": false,
"description": "Panel position within the dashboard grid."
},
"DashboardQuery": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Query name (used as data source reference in Vega specs)"
},
"sql": {
"type": "string",
"description": "SQL query (SELECT only). Can include {{param_name}} placeholders for dynamic values."
},
"description": {
"type": "string",
"description": "Human-readable description"
},
"limit": {
"type": "number",
"description": "Maximum rows to return"
},
"parameters": {
"$ref": "#/$defs/StringValueMap",
"description": "Default values for SQL parameters. Keys are parameter names (without braces)."
}
},
"required": [
"name",
"sql"
],
"additionalProperties": false,
"description": "Named SQL query that maps to a Vega data source. Supports parameterized SQL with {{param_name}} placeholders."
},
"DashboardSqlDataSource": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "data_sql"
},
"query": {
"type": "string",
"description": "SQL query that returns all rows for the dashboard."
},
"queryLimit": {
"type": "number",
"description": "Maximum rows to return from the query."
},
"queryParameters": {
"$ref": "#/$defs/StringValueMap",
"description": "Default values for SQL {{param}} placeholders."
}
},
"required": [
"kind",
"query"
],
"additionalProperties": false,
"description": "Dashboard data source backed by a Data Platform SQL query."
},
"DashboardStatus": {
"type": "string",
"enum": [
"active",
"archived"
],
"description": "Dashboard lifecycle status."
},
"DashboardStoreElasticsearchDataSource": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "store_es_dsl"
},
"dsl": {
"$ref": "#/$defs/DashboardElasticsearchDsl",
"description": "Elasticsearch DSL query executed through the secured Store query API."
},
"result": {
"$ref": "#/$defs/DashboardElasticsearchResultMapping",
"description": "Result mapping. Defaults to `hits`."
}
},
"required": [
"kind",
"dsl"
],
"additionalProperties": false,
"description": "Dashboard data source backed by Vertesia Store Elasticsearch DSL."
},
"StringValueMap": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
}
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
curl "https://apis.io/api/v1/json-schemas/vertesiahq-dashboard"
curl "https://apis.io/api/v1/json-schemas?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.