Dashboards-3

For instructions on how to authenticate to use this endpoint, see API overview.

Endpoints

PATCH
DELETE
POST
POST
POST
POST
POST
PATCH
POST
GET
GET
POST
GET
POST
POST
POST
POST
POST
GET

Update dashboards

Also available via the PostHog MCP server:

  • dashboard-updateUpdate dashboard

Required API key scopes

dashboard:write

Path parameters

  • id
    integer

Query parameters

  • format
    string
    One of: "json""txt"

Request parameters

  • name
    stringnull
  • description
    string
  • pinned
    boolean
  • last_accessed_at
    stringnull
  • deleted
    boolean
  • breakdown_colors
  • data_color_theme_id
    integernull
  • tags
    array
  • restriction_level
  • last_refresh
    stringnull
  • quick_filter_ids
    arraynull
  • use_template
    string
  • use_dashboard
    integernull
  • delete_insights
    boolean
    Default: false
  • _create_in_folder
    string

Response


Example request

PATCH /api/projects/:project_id/dashboards/:id
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl -X PATCH \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/:id/\
-d name=["string","null"]

Example response

Status 200
RESPONSE
{
"id": 0,
"name": "string",
"description": "string",
"pinned": true,
"created_at": "2019-08-24T14:15:22Z",
"created_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"last_accessed_at": "2019-08-24T14:15:22Z",
"last_viewed_at": "2019-08-24T14:15:22Z",
"is_shared": true,
"deleted": true,
"creation_mode": "default",
"filters": {},
"variables": {},
"breakdown_colors": null,
"data_color_theme_id": 0,
"tags": [
null
],
"restriction_level": 21,
"effective_restriction_level": 21,
"effective_privilege_level": 21,
"user_access_level": "string",
"access_control_version": "string",
"last_refresh": "2019-08-24T14:15:22Z",
"persisted_filters": {},
"persisted_variables": {},
"team_id": 0,
"quick_filter_ids": [
"string"
],
"tiles": [
{}
],
"use_template": "string",
"use_dashboard": 0,
"delete_insights": false,
"_create_in_folder": "string"
}

Delete dashboards

Also available via the PostHog MCP server:

  • dashboard-deleteDelete dashboard

Hard delete of this model is not allowed. Use a patch API call to set "deleted" to true

Required API key scopes

dashboard:write

Path parameters

  • id
    integer

Query parameters

  • format
    string
    One of: "json""txt"

Example request

DELETE /api/projects/:project_id/dashboards/:id
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl -X DELETE \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/:id/

Example response

Status 405 No response body

Create dashboards analyze refresh result

Generate AI analysis comparing before/after dashboard refresh. Expects cache_key in request body pointing to the stored 'before' state.

Path parameters

  • id
    integer

Query parameters

  • format
    string
    One of: "json""txt"

Request parameters

  • name
    stringnull
  • description
    string
  • pinned
    boolean
  • last_accessed_at
    stringnull
  • deleted
    boolean
  • breakdown_colors
  • data_color_theme_id
    integernull
  • tags
    array
  • restriction_level
  • last_refresh
    stringnull
  • quick_filter_ids
    arraynull
  • use_template
    string
  • use_dashboard
    integernull
  • delete_insights
    boolean
    Default: false
  • _create_in_folder
    string

Example request

POST /api/projects/:project_id/dashboards/:id/analyze_refresh_result
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl
-H 'Content-Type: application/json'\
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/:id/analyze_refresh_result/\
-d name=["string","null"]

Example response

Status 200 No response body

Create dashboards copy tile

Copy an existing dashboard tile to another dashboard (insight, text card, or widget tile).

Required API key scopes

dashboard:write

Path parameters

  • id
    integer

Query parameters

  • format
    string
    One of: "json""txt"

Request parameters

  • fromDashboardId
    integer
  • tileId
    integer

Response


Example request

