Discovery & Templates
Template discovery endpoints. They all answer the same shape: a collection
of suggestions, each with the detective that produced it and a value
payload ready to feed the corresponding builder UI.
GET /api/datasets/{id}/discover
Suggest visuals for a chosen set of fields: each item's value.component is
a ready-to-POST visual starter.
Authentication: Required
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
fields | array | Field names to base suggestions on (comma-separated or repeated) |
alias | string | Report-Dataset alias context |
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasets/admin%3Anorthwind-orders/discover"
}
},
"items": [
{
"detective": "chart-single-group",
"id": "chart-single-group:0",
"value": {
"component": {
"chart": {
"dataset": "00000000-0000-4000-8000-000000000001",
"x": "ShipCountry",
"series": [
{
"y": "sum:orderAmount",
"type": "bar"
}
],
"legend": {
"enabled": false,
"maxHeight": 70
}
}
}
}
},
{
"detective": "country-map",
"id": "country-map:0",
"value": {
"component": {
"map": {
"dataset": "00000000-0000-4000-8000-000000000001",
"field": "ShipCountry",
"group": "world",
"map": "world/world-lowres",
"joinBy": "name",
"y": "sum:orderAmount"
}
}
}
},
{
"detective": "kpi",
"id": "kpi:0",
"value": {
"component": {
"kpi": {
"dataset": "00000000-0000-4000-8000-000000000001",
"y": "sum:orderAmount"
}
}
}
},
"… 2 more items (5 total) — omitted from docs"
],
"start": 0,
"count": 5,
"total": 5
}
GET /api/datasets/{id}/visual-templates
List every visual type that can be built on this Dataset, with starter component configs. The starters are seeded with sampled example fields from the Dataset.
Authentication: Required
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasets/admin%3Anorthwind-orders/visual-templates"
}
},
"items": [
{
"detective": "datasetGrid",
"id": "datasetGrid:0",
"value": {
"group": "Tables",
"label": "Data Grid",
"component": {
"datasetGrid": {
"dataset": "00000000-0000-4000-8000-000000000001"
}
}
}
},
{
"detective": "pivot-viz",
"id": "pivot-viz:0",
"value": {
"group": "Tables",
"label": "Pivot Table",
"component": {
"pivot": {
"dataset": "00000000-0000-4000-8000-000000000001",
"alias": "00000000-0000-4000-8000-000000000001",
"layout": "tabular"
}
}
}
},
{
"detective": "summary-viz",
"id": "summary-viz:0",
"value": {
"group": "Tables",
"label": "Summary Table",
"component": {
"summary": {
"dataset": "00000000-0000-4000-8000-000000000001",
"alias": "00000000-0000-4000-8000-000000000001"
}
}
}
},
"… 16 more items (19 total) — omitted from docs"
],
"start": 0,
"count": 19,
"total": 19
}
GET /api/dataset-templates
List the ways a new Dataset can be built (upload a file, query a Datasource,
…), as editorComponent configs for the new-Dataset dialog.
Authentication: Required
{
"_links": {
"self": {
"href": "https://informer.example.com/api/dataset-templates"
}
},
"items": [
{
"detective": "00000000-0000-4000-8000-000000000001",
"id": "00000000-0000-4000-8000-000000000001:0",
"value": {
"group": "__top",
"groupPriority": 500,
"name": "Upload a File",
"priority": 100,
"editorComponent": {
"newDatasetDialog": {
"name": "Upload a File",
"description": "Create a Dataset from a File containing data, such as an Excel Spreadsheet",
"color": "blueGrey",
"component": "newDatasetFileUploadEditor"
}
},
"dataset": {}
}
},
{
"detective": "00000000-0000-4000-8000-000000000002",
"id": "00000000-0000-4000-8000-000000000002:0",
"value": {
"group": "__top",
"groupPriority": 1000,
"name": "Native SQL",
"priority": 10,
"iconSvg": "/images/query/native-sql-query.svg",
"editOnCreate": true,
"editorComponent": {
"newDatasetDialog": {
"name": "Native SQL",
"description": "Create a Dataset based on your own SQL statement",
"iconSvg": "/images/query/native-sql-query.svg",
"color": "deepPurple",
"component": {
"newDatasetNativeSqlEditor": {
"datasources": [
{
"defaultLinkType": "sql",
"aiSystemMessage": "This is a PostgresSQL database. Identifiers are case-sensitive by default. \n Always surround all column names, table names, and schema names in double-quotes (\"). \n For example:\n SELECT \"OrderID\", \"ShipCountry\" FROM \"public\".\"orders\" WHERE \"ShipCity\" = 'Raleigh';\n ---",
"family": "sql",
"languages": [
"informer",
"sql",
"distinctValue",
"… 2 more items (5 total) — omitted from docs"
],
"naturalId": "admin:northwind",
"image": "/opt/informer/packages/informer-server/modules/sql/images/postgres.svg",
"compatibility": [],
"permissions": {
"assignTags": false,
"edit": false,
"delete": false,
"share": false,
"write": false,
"changeOwner": false,
"ping": false,
"scan": false,
"downloadSchema": false,
"importData": false,
"importSchema": false,
"rename": false,
"editConnection": false,
"createLink": false,
"setWrite": false,
"createSuite": false,
"createFieldExpression": false,
"createMapping": false,
"bundle": false,
"query": false
},
"id": "00000000-0000-4000-8000-000000000003",
"tenant": "acme",
"ownerId": "admin",
"slug": "northwind",
"name": "Northwind",
"description": null,
"embedded": false,
"type": "postgres",
"connection": {
"host": "localhost",
"pool": {
"max": 5,
"min": 0,
"idle": 10000,
"acquire": 10000
},
"port": 5432,
"user": "northwinduser",
"database": "northwind",
"password": "encrypted:iv:0000000000000000",
"idleTimeoutMillis": 7
},
"scannedAt": "2026-01-15T16:20:00.000Z",
"schemaUpdatedAt": "2026-01-15T16:20:00.000Z",
"rescanRequired": false,
"shared": false,
"schemas": "(omitted)",
"source": null,
"sourceId": null,
"settings": {
"multiSchema": false,
"useFakeData": false,
"remoteQueryBatchSize": {
"multiKey": 500,
"singleKey": 500
},
"usePreparedStatements": false
},
"data": null,
"appId": null,
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"folderId": null,
"fileId": null
}
]
}
}
}
},
"dataset": {
"query": {}
}
}
},
{
"detective": "00000000-0000-4000-8000-000000000004",
"id": "00000000-0000-4000-8000-000000000004:0",
"value": {
"group": "Northwind",
"groupPriority": 10,
"name": "Northwind Orders",
"description": "A pre-built Dataset that shows all the orders in the Northwind Datasource",
"image": "/opt/informer/packages/informer-server/modules/sql/images/postgres.svg",
"editorComponent": {
"newDatasetDialog": {
"name": "Northwind Orders",
"description": "A pre-built Dataset that shows all the orders in the Northwind Datasource",
"materialIcon": "shopping_cart",
"color": "blue",
"component": "newDatasetBasicEditor"
}
},
"dataset": {
"name": "Northwind Orders",
"description": "A Dataset consisting of all orders in the Northwind system (public schema)",
"namespace": "admin",
"source": "northwind-datasets",
"query": {
"embedded": true,
"language": "informer",
"datasourceId": "00000000-0000-4000-8000-000000000003",
"flow": [
{
"calculatedField": {
"alias": "salesperson",
"label": "Salesperson",
"script": "FirstName + ' ' + LastName"
}
},
{
"calculatedField": {
"alias": "orderAmount",
"label": "Order Amount",
"script": "UnitPrice * Quantity"
}
},
{
"calculatedField": {
"alias": "shipState",
"label": "Ship State",
"script": "ShipCountry === \"USA\" ? ShipRegion : null"
}
}
],
"payload": {
"source": {
"id": "00000000-0000-4000-8000-000000000003:public+orders",
"mappingId": "orders",
"schemaId": "public"
},
"fields": [
{
"id": "OrderDate",
"path": "OrderDate",
"type": "field",
"label": "Order Date",
"fieldId": "OrderDate",
"linkRef": null,
"rawType": "date",
"dataType": "date_tz",
"position": 0
},
{
"id": "RequiredDate",
"path": "RequiredDate",
"type": "field",
"label": "Required Date",
"fieldId": "RequiredDate",
"linkRef": null,
"rawType": "date",
"dataType": "date_tz",
"position": 1
},
{
"id": "ShipAddress",
"path": "ShipAddress",
"type": "field",
"label": "Ship Address",
"fieldId": "ShipAddress",
"linkRef": null,
"rawType": "character varying",
"dataType": "keyword_text",
"position": 2
},
"… 10 more items (13 total) — omitted from docs"
],
"linkRefs": [
{
"id": "employees",
"linkId": "00000000-0000-4000-8000-000000000003:public+orders:employees",
"details": {
"id": "00000000-0000-4000-8000-000000000003:public+orders:employees",
"defn": [
{
"toField": "EmployeeID",
"operator": "=",
"fromField": "EmployeeID",
"toMapping": "employees",
"fromMapping": "orders",
"toSchema": "public",
"fromSchema": "public"
}
],
"toId": "00000000-0000-4000-8000-000000000003:public+employees",
"type": "sql",
"fromId": "00000000-0000-4000-8000-000000000003:public+orders",
"linkId": "employees"
}
},
{
"id": "order-details",
"linkId": "00000000-0000-4000-8000-000000000003:public+orders:order-details",
"details": {
"id": "00000000-0000-4000-8000-000000000003:public+orders:order-details",
"defn": [
{
"toField": "OrderID",
"operator": "=",
"fromField": "OrderID",
"toMapping": "order_details",
"fromMapping": "orders",
"toSchema": "public",
"fromSchema": "public"
}
],
"toId": "00000000-0000-4000-8000-000000000003:public+order_details",
"type": "sql",
"fromId": "00000000-0000-4000-8000-000000000003:public+orders",
"linkId": "order-details"
}
},
{
"id": "order-details/products",
"linkId": "00000000-0000-4000-8000-000000000003:public+order_details:products",
"details": {
"id": "00000000-0000-4000-8000-000000000003:public+order_details:products",
"defn": [
{
"toField": "ProductID",
"operator": "=",
"fromField": "ProductID",
"toMapping": "products",
"fromMapping": "order_details",
"toSchema": "public",
"fromSchema": "public"
}
],
"toId": "00000000-0000-4000-8000-000000000003:public+products",
"type": "sql",
"fromId": "00000000-0000-4000-8000-000000000003:public+order_details",
"linkId": "products"
}
}
]
}
}
}
}
},
"… 1 more items (4 total) — omitted from docs"
],
"start": 0,
"count": 4,
"total": 4
}
GET /api/datasets/{id}/job-templates
List Job starters for the Dataset (for example a scheduled refresh), as prefilled Job payloads.
Authentication: Required
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasets/admin%3Anorthwind-orders/job-templates"
}
},
"items": [
{
"detective": "00000000-0000-4000-8000-000000000001",
"id": "00000000-0000-4000-8000-000000000001:0",
"value": {
"group": "__top",
"name": "New Job",
"description": "Access or refresh a Dataset, add Filters, and then perform various actions.",
"materialIcon": "lightbulb_outline",
"datasetId": "00000000-0000-4000-8000-000000000002",
"job": {
"name": "Refresh Northwind Orders",
"type": "smart-job",
"datasets": {
"northwindOrders": {
"datasetId": "00000000-0000-4000-8000-000000000002",
"refresh": true
}
},
"data": {
"actions": []
}
}
}
}
],
"start": 0,
"count": 1,
"total": 1
}
GET /api/datasets/{id}/jobs
List the Jobs that target this Dataset. The response is a plain array, empty when nothing is scheduled.
Authentication: Required
ETag Support: Based on job table changes.
GET /api/datasets/{id}/painless-templates
List the script builders available for calculated fields: the
raw script driver plus guided builders (Time Between, …). Each item's
value is the script payload skeleton for POST /fields.
Authentication: Required
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasets/admin%3Anorthwind-orders/painless-templates"
}
},
"items": [
{
"detective": "00000000-0000-4000-8000-000000000001",
"id": "00000000-0000-4000-8000-000000000001:0",
"value": {
"name": "Elasticsearch Script",
"group": "__top",
"icon": "fas fa-scroll",
"value": {
"script": {
"script": {}
}
}
}
},
{
"detective": "00000000-0000-4000-8000-000000000002",
"id": "00000000-0000-4000-8000-000000000002:0",
"value": {
"name": "Time Between",
"group": "__top",
"iconSvg": "/assets/painless/images/time-between.svg",
"value": {
"script": {
"timeBetween": {}
}
}
}
},
{
"detective": "00000000-0000-4000-8000-000000000003",
"id": "00000000-0000-4000-8000-000000000003:0",
"value": {
"name": "Concatenate",
"group": "__top",
"image": "/assets/painless/images/concatenate.svg",
"value": {
"script": {
"concatenate": {}
}
}
}
}
],
"start": 0,
"count": 3,
"total": 3
}