Data Operations
Endpoints for managing Dataset records: retrieving, adding, replacing, deleting, and searching data.
GET /api/datasets/{id}/data
Get Dataset records with pagination, sorting, and full-text search. Records arrive flattened: each item is just the row values.
Authentication: Required
Path Parameters:
| Parameter | Type | Description |
|---|---|---|
id | string | Dataset UUID or ownerId:slug natural id |
Query Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
q | string | — | Full-text search across the index |
sort | string | — | Field name to sort by (repeat for several) |
start | integer | 0 | Pagination offset |
limit | integer | 50 | Number of results per page |
report / alias | string | — | Report context (applies the Report's field restrictions) |
filter | object | — | Accepted for legacy reasons but ignored; express criteria through _search |
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasets/admin%3Areorder-points/data?start=0&limit=2&sort=sku"
}
},
"items": [
{
"product": "Chai",
"reorderAt": 25,
"sku": "BEV-001"
},
{
"product": "Chang",
"reorderAt": 40,
"sku": "BEV-002"
}
],
"start": 0,
"count": 2,
"total": 2
}
ETag Support: Based on the Dataset's dataUpdatedAt.
POST /api/datasets/{id}/data
Append records to the Dataset.
Authentication: Required
Permission: dataset:write (Data Wizard or above on the owning team)
Request Body: an array of record objects (or a single object).
[
{
"sku": "CON-001",
"product": "Aniseed Syrup",
"reorderAt": 25
}
]
Behavior:
- Records are appended; existing data is untouched
- New columns are added to the index mapping on the fly (Informer's dynamic
templates type them; run
_syncFieldsto pick them up as fields) - Responds
200with an empty body
PUT /api/datasets/{id}/data
Replace all Dataset data: the index is cleared, then the payload is written.
Authentication: Required
Request Body: an array of record objects.
[
{
"sku": "BEV-001",
"product": "Chai",
"reorderAt": 30
},
{
"sku": "BEV-002",
"product": "Chang",
"reorderAt": 45
}
]
All existing records are deleted before the new ones are indexed. Use POST to append instead.
DELETE /api/datasets/{id}/data
Clear all data from the Dataset index.
Authentication: Required
Permission: dataset:write (Data Wizard or above on the owning team)
Query Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
removeFields | boolean | false | Also delete the field definitions. Calculated (script) fields are kept |
Behavior:
- The index is dropped; the Dataset row, fields, filters, and configuration survive
- Refresh exceptions for the Dataset are cleared
- Responds
200with an empty body
POST /api/datasets/{id}/_search
Execute an Elasticsearch search against the Dataset. The body is a standard Elasticsearch search body; the response is the raw search result.
Authentication: Required
Request Body (top-level keys):
| Field | Type | Description |
|---|---|---|
query | object | Elasticsearch query DSL |
_source | array/string/boolean | Fields to return |
sort | array | Elasticsearch sort clauses ([{ "field": "asc" }]) |
from / size | integer | Pagination |
aggs | object | Elasticsearch aggregations |
snapshots | object | Override your snapshot view settings for this search (see Settings) |
report / alias | string | Report context (applies the Report's field restrictions) |
{
"query": {
"bool": {
"filter": [
{
"term": {
"ShipCountry": "Norway"
}
},
{
"range": {
"orderAmount": {
"gte": 100
}
}
}
]
}
},
"sort": [
{
"orderAmount": "asc"
}
],
"size": 524288,
"_source": [
"OrderDate",
"ProductName",
"ShipCountry",
"orderAmount"
]
}
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasets/admin%3Anorthwind-orders/_search"
}
},
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 12,
"max_score": null,
"hits": [
{
"_index": "docsex.acme.northwind-orders.1700000000000",
"_type": "_doc",
"_id": "doc-1",
"_score": null,
"_source": {
"OrderDate": "2026-01-15T16:20:00.000Z",
"ProductName": "Steeleye Stout",
"ShipCountry": "Norway",
"orderAmount": 144
},
"sort": [
144
]
},
{
"_index": "docsex.acme.northwind-orders.1700000000000",
"_type": "_doc",
"_id": "doc-2",
"_score": null,
"_source": {
"OrderDate": "2026-01-15T16:20:00.000Z",
"ProductName": "Perth Pasties",
"ShipCountry": "Norway",
"orderAmount": 164
},
"sort": [
164
]
}
]
}
}
Error Mapping: invalid queries answer 400; a missing index (Dataset
never refreshed) answers 422.
GET /api/datasets/{id}/_search
The same search expressed as query parameters: query, aggs,
aggregations, and snapshots take URL-encoded JSON; _source, sort,
from, size, and searchType pass through. Use the POST form for anything
non-trivial.
Authentication: Required
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasets/admin%3Anorthwind-orders/_search?size=0&aggs=countries,%5Bobject%20Object%5D"
}
},
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2155,
"max_score": null,
"hits": []
},
"aggregations": {
"countries": {
"meta": {
"field": "ShipCountry"
},
"value": 21
}
}
}
ETag Support: Based on the Dataset's data and visuals timestamps.
Queries address fields by their Dataset field names. String fields index as
keyword (exact term matches, sorting) with a .text sub-field for
full-text match queries.