POST /api/projects/:project_id/dashboards/:id/copy_tile
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl
-H 'Content-Type: application/json'\
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/:id/copy_tile/\
-d fromDashboardId="integer",\
-d tileId="integer"

Example response

Status 200
RESPONSE
{
"id": 0,
"name": "string",
"description": "string",
"pinned": true,
"created_at": "2019-08-24T14:15:22Z",
"created_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"last_accessed_at": "2019-08-24T14:15:22Z",
"last_viewed_at": "2019-08-24T14:15:22Z",
"is_shared": true,
"deleted": true,
"creation_mode": "default",
"filters": {},
"variables": {},
"breakdown_colors": null,
"data_color_theme_id": 0,
"tags": [
null
],
"restriction_level": 21,
"effective_restriction_level": 21,
"effective_privilege_level": 21,
"user_access_level": "string",
"access_control_version": "string",
"last_refresh": "2019-08-24T14:15:22Z",
"persisted_filters": {},
"persisted_variables": {},
"team_id": 0,
"quick_filter_ids": [
"string"
],
"tiles": [
{}
],
"use_template": "string",
"use_dashboard": 0,
"delete_insights": false,
"_create_in_folder": "string"
}

Create dashboards create text tile

Add a markdown text tile to a dashboard.

Text tiles render as markdown blocks on the dashboard — useful as section headings, dividers, or annotations between insight tiles to give the dashboard structure.

Required API key scopes

dashboard:write

Path parameters

  • id
    integer

Query parameters

  • format
    string
    One of: "json""txt"

Request parameters

  • body
    string
  • layouts
  • color
    stringnull

Response


Example request

POST /api/projects/:project_id/dashboards/:id/create_text_tile
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl
-H 'Content-Type: application/json'\
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/:id/create_text_tile/\
-d body="string"

Example response

