Added

Data App Tile Management API

Manage individual tiles within data app dashboards without replacing the entire dashboard configuration. These endpoints enable granular tile-level operations — add, update, or remove tiles independently while maintaining optimistic concurrency control against the parent data app.

New Endpoints

  • POST /api/v1/accounts/{accountId}/data-products/{dataProductId}/data-apps/{dataAppId}/tiles — Add one or more tiles
  • PATCH /api/v1/accounts/{accountId}/data-products/{dataProductId}/data-apps/{dataAppId}/tiles/{tileId} — Update a tile
  • DELETE /api/v1/accounts/{accountId}/data-products/{dataProductId}/data-apps/{dataAppId}/tiles/{tileId} — Remove a tile

What's New

  • Granular tile management: Add, update, or remove individual tiles without overwriting the full dashboardJson.
  • Batch tile creation: POST accepts an array of tiles and optional layout placements in a single request.
  • Promotability validation: POST and PATCH validate that tile data sources are fully specified (static tiles require data, query tiles require SQL).
  • Optimistic concurrency: All mutations require the parent data app's updatedAt timestamp. Returns 409 Conflict on stale writes.
  • Full data app response: All tile mutations return the complete updated data app so clients always have the latest state.

Request Examples

Create Tiles (POST)

{
  "tiles": [
    {
      "id": "revenue-chart",
      "title": "Monthly Revenue",
      "dataSource": { "type": "query", "sql": "SELECT month, revenue FROM sales" },
      "display": { "chartType": "bar", "dimension": "month", "metrics": ["revenue"] }
    }
  ],
  "layout": [{ "tileId": "revenue-chart", "x": 0, "y": 0, "w": 6, "h": 4 }],
  "updatedAt": "2026-03-19T12:00:00.000Z"
}

Update Tile (PATCH)

{
  "title": "Quarterly Revenue",
  "dataSource": {
    "type": "query",
    "sql": "SELECT quarter, SUM(revenue) FROM sales GROUP BY quarter"
  },
  "updatedAt": "2026-03-19T12:01:00.000Z"
}

Delete Tile (DELETE)

{
  "updatedAt": "2026-03-19T12:02:00.000Z"
}

Getting Started

  1. Fetch the data app to get the current updatedAt value.
  2. Use POST to add tiles, PATCH to modify, or DELETE to remove.
  3. Pass the updatedAt from the response into your next mutation to maintain concurrency safety.