Dune Analytics Dashboards API
The Dashboards API from Dune Analytics — 4 operation(s) for dashboards.
The Dashboards API from Dune Analytics — 4 operation(s) for dashboards.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.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.curl "https://apis.io/api/v1/apis/dune-analytics:dune-analytics-dashboards-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
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.
openapi: 3.2.0
info:
contact: {}
description: Dune API
title: Dune Dashboards API
version: '1.0'
servers:
- url: https://api.dune.com/api
tags:
- name: Dashboards
paths:
/v1/dashboards:
post:
description: Creates a new dashboard with optional visualization and text widgets.
parameters:
- description: API Key for the service
in: header
name: X-Dune-Api-Key
required: true
schema:
type: string
requestBody:
content:
'*/*':
schema:
$ref: '#/components/schemas/models.CreateDashboardCrudRequest'
description: CreateDashboardRequest
required: true
x-originalParamName: body
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/models.DashboardCrudResponse'
description: OK
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error400'
description: Bad Request
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error401'
description: Unauthorized
'402':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error402'
description: Payment Required
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error403'
description: Forbidden
'500':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error500'
description: Internal Server Error
summary: Create a dashboard
x-required-scope: Read/Write
tags:
- Dashboards
operationId: postV1Dashboards
x-operation-id-source: derived
/v1/dashboards/by-slug/{owner_handle}/{slug}:
get:
description: Retrieves the full state of a dashboard using the owner handle and URL slug.
parameters:
- description: API Key for the service
in: header
name: X-Dune-Api-Key
required: true
schema:
type: string
- description: Owner username or team handle
in: path
name: owner_handle
required: true
schema:
type: string
- description: Dashboard URL slug
in: path
name: slug
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/models.DashboardCrudResponse'
description: OK
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error400'
description: Bad Request
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error401'
description: Unauthorized
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error403'
description: Forbidden
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error404'
description: Not Found
'500':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error500'
description: Internal Server Error
summary: Get a dashboard by owner handle and slug
x-required-scope: Read
tags:
- Dashboards
operationId: getV1DashboardsBySlugByOwnerHandleBySlug
x-operation-id-source: derived
/v1/dashboards/{dashboard_id}:
get:
description: Retrieves the full state of a dashboard including widgets.
parameters:
- description: API Key for the service
in: header
name: X-Dune-Api-Key
required: true
schema:
type: string
- description: Dashboard ID
in: path
name: dashboard_id
required: true
schema:
type: integer
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/models.DashboardCrudResponse'
description: OK
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error400'
description: Bad Request
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error401'
description: Unauthorized
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error403'
description: Forbidden
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error404'
description: Not Found
'500':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error500'
description: Internal Server Error
summary: Get a dashboard by ID
x-required-scope: Read
tags:
- Dashboards
operationId: getV1DashboardsByDashboardId
x-operation-id-source: derived
patch:
description: Updates dashboard metadata and/or replaces widgets.
parameters:
- description: API Key for the service
in: header
name: X-Dune-Api-Key
required: true
schema:
type: string
- description: Dashboard ID
in: path
name: dashboard_id
required: true
schema:
type: integer
requestBody:
content:
'*/*':
schema:
$ref: '#/components/schemas/models.UpdateDashboardCrudRequest'
description: UpdateDashboardRequest
required: true
x-originalParamName: body
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/models.DashboardCrudResponse'
description: OK
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error400'
description: Bad Request
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error401'
description: Unauthorized
'402':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error402'
description: Payment Required
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error403'
description: Forbidden
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error404'
description: Not Found
'500':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error500'
description: Internal Server Error
summary: Update a dashboard
x-required-scope: Read/Write
tags:
- Dashboards
operationId: patchV1DashboardsByDashboardId
x-operation-id-source: derived
/v1/dashboards/{dashboard_id}/archive:
post:
description: Archives a dashboard by ID. The dashboard can be restored later.
parameters:
- description: API Key for the service
in: header
name: X-Dune-Api-Key
required: true
schema:
type: string
- description: Dashboard ID
in: path
name: dashboard_id
required: true
schema:
type: integer
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/models.ArchiveDashboardCrudResponse'
description: OK
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error400'
description: Bad Request
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error401'
description: Unauthorized
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error403'
description: Forbidden
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error404'
description: Not Found
'500':
content:
application/json:
schema:
$ref: '#/components/schemas/models.Error500'
description: Internal Server Error
summary: Archive a dashboard
x-required-scope: Read/Write
tags:
- Dashboards
operationId: postV1DashboardsByDashboardIdArchive
x-operation-id-source: derived
components:
schemas:
models.ArchiveDashboardCrudResponse:
properties:
dashboard_id:
type: integer
ok:
type: boolean
type: object
models.WidgetPosition:
properties:
col:
type: integer
row:
type: integer
size_x:
type: integer
size_y:
type: integer
type: object
models.Error400:
properties:
error:
example: Bad Request
type: string
type: object
models.UpdateDashboardCrudRequest:
properties:
columns_per_row:
type: integer
is_private:
type: boolean
name:
type: string
param_widgets:
items:
$ref: '#/components/schemas/models.ParamWidgetInput'
type: array
slug:
type: string
tags:
items:
type: string
type: array
text_widgets:
items:
$ref: '#/components/schemas/models.TextWidgetInput'
type: array
visualization_widgets:
items:
$ref: '#/components/schemas/models.VisualizationWidgetInput'
type: array
type: object
models.TextWidgetOutput:
properties:
position:
$ref: '#/components/schemas/models.WidgetPosition'
text:
type: string
widget_id:
type: integer
type: object
models.Error403:
properties:
error:
example: Not allowed to execute query. Query is archived, unsaved or not enough permissions
type: string
type: object
models.Error404:
properties:
error:
example: Object not found
type: string
type: object
models.ParamWidgetOutput:
properties:
key:
type: string
position:
$ref: '#/components/schemas/models.WidgetPosition'
query_id:
type: integer
visualization_widget_id:
type: integer
widget_id:
type: string
type: object
models.Error402:
properties:
error:
example: This API request would exceed your configured limits per billing cycle.
type: string
type: object
models.CreateDashboardCrudRequest:
properties:
columns_per_row:
type: integer
is_private:
type: boolean
name:
type: string
text_widgets:
items:
$ref: '#/components/schemas/models.TextWidgetInput'
type: array
visualization_ids:
items:
type: integer
type: array
required:
- name
type: object
models.VisualizationWidgetOutput:
properties:
position:
$ref: '#/components/schemas/models.WidgetPosition'
visualization_id:
type: integer
widget_id:
type: integer
type: object
models.TextWidgetInput:
properties:
position:
$ref: '#/components/schemas/models.WidgetPosition'
text:
type: string
type: object
models.VisualizationWidgetInput:
properties:
position:
$ref: '#/components/schemas/models.WidgetPosition'
visualization_id:
type: integer
type: object
models.Error401:
properties:
error:
example: Invalid API Key
type: string
type: object
models.ParamWidgetInput:
properties:
key:
type: string
position:
$ref: '#/components/schemas/models.WidgetPosition'
query_id:
type: integer
visualization_widget_id:
type: integer
type: object
models.Error500:
properties:
error:
example: Internal error
type: string
type: object
models.DashboardCrudResponse:
properties:
dashboard_id:
type: integer
dashboard_url:
type: string
is_private:
type: boolean
name:
type: string
param_widgets:
items:
$ref: '#/components/schemas/models.ParamWidgetOutput'
type: array
slug:
type: string
tags:
items:
type: string
type: array
text_widgets:
items:
$ref: '#/components/schemas/models.TextWidgetOutput'
type: array
visualization_widgets:
items:
$ref: '#/components/schemas/models.VisualizationWidgetOutput'
type: array
type: object
x-service-info:
categories:
- data
- compute
docs:
apiReference: https://docs.dune.com/api-reference/overview/introduction
homepage: https://docs.dune.com
x-provenance:
method: harvested
publisher: Dune Analytics
source: https://api.dune.com/openapi.json
note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
stamped by stamp-openapi-provenance.py (roadmap#793)