Status 201
RESPONSE
{
"id": 0,
"insight": {
"id": 0,
"short_id": "string",
"name": "string",
"derived_name": "string",
"query": {
"embedded": null,
"full": null,
"hidePersonsModal": null,
"hideTooltipOnScroll": null,
"kind": "InsightVizNode",
"showCorrelationTable": null,
"showFilters": null,
"showHeader": null,
"showLastComputation": null,
"showLastComputationRefresh": null,
"showResults": null,
"showTable": null,
"source": {
"aggregation_group_type_index": null,
"breakdownFilter": null,
"calendarHeatmapFilter": null,
"compareFilter": null,
"conversionGoal": null,
"dataColorTheme": null,
"dateRange": null,
"filterTestAccounts": false,
"interval": "day",
"kind": "TrendsQuery",
"modifiers": null,
"properties": [],
"response": null,
"samplingFactor": null,
"series": [
{
"custom_name": null,
"fixedProperties": null,
"kind": "GroupNode",
"limit": null,
"math": null,
"math_group_type_index": null,
"math_hogql": null,
"math_multiplier": null,
"math_property": null,
"math_property_revenue_currency": null,
"math_property_type": null,
"name": null,
"nodes": [
{
"custom_name": null,
"event": null,
"fixedProperties": null,
"kind": "EventsNode",
"limit": null,
"math": null,
"math_group_type_index": null,
"math_hogql": null,
"math_multiplier": null,
"math_property": null,
"math_property_revenue_currency": null,
"math_property_type": null,
"name": null,
"optionalInFunnel": null,
"orderBy": null,
"properties": null,
"response": null,
"version": null
}
],
"operator": "AND",
"optionalInFunnel": null,
"orderBy": null,
"properties": null,
"response": null,
"version": null
}
],
"tags": null,
"trendsFilter": null,
"version": null
},
"suppressSessionAnalysisWarning": null,
"version": null,
"vizSpecificOptions": null
},
"order": -2147483648,
"deleted": true,
"dashboards": [
0
],
"dashboard_tiles": [
{
"id": 0,
"dashboard_id": 0,
"deleted": true
}
],
"last_refresh": "2019-08-24T14:15:22Z",
"cache_target_age": "2019-08-24T14:15:22Z",
"next_allowed_client_refresh": "2019-08-24T14:15:22Z",
"result": null,
"hasMore": true,
"columns": [
"string"
],
"created_at": "2019-08-24T14:15:22Z",
"created_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"description": "string",
"updated_at": "2019-08-24T14:15:22Z",
"tags": [
null
],
"favorited": true,
"last_modified_at": "2019-08-24T14:15:22Z",
"last_modified_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"is_sample": true,
"effective_restriction_level": 21,
"effective_privilege_level": 21,
"user_access_level": "string",
"timezone": "string",
"is_cached": true,
"query_status": null,
"hogql": "string",
"types": [
null
],
"resolved_date_range": {
"date_from": "2019-08-24T14:15:22Z",
"date_to": "2019-08-24T14:15:22Z"
},
"_create_in_folder": "string",
"alerts": [
null
],
"last_viewed_at": "2019-08-24T14:15:22Z"
},
"text": {
"id": 0,
"created_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"last_modified_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"body": "string",
"dashboard_tiles": [
{
"id": 0,
"dashboard_id": 0,
"deleted": true
}
],
"last_modified_at": "2019-08-24T14:15:22Z",
"team": 0
},
"button_tile": {
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"created_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"last_modified_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"url": "string",
"text": "string",
"placement": "left",
"dashboard_tiles": [
{
"id": 0,
"dashboard_id": 0,
"deleted": true
}
],
"style": "primary",
"last_modified_at": "2019-08-24T14:15:22Z",
"team": 0
},
"widget": {
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"created_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"last_modified_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"widget_type": "string",
"name": "string",
"description": "string",
"config": {
"limit": 10,
"orderBy": "occurrences",
"orderDirection": "DESC",
"status": "active",
"dateRange": {
"date_from": "-14d"
},
"filterTestAccounts": true
},
"dashboard_tiles": [
{
"id": 0,
"dashboard_id": 0,
"deleted": true
}
],
"last_modified_at": "2019-08-24T14:15:22Z",
"team": 0
},
"layouts": null,
"color": "string",
"filters_overrides": null,
"show_description": true,
"transparent_background": true
}

Create dashboards delete

Soft-delete a single tile from a dashboard.

Works for text, insight, and button tiles. The underlying Insight, Text, or ButtonTile object is preserved — only the dashboard tile is hidden. To delete the entire dashboard, use the dashboard delete endpoint instead.

Required API key scopes

dashboard:write

Path parameters

  • id
    integer

Query parameters

  • format
    string
    One of: "json""txt"

Request parameters

  • tile_id
    integer

Example request

POST /api/projects/:project_id/dashboards/:id/delete_tile
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl
-H 'Content-Type: application/json'\
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/:id/delete_tile/\
-d tile_id="integer"

Example response

Status 204 No response body

Create dashboards move tile

Required API key scopes

dashboard:write

Path parameters

  • id
    integer

Query parameters

  • format
    string
    One of: "json""txt"

Request parameters

  • to_dashboard
    integer
  • tile

Response


Example request

POST /api/projects/:project_id/dashboards/:id/move_tile
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl
-H 'Content-Type: application/json'\
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/:id/move_tile/\
-d to_dashboard="integer",\
-d tile=undefined

Example response

Status 200
RESPONSE
{
"id": 0,
"name": "string",
"description": "string",
"pinned": true,
"created_at": "2019-08-24T14:15:22Z",
"created_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"last_accessed_at": "2019-08-24T14:15:22Z",
"last_viewed_at": "2019-08-24T14:15:22Z",
"is_shared": true,
"deleted": true,
"creation_mode": "default",
"filters": {},
"variables": {},
"breakdown_colors": null,
"data_color_theme_id": 0,
"tags": [
null
],
"restriction_level": 21,
"effective_restriction_level": 21,
"effective_privilege_level": 21,
"user_access_level": "string",
"access_control_version": "string",
"last_refresh": "2019-08-24T14:15:22Z",
"persisted_filters": {},
"persisted_variables": {},
"team_id": 0,
"quick_filter_ids": [
"string"
],
"tiles": [
{}
],
"use_template": "string",
"use_dashboard": 0,
"delete_insights": false,
"_create_in_folder": "string"
}

