InsightsCreate or update insight

Create or update insight

Create a new insight, or update an existing one when an id is included in the body. Requires an agency key (ak_) and ?location_id=. On update, the insight must belong to the resolved location. Returns the saved row.

The body is validated on write: exactly one of config.query (a valid explore spec whose kind fits insight_type: funnel ⇔ funnel, attribution → table/bar/number, otherwise trend) or config.analysis (a constraint finder, correlation or scanner summary panel). A bad config is a 400 here, never a 500 on the first run.

curl -X POST "https://mythic-analytics.gulp.workers.dev/builder/insights?location_id=acme-retail" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -d '{
  "id": "123e4567-e89b-12d3-a456-426614174000",
  "name": "Daily visitors",
  "description": "Unique visitors per day, last 30 days vs the 30 before",
  "insight_type": "number",
  "config": {
    "query": {
      "kind": "trend",
      "date_range": {
        "preset": "30d"
      },
      "interval": "day",
      "series": [
        {
          "event": "$pageview",
          "math": "dau",
          "label": "Visitors"
        }
      ],
      "compare": "previous_period"
    }
  }
}'
{
  "data": {
    "id": "123e4567-e89b-12d3-a456-426614174000",
    "location_id": "acme-retail",
    "data_connection_id": "123e4567-e89b-12d3-a456-426614174000",
    "created_by": "123e4567-e89b-12d3-a456-426614174000",
    "name": "Daily visitors",
    "description": "example_string",
    "insight_type": "number",
    "config": {
      "query": {
        "kind": "trend",
        "date_range": {
          "preset": "30d"
        },
        "interval": "day",
        "series": [
          {
            "event": "$pageview",
            "math": "dau",
            "label": "Visitors"
          }
        ],
        "compare": "previous_period"
      }
    },
    "visualization": {},
    "is_embeddable": false,
    "embed_token": "9f8a7b6c5d4e3f2a1b0c9d8e7f6a5b4c",
    "tags": [
      "funnel",
      "paid"
    ],
    "canvas_id": "123e4567-e89b-12d3-a456-426614174000",
    "is_favorite": false,
    "created_at": "2024-12-25T10:00:00Z",
    "updated_at": "2024-12-25T10:00:00Z"
  }
}
POST
/insights
POST
Base URLstring

Target server for requests. Edit to use your own host.

Bearer Token
Bearer Tokenstring
Required

Builder key as a bearer token. Use an agency key (Bearer ak_...) for writes, or a viewer key (Bearer sk_...) for reads. Scoped keys (mcp_) with insights:read/insights:write are accepted too.

Builder key as a bearer token. Use an agency key (Bearer ak_...) for writes, or a viewer key (Bearer sk_...) for reads. Scoped keys (mcp_) with insights:read/insights:write are accepted too.
query
location_idstring

Client location to scope the request to. Required when authenticating with an agency key (ak_). Ignored for viewer keys (sk_).

Content-Typestring
Required

The media type of the request body

Options: application/json
idstring

Include to update an existing insight; omit to create.

Format: uuid
insight_typestring
Required

Visualization only. funnel draws a kind: funnel spec; table, bar and number can also draw kind: attribution; the others draw a kind: trend spec (line/table want an interval, number/bar/pie usually don't). Analysis panels: constraints → table/number/bar, correlation → line/table, scanner_summary → pie/bar/line/table/number.

Options: number, line, bar, pie, table, funnel
configobject
Required

Exactly one of query or analysis. query is an explore spec — the same object POST /client/v1/data/query takes (trend, funnel, or attribution for ad spend, CPA and ROAS); the full grammar is on the Explore queries page and a per-type walkthrough on the Insight config reference. analysis runs a constraint finder, correlation or scanner summary as the viewer (not on public or embedded dashboards). Any other key is stored verbatim as display settings and never read by the runner, except metric on an attribution number.

Request Preview
Response

Response will appear here after sending the request

Authentication

header
Authorizationstring
Required

Bearer token. Builder key as a bearer token. Use an agency key (Bearer ak_...) for writes, or a viewer key (Bearer sk_...) for reads. Scoped keys (mcp_) with insights:read/insights:write are accepted too.

Query Parameters

location_idstring

Client location to scope the request to. Required when authenticating with an agency key (ak_). Ignored for viewer keys (sk_).

Example:
acme-retail

Body

application/json
idstring

Include to update an existing insight; omit to create.

namestring
Required
Example:
Daily visitors
descriptionstring
Example:
Unique visitors per day, last 30 days vs the 30 before
insight_typestring
Required

Visualization only. funnel draws a kind: funnel spec; table, bar and number can also draw kind: attribution; the others draw a kind: trend spec (line/table want an interval, number/bar/pie usually don't). Analysis panels: constraints → table/number/bar, correlation → line/table, scanner_summary → pie/bar/line/table/number.

Allowed values:numberlinebarpietablefunnel
configobject
Required

Exactly one of query or analysis. query is an explore spec — the same object POST /client/v1/data/query takes (trend, funnel, or attribution for ad spend, CPA and ROAS); the full grammar is on the Explore queries page and a per-type walkthrough on the Insight config reference. analysis runs a constraint finder, correlation or scanner summary as the viewer (not on public or embedded dashboards). Any other key is stored verbatim as display settings and never read by the runner, except metric on an attribution number.

Example:
{"query":{"kind":"trend","date_range":{"preset":"30d"},"interval":"day","series":[{"event":"$pageview","math":"dau","label":"Visitors"}],"compare":"previous_period"}}

Responses

dataobject