This API lets you create, update, and list Custom Charts gadgets on a Jira dashboard programmatically — without going through the dashboard UI.
A common use case is copying gadgets from one Jira site to another: read the gadgets from a dashboard on the source site, then recreate them on the target site. The optional source fields (see below) let you record where each copied gadget originally came from, so you can match them up later.
The base URL depends on the data residency region your Custom Charts install is hosted in:
| Region | Base URL |
|---|---|
| EU | https://eu.custom-charts-jira.amovos-apps.com |
| US | https://us.custom-charts-jira.amovos-apps.com |
| Default (routed) | https://custom-charts-jira.amovos-apps.com |
All endpoints are scoped to a single dashboard, under that base URL:
<base-url>/api/custom-charts/1.0/dashboards/{dashboardId}/gadgets
Personal Access Tokens must be enabled in the app before any of the endpoints below are reachable:
While the feature is disabled, token issuance is hidden from users and API
requests return 404 regardless of any token value.
All endpoints require a Personal Access Token issued by Custom Charts,
supplied as a Bearer token in the Authorization header:
Authorization: Bearer <token>
<jira>/jira/settings/personal/general.Tokens are scoped to the issuing user — every API call is performed as that user and inherits their Jira permissions on the target dashboard.
The API only operates on Custom Charts gadgets. Non-CC gadgets (Jira
built-ins, gadgets from other apps) are invisible — read endpoints return
404, write endpoints return 400.
gadgetType value |
Description |
|---|---|
custom-chart-dashboard-item |
Custom Chart |
simple-search-dashboard-item |
Simple Search |
issue-list-dashboard-item |
Issue List |
shared-dashboard-dashboard-item |
Shared Dashboard |
When you copy a gadget from another Atlassian site, you can record where it
came from using three optional fields: sourceGadgetId,
sourceDashboardId, and sourceSiteUrl.
POST and PUT, it's all-or-nothing: if you send one, you must send
all three. Sending only some returns 400. A blank sourceSiteUrl counts
as not sent.PATCH, you can send any of them; the ones you send are updated and the
rest keep their current values.These fields are stored separately and are not returned by default — set
the includeSource query parameter to get them back.
Every error (except the existence-hiding 404 below) returns a unified body:
{
"statusCode": 400,
"errorCode": "VALIDATION_FAILED",
"message": "gadgetType must be one of the supported types",
"atlTraceId": "…",
"details": { }
}
errorCode is a stable, machine-readable category — switch on it rather than
parsing message. atlTraceId and details appear only when relevant.
errorCode |
Typical status | Meaning |
|---|---|---|
INVALID_TOKEN |
401 |
Missing/invalid/expired token. |
VALIDATION_FAILED |
400 |
Bad input — invalid gadgetType, partial source, non-CC gadget, … |
GADGET_NOT_FOUND |
404 |
Dashboard or gadget not found. |
SOURCE_CONFLICT |
409 |
Duplicate sourceGadgetId with validateUniqueSource=true. |
RATE_LIMITED |
429 |
Too many requests. See Retry-After / X-RateLimit-* headers. |
UPSTREAM_JIRA_ERROR |
upstream / 500 |
A downstream Jira call failed; status may pass through. |
INTERNAL_ERROR |
500 |
Unexpected server error. |
When the Personal Access Tokens feature is disabled, the API hides its existence: every request returns
404with a minimal body{ "statusCode": 404, "message": "HTTP 404 Not Found" }(noerrorCode).
Returns all Custom Charts gadgets on the dashboard.
| dashboardId required | integer <int64> Jira dashboard ID. |
| includeSource | boolean Default: false When |
{- "gadgets": [
- {
- "gadgetId": 42765,
- "dashboardId": 12733,
- "gadgetType": "custom-chart-dashboard-item",
- "column": 0,
- "row": 0,
- "color": "green",
- "title": "Issues by status",
- "sourceGadgetId": 1234,
- "sourceDashboardId": 5678,
- "configuration": { }
}
], - "total": 0
}| dashboardId required | integer <int64> Jira dashboard ID. |
| validateUniqueSource | boolean Default: false When |
| gadgetType required | string (GadgetType) Enum: "custom-chart-dashboard-item" "simple-search-dashboard-item" "issue-list-dashboard-item" "shared-dashboard-dashboard-item" One of the four supported Custom Charts gadget types. |
object Optional. When omitted, the gadget is placed at the top-left of the dashboard (column 0, row 0) and Jira reflows the existing gadgets down. When provided, both | |
| color | string Jira-defined color name. |
| title | string |
| sourceGadgetId | integer <int64> Send together with the other two source fields, or not at all. |
| sourceDashboardId | integer <int64> Send together with the other two source fields, or not at all. |
| sourceSiteUrl | string Send together with the other two source fields, or not at all. Must not be blank when set. |
required | object (Configuration) Gadget-type-specific configuration. The same shape is used on read and write: the
Why uniqueness matters: a |
{- "gadgetType": "custom-chart-dashboard-item",
- "position": {
- "column": 0,
- "row": 0
}, - "color": "green",
- "title": "Issues by status",
- "sourceGadgetId": 1234,
- "sourceDashboardId": 5678,
- "configuration": { }
}{- "gadgetId": 42765,
- "dashboardId": 12733,
- "gadgetType": "custom-chart-dashboard-item",
- "column": 0,
- "row": 0,
- "color": "green",
- "title": "Issues by status",
- "sourceGadgetId": 1234,
- "sourceDashboardId": 5678,
- "configuration": { }
}| dashboardId required | integer <int64> Jira dashboard ID. |
| gadgetId required | integer <int64> Dashboard-item ID assigned by Jira when the gadget is added. |
| includeSource | boolean Default: false When |
{- "gadgetId": 42765,
- "dashboardId": 12733,
- "gadgetType": "custom-chart-dashboard-item",
- "column": 0,
- "row": 0,
- "color": "green",
- "title": "Issues by status",
- "sourceGadgetId": 1234,
- "sourceDashboardId": 5678,
- "configuration": { }
}Replaces the gadget's configuration and (optionally) the source fields. Does not change position, color or title. If you don't send the source fields, their current values are kept.
| dashboardId required | integer <int64> Jira dashboard ID. |
| gadgetId required | integer <int64> Dashboard-item ID assigned by Jira when the gadget is added. |
| gadgetType | string (GadgetType) Enum: "custom-chart-dashboard-item" "simple-search-dashboard-item" "issue-list-dashboard-item" "shared-dashboard-dashboard-item" One of the four supported Custom Charts gadget types. |
object (Configuration) Gadget-type-specific configuration. The same shape is used on read and write: the
Why uniqueness matters: a | |
| sourceGadgetId | integer <int64> |
| sourceDashboardId | integer <int64> |
| sourceSiteUrl | string Must be non-blank when set. |
{- "gadgetType": "custom-chart-dashboard-item",
- "configuration": {
- "title": "Renamed chart"
}
}{- "gadgetId": 42765,
- "dashboardId": 12733,
- "gadgetType": "custom-chart-dashboard-item",
- "column": 0,
- "row": 0,
- "color": "green",
- "title": "Issues by status",
- "sourceGadgetId": 1234,
- "sourceDashboardId": 5678,
- "configuration": { }
}Partial update — all fields are optional. At least one of gadgetType or configuration must be present. See the schema notes for merge semantics. Unlike POST/PUT, PATCH does not return the updated gadget.
| dashboardId required | integer <int64> Jira dashboard ID. |
| gadgetId required | integer <int64> Dashboard-item ID assigned by Jira when the gadget is added. |
| gadgetType | string (GadgetType) Enum: "custom-chart-dashboard-item" "simple-search-dashboard-item" "issue-list-dashboard-item" "shared-dashboard-dashboard-item" One of the four supported Custom Charts gadget types. |
object (Configuration) Gadget-type-specific configuration. The same shape is used on read and write: the
Why uniqueness matters: a | |
| sourceGadgetId | integer <int64> |
| sourceDashboardId | integer <int64> |
| sourceSiteUrl | string Must be non-blank when set. |
{- "gadgetType": "custom-chart-dashboard-item",
- "configuration": {
- "title": "Renamed chart"
}
}{- "success": true
}| dashboardId required | integer <int64> Jira dashboard ID. |
| gadgetId required | integer <int64> Dashboard-item ID assigned by Jira when the gadget is added. |
{- "statusCode": 400,
- "errorCode": "VALIDATION_FAILED",
- "message": "gadgetType must be one of the supported types"
}Looks up a gadget on the dashboard whose stored sourceGadgetId matches the path parameter. Always includes the source fields in the response.
Performance note: This endpoint fetches the "source" property for every Custom Charts gadget on the dashboard (N round-trips).
| dashboardId required | integer <int64> Jira dashboard ID. |
| sourceGadgetId required | integer <int64> The gadget's ID on the site it was copied from. |
{- "gadgetId": 42765,
- "dashboardId": 12733,
- "gadgetType": "custom-chart-dashboard-item",
- "column": 0,
- "row": 0,
- "color": "green",
- "title": "Issues by status",
- "sourceGadgetId": 1234,
- "sourceDashboardId": 5678,
- "configuration": { }
}Same semantics as PATCH /gadgets/{gadgetId}, but the target gadget is found by the stored sourceGadgetId instead of its Jira gadget id.
| dashboardId required | integer <int64> Jira dashboard ID. |
| sourceGadgetId required | integer <int64> The gadget's ID on the site it was copied from. |
| gadgetType | string (GadgetType) Enum: "custom-chart-dashboard-item" "simple-search-dashboard-item" "issue-list-dashboard-item" "shared-dashboard-dashboard-item" One of the four supported Custom Charts gadget types. |
object (Configuration) Gadget-type-specific configuration. The same shape is used on read and write: the
Why uniqueness matters: a | |
| sourceGadgetId | integer <int64> |
| sourceDashboardId | integer <int64> |
| sourceSiteUrl | string Must be non-blank when set. |
{- "gadgetType": "custom-chart-dashboard-item",
- "configuration": {
- "title": "Renamed chart"
}
}{- "success": true
}| dashboardId required | integer <int64> Jira dashboard ID. |
| sourceGadgetId required | integer <int64> The gadget's ID on the site it was copied from. |
{- "statusCode": 400,
- "errorCode": "VALIDATION_FAILED",
- "message": "gadgetType must be one of the supported types"
}