Update dashboards move tile

Required API key scopes

dashboard:write

Path parameters

  • id
    integer

Query parameters

  • format
    string
    One of: "json""txt"

Request parameters

  • to_dashboard
    integer
  • tile

Response


Example request

PATCH /api/projects/:project_id/dashboards/:id/move_tile
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl -X PATCH \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/:id/move_tile/\
-d to_dashboard="integer"

Example response

Status 200
RESPONSE
{
"id": 0,
"name": "string",
"description": "string",
"pinned": true,
"created_at": "2019-08-24T14:15:22Z",
"created_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"last_accessed_at": "2019-08-24T14:15:22Z",
"last_viewed_at": "2019-08-24T14:15:22Z",
"is_shared": true,
"deleted": true,
"creation_mode": "default",
"filters": {},
"variables": {},
"breakdown_colors": null,
"data_color_theme_id": 0,
"tags": [
null
],
"restriction_level": 21,
"effective_restriction_level": 21,
"effective_privilege_level": 21,
"user_access_level": "string",
"access_control_version": "string",
"last_refresh": "2019-08-24T14:15:22Z",
"persisted_filters": {},
"persisted_variables": {},
"team_id": 0,
"quick_filter_ids": [
"string"
],
"tiles": [
{}
],
"use_template": "string",
"use_dashboard": 0,
"delete_insights": false,
"_create_in_folder": "string"
}

Create dashboards reorder tiles

Required API key scopes

dashboard:write

Path parameters

  • id
    integer

Query parameters

  • format
    string
    One of: "json""txt"

Request parameters

  • tile_order
    array
  • layout
    Default: preserve

Response


Example request

POST /api/projects/:project_id/dashboards/:id/reorder_tiles
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl
-H 'Content-Type: application/json'\
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/:id/reorder_tiles/\
-d tile_order="array"

Example response

Status 200
RESPONSE
{
"id": 0,
"name": "string",
"description": "string",
"pinned": true,
"created_at": "2019-08-24T14:15:22Z",
"created_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"last_accessed_at": "2019-08-24T14:15:22Z",
"last_viewed_at": "2019-08-24T14:15:22Z",
"is_shared": true,
"deleted": true,
"creation_mode": "default",
"filters": {},
"variables": {},
"breakdown_colors": null,
"data_color_theme_id": 0,
"tags": [
null
],
"restriction_level": 21,
"effective_restriction_level": 21,
"effective_privilege_level": 21,
"user_access_level": "string",
"access_control_version": "string",
"last_refresh": "2019-08-24T14:15:22Z",
"persisted_filters": {},
"persisted_variables": {},
"team_id": 0,
"quick_filter_ids": [
"string"
],
"tiles": [
{}
],
"use_template": "string",
"use_dashboard": 0,
"delete_insights": false,
"_create_in_folder": "string"
}

Retrieve dashboards run insights

Run all insights on a dashboard and return their results.

Required API key scopes

query:read

Path parameters

  • id
    integer

Query parameters

  • filters_override
    string
  • format
    string
    One of: "json""txt"
  • output_format
    string
    One of: "json""optimized"
  • refresh
    string
    One of: "blocking""force_blocking""force_cache"
  • variables_override
    string

Response


Example request

GET /api/projects/:project_id/dashboards/:id/run_insights
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/:id/run_insights/

Example response

Status 200
RESPONSE
{
"results": [
{
"id": 0,
"insight": {
"id": 0,
"short_id": "string",
"name": "string",
"derived_name": "string",
"result": null
}
}
]
}

Retrieve dashboards run widgets

Required API key scopes

dashboard:read

Path parameters

  • id
    integer

Query parameters

  • format
    string
    One of: "json""txt"
  • tile_ids
    string

Response


Example request

GET /api/projects/:project_id/dashboards/:id/run_widgets
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/:id/run_widgets/

Example response

Status 200
RESPONSE
{
"results": [
{
"tile_id": 0,
"widget_type": "string",
"result": null,
"error": "string"
}
]
}

Create dashboards snapshot

Snapshot the current dashboard state (from cache) for AI analysis. Returns a cache_key representing the 'before' state, to be used with analyze_refresh_result.

Path parameters

  • id
    integer

Query parameters

  • format
    string
    One of: "json""txt"

Request parameters

  • name
    stringnull
  • description
    string
  • pinned
    boolean
  • last_accessed_at
    stringnull
  • deleted
    boolean
  • breakdown_colors
  • data_color_theme_id
    integernull
  • tags
    array
  • restriction_level
  • last_refresh
    stringnull
  • quick_filter_ids
    arraynull
  • use_template
    string
  • use_dashboard
    integernull
  • delete_insights
    boolean
    Default: false
  • _create_in_folder
    string

Example request

POST /api/projects/:project_id/dashboards/:id/snapshot
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl
-H 'Content-Type: application/json'\
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/:id/snapshot/\
-d name=["string","null"]

Example response

Status 200 No response body

Retrieve dashboards stream tiles

Stream dashboard metadata and tiles via Server-Sent Events. Sends metadata first, then tiles as they are rendered.

Path parameters

  • id
    integer

Query parameters

  • filters_override
    string
  • format
    string
    One of: "json""txt"
  • layoutSize
    string
    One of: "sm""xs"
  • variables_override
    string

Example request

GET /api/projects/:project_id/dashboards/:id/stream_tiles
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/:id/stream_tiles/

Example response

Status 200 No response body

Create dashboards update text tile

Update the markdown body, layout, or color of an existing text tile on a dashboard.

Required API key scopes

dashboard:write

Path parameters

  • id
    integer

Query parameters

  • format
    string
    One of: "json""txt"

Request parameters

  • tile_id
    integer
  • body
    string
  • layouts
  • color
    stringnull

Response


Example request

POST /api/projects/:project_id/dashboards/:id/update_text_tile
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl
-H 'Content-Type: application/json'\
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/:id/update_text_tile/\
-d tile_id="integer"

Example response

Status 200
RESPONSE
{
"id": 0,
"insight": {
"id": 0,
"short_id": "string",
"name": "string",
"derived_name": "string",
"query": {
"embedded": null,
"full": null,
"hidePersonsModal": null,
"hideTooltipOnScroll": null,
"kind": "InsightVizNode",
"showCorrelationTable": null,
"showFilters": null,
"showHeader": null,
"showLastComputation": null,
"showLastComputationRefresh": null,
"showResults": null,
"showTable": null,
"source": {
"aggregation_group_type_index": null,
"breakdownFilter": null,
"calendarHeatmapFilter": null,
"compareFilter": null,
"conversionGoal": null,
"dataColorTheme": null,
"dateRange": null,
"filterTestAccounts": false,
"interval": "day",
"kind": "TrendsQuery",
"modifiers": null,
"properties": [],
"response": null,
"samplingFactor": null,
"series": [
{
"custom_name": null,
"fixedProperties": null,
"kind": "GroupNode",
"limit": null,
"math": null,
"math_group_type_index": null,
"math_hogql": null,
"math_multiplier": null,
"math_property": null,
"math_property_revenue_currency": null,
"math_property_type": null,
"name": null,
"nodes": [
{
"custom_name": null,
"event": null,
"fixedProperties": null,
"kind": "EventsNode",
"limit": null,
"math": null,
"math_group_type_index": null,
"math_hogql": null,
"math_multiplier": null,
"math_property": null,
"math_property_revenue_currency": null,
"math_property_type": null,
"name": null,
"optionalInFunnel": null,
"orderBy": null,
"properties": null,
"response": null,
"version": null
}
],
"operator": "AND",
"optionalInFunnel": null,
"orderBy": null,
"properties": null,
"response": null,
"version": null
}
],
"tags": null,
"trendsFilter": null,
"version": null
},
"suppressSessionAnalysisWarning": null,
"version": null,
"vizSpecificOptions": null
},
"order": -2147483648,
"deleted": true,
"dashboards": [
0
],
"dashboard_tiles": [
{
"id": 0,
"dashboard_id": 0,
"deleted": true
}
],
"last_refresh": "2019-08-24T14:15:22Z",
"cache_target_age": "2019-08-24T14:15:22Z",
"next_allowed_client_refresh": "2019-08-24T14:15:22Z",
"result": null,
"hasMore": true,
"columns": [
"string"
],
"created_at": "2019-08-24T14:15:22Z",
"created_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"description": "string",
"updated_at": "2019-08-24T14:15:22Z",
"tags": [
null
],
"favorited": true,
"last_modified_at": "2019-08-24T14:15:22Z",
"last_modified_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"is_sample": true,
"effective_restriction_level": 21,
"effective_privilege_level": 21,
"user_access_level": "string",
"timezone": "string",
"is_cached": true,
"query_status": null,
"hogql": "string",
"types": [
null
],
"resolved_date_range": {
"date_from": "2019-08-24T14:15:22Z",
"date_to": "2019-08-24T14:15:22Z"
},
"_create_in_folder": "string",
"alerts": [
null
],
"last_viewed_at": "2019-08-24T14:15:22Z"
},
"text": {
"id": 0,
"created_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"last_modified_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"body": "string",
"dashboard_tiles": [
{
"id": 0,
"dashboard_id": 0,
"deleted": true
}
],
"last_modified_at": "2019-08-24T14:15:22Z",
"team": 0
},
"button_tile": {
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"created_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"last_modified_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"url": "string",
"text": "string",
"placement": "left",
"dashboard_tiles": [
{
"id": 0,
"dashboard_id": 0,
"deleted": true
}
],
"style": "primary",
"last_modified_at": "2019-08-24T14:15:22Z",
"team": 0
},
"widget": {
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"created_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"last_modified_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"widget_type": "string",
"name": "string",
"description": "string",
"config": {
"limit": 10,
"orderBy": "occurrences",
"orderDirection": "DESC",
"status": "active",
"dateRange": {
"date_from": "-14d"
},
"filterTestAccounts": true
},
"dashboard_tiles": [
{
"id": 0,
"dashboard_id": 0,
"deleted": true
}
],
"last_modified_at": "2019-08-24T14:15:22Z",
"team": 0
},
"layouts": null,
"color": "string",
"filters_overrides": null,
"show_description": true,
"transparent_background": true
}

Create dashboards widgets batch

Add multiple widget tiles to a dashboard in one atomic request.

Required API key scopes

dashboard:write

Path parameters

  • id
    integer

Query parameters

  • format
    string
    One of: "json""txt"

Request parameters

  • widgets
    Click to open
    array

Response


Example request

POST /api/projects/:project_id/dashboards/:id/widgets/batch
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl
-H 'Content-Type: application/json'\
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/:id/widgets/batch/\
-d widgets="array"

Example response

Status 201
RESPONSE
{
"tiles": [
{
"id": 0,
"insight": {
"id": 0,
"short_id": "string",
"name": "string",
"derived_name": "string",
"query": {
"embedded": null,
"full": null,
"hidePersonsModal": null,
"hideTooltipOnScroll": null,
"kind": "InsightVizNode",
"showCorrelationTable": null,
"showFilters": null,
"showHeader": null,
"showLastComputation": null,
"showLastComputationRefresh": null,
"showResults": null,
"showTable": null,
"source": {
"aggregation_group_type_index": null,
"breakdownFilter": null,
"calendarHeatmapFilter": null,
"compareFilter": null,
"conversionGoal": null,
"dataColorTheme": null,
"dateRange": null,
"filterTestAccounts": false,
"interval": "day",
"kind": "TrendsQuery",
"modifiers": null,
"properties": [],
"response": null,
"samplingFactor": null,
"series": [
{
"custom_name": null,
"fixedProperties": null,
"kind": "GroupNode",
"limit": null,
"math": null,
"math_group_type_index": null,
"math_hogql": null,
"math_multiplier": null,
"math_property": null,
"math_property_revenue_currency": null,
"math_property_type": null,
"name": null,
"nodes": [
{
"custom_name": null,
"event": null,
"fixedProperties": null,
"kind": "EventsNode",
"limit": null,
"math": null,
"math_group_type_index": null,
"math_hogql": null,
"math_multiplier": null,
"math_property": null,
"math_property_revenue_currency": null,
"math_property_type": null,
"name": null,
"optionalInFunnel": null,
"orderBy": null,
"properties": null,
"response": null,
"version": null
}
],
"operator": "AND",
"optionalInFunnel": null,
"orderBy": null,
"properties": null,
"response": null,
"version": null
}
],
"tags": null,
"trendsFilter": null,
"version": null
},
"suppressSessionAnalysisWarning": null,
"version": null,
"vizSpecificOptions": null
},
"order": -2147483648,
"deleted": true,
"dashboards": [
0
],
"dashboard_tiles": [
{
"id": 0,
"dashboard_id": 0,
"deleted": true
}
],
"last_refresh": "2019-08-24T14:15:22Z",
"cache_target_age": "2019-08-24T14:15:22Z",
"next_allowed_client_refresh": "2019-08-24T14:15:22Z",
"result": null,
"hasMore": true,
"columns": [
"string"
],
"created_at": "2019-08-24T14:15:22Z",
"created_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"description": "string",
"updated_at": "2019-08-24T14:15:22Z",
"tags": [
null
],
"favorited": true,
"last_modified_at": "2019-08-24T14:15:22Z",
"last_modified_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"is_sample": true,
"effective_restriction_level": 21,
"effective_privilege_level": 21,
"user_access_level": "string",
"timezone": "string",
"is_cached": true,
"query_status": null,
"hogql": "string",
"types": [
null
],
"resolved_date_range": {
"date_from": "2019-08-24T14:15:22Z",
"date_to": "2019-08-24T14:15:22Z"
},
"_create_in_folder": "string",
"alerts": [
null
],
"last_viewed_at": "2019-08-24T14:15:22Z"
},
"text": {
"id": 0,
"created_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"last_modified_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"body": "string",
"dashboard_tiles": [
{
"id": 0,
"dashboard_id": 0,
"deleted": true
}
],
"last_modified_at": "2019-08-24T14:15:22Z",
"team": 0
},
"button_tile": {
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"created_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"last_modified_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"url": "string",
"text": "string",
"placement": "left",
"dashboard_tiles": [
{
"id": 0,
"dashboard_id": 0,
"deleted": true
}
],
"style": "primary",
"last_modified_at": "2019-08-24T14:15:22Z",
"team": 0
},
"widget": {
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"created_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"last_modified_by": {
"id": 0,
"uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
"distinct_id": "string",
"first_name": "string",
"last_name": "string",
"email": "user@example.com",
"is_email_verified": true,
"hedgehog_config": {},
"role_at_organization": "engineering"
},
"widget_type": "string",
"name": "string",
"description": "string",
"config": {
"limit": 10,
"orderBy": "occurrences",
"orderDirection": "DESC",
"status": "active",
"dateRange": {
"date_from": "-14d"
},
"filterTestAccounts": true
},
"dashboard_tiles": [
{
"id": 0,
"dashboard_id": 0,
"deleted": true
}
],
"last_modified_at": "2019-08-24T14:15:22Z",
"team": 0
},
"layouts": null,
"color": "string",
"filters_overrides": null,
"show_description": true,
"transparent_background": true
}
]
}

Create dashboards bulk update tags

Bulk update tags on multiple objects.

PAT access: this action has no required_scopes= on the decorator — inheriting viewsets must add "bulk_update_tags" to their scope_object_write_actions list to accept personal API keys. Without that opt-in, APIScopePermission rejects PAT requests with "This action does not support personal API key access". Done per-viewset so granting <scope>:write for one resource doesn't leak access to sibling resources that share this mixin.

Accepts:

  • {"ids": [...], "action": "add"|"remove"|"set", "tags": ["tag1", "tag2"]}

Actions:

  • "add": Add tags to existing tags on each object
  • "remove": Remove specific tags from each object
  • "set": Replace all tags on each object with the provided list

Query parameters

  • format
    string
    One of: "json""txt"

Request parameters

  • ids
    array
  • action
  • tags
    array

Response


Example request

POST /api/projects/:project_id/dashboards/bulk_update_tags
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl
-H 'Content-Type: application/json'\
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/bulk_update_tags/\
-d ids="array",\
-d action=undefined,\
-d tags="array"

Example response

Status 200
RESPONSE
{
"updated": [
{
"id": 0,
"tags": [
"string"
]
}
],
"skipped": [
{
"id": 0,
"reason": "string"
}
]
}

Create dashboards create from template json

Query parameters

  • format
    string
    One of: "json""txt"

Request parameters

  • name
    stringnull
  • description
    string
  • pinned
    boolean
  • last_accessed_at
    stringnull
  • deleted
    boolean
  • breakdown_colors
  • data_color_theme_id
    integernull
  • tags
    array
  • restriction_level
  • last_refresh
    stringnull
  • quick_filter_ids
    arraynull
  • use_template
    string
  • use_dashboard
    integernull
  • delete_insights
    boolean
    Default: false
  • _create_in_folder
    string

Example request

POST /api/projects/:project_id/dashboards/create_from_template_json
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl
-H 'Content-Type: application/json'\
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/create_from_template_json/\
-d name=["string","null"]

Example response

Status 200 No response body

Create dashboards create unlisted dashboard

Creates an unlisted dashboard from template by tag. Enforces uniqueness (one per tag per team). Returns 409 if unlisted dashboard with this tag already exists.

Query parameters

  • format
    string
    One of: "json""txt"

Request parameters

  • name
    stringnull
  • description
    string
  • pinned
    boolean
  • last_accessed_at
    stringnull
  • deleted
    boolean
  • breakdown_colors
  • data_color_theme_id
    integernull
  • tags
    array
  • restriction_level
  • last_refresh
    stringnull
  • quick_filter_ids
    arraynull
  • use_template
    string
  • use_dashboard
    integernull
  • delete_insights
    boolean
    Default: false
  • _create_in_folder
    string

Example request

POST /api/projects/:project_id/dashboards/create_unlisted_dashboard
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl
-H 'Content-Type: application/json'\
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/create_unlisted_dashboard/\
-d name=["string","null"]

Example response

Status 200 No response body

Retrieve dashboards widget catalog

List registered dashboard widget types and config hints for agents.

Required API key scopes

dashboard:read

Query parameters

  • format
    string
    One of: "json""txt"

Response


Example request

GET /api/projects/:project_id/dashboards/widget_catalog
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/dashboards/widget_catalog/

Example response

Status 200
RESPONSE
{
"results": [
{
"widget_type": "string",
"group_id": "string",
"group_label": "string",
"label": "string",
"description": "string",
"config_schema_hints": null,
"required_product_access": "string"
}
]
}

Community questions

Questions about this page? or post a community question.