Skip to main content

Visuals, comments & favorite

Endpoints for saved visuals scoped to a datasource, datasource comments, and the current user's favorite flag.

Visuals

A datasource visual is a saved chart/grid definition attached to a datasource.

GET /api/datasources/{id}/visuals

List the datasource's saved visuals.

List datasource visualsGET /api/datasources/admin:northwind/visuals
Response · 200
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/visuals"
}
},
"start": 0,
"count": 1,
"total": 1,
"_embedded": {
"inf:visual": [
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/visuals/00000000-0000-4000-8000-000000000001"
}
},
"component": {
"datasetGrid": {
"dataset": null
}
},
"permissions": {
"write": true,
"deletePinned": false
},
"id": "00000000-0000-4000-8000-000000000001",
"datasourceId": "00000000-0000-4000-8000-000000000002",
"datasetId": null,
"source": null,
"name": "Order Grid",
"description": null,
"defaultName": null,
"defaultDescription": null,
"embedded": false,
"pinned": false,
"layoutData": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"tenant": "acme",
"ownerId": "admin",
"datasets": []
}
]
}
}
Captured from the API examples test suite; ids and timestamps are normalized.

POST /api/datasources/{id}/visuals

Create a visual.

FieldTypeRequiredDescription
typestringYesVisual type.
configobjectYesVisual configuration. The datasource id is injected automatically.
namestringNoDisplay name (defaults from label).
embeddedbooleanNoWhether the visual is embedded.

Requires datasource:write. Returns 201 with a Location header.

Create a datasource visualPOST /api/datasources/admin:northwind/visuals
POST /api/datasources/{id}/visuals saves a visual (chart/grid) scoped to the datasource. Payload { type (required), config (required), name?, embedded? }. The datasource id is injected into config automatically. Requires datasource:write. Returns 201 with a Location header.
Request body
{
"type": "datasetGrid",
"config": {},
"name": "Order Grid"
}
Response · 201
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/00000000-0000-4000-8000-000000000001/visuals/00000000-0000-4000-8000-000000000002"
}
},
"component": {
"datasetGrid": {
"dataset": null
}
},
"permissions": {
"write": true,
"deletePinned": false
},
"id": "00000000-0000-4000-8000-000000000002",
"pinned": false,
"layoutData": {},
"tenant": "acme",
"name": "Order Grid",
"embedded": false,
"datasourceId": "00000000-0000-4000-8000-000000000001",
"ownerId": "admin",
"updatedAt": "2026-01-15T16:20:00.000Z",
"createdAt": "2026-01-15T16:20:00.000Z",
"datasetId": null,
"source": null,
"description": null,
"defaultName": null,
"defaultDescription": null
}
Captured from the API examples test suite; ids and timestamps are normalized.

GET /api/datasources/{datasourceId}/visuals/{id}

Get one saved visual.

Get a datasource visualGET /api/datasources/admin:northwind/visuals/00000000-0000-4000-8000-000000000001
Response · 200
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/visuals/00000000-0000-4000-8000-000000000001"
}
},
"component": {
"datasetGrid": {
"dataset": null
}
},
"permissions": {
"write": true,
"deletePinned": false
},
"id": "00000000-0000-4000-8000-000000000001",
"datasourceId": "00000000-0000-4000-8000-000000000002",
"datasetId": null,
"source": null,
"name": "Order Grid",
"description": null,
"defaultName": null,
"defaultDescription": null,
"embedded": false,
"pinned": false,
"layoutData": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"tenant": "acme",
"ownerId": "admin",
"datasets": []
}
Captured from the API examples test suite; ids and timestamps are normalized.

PUT /api/datasources/{datasourceId}/visuals/{id}

Update (upsert) a saved visual. Requires datasource:write. Returns 200 with the updated visual.

Update a datasource visualPUT /api/datasources/admin:northwind/visuals/00000000-0000-4000-8000-000000000001
PUT /api/datasources/{datasourceId}/visuals/{id} upserts the visual. Requires datasource:write. Returns 200 with the updated visual.
Request body
{
"type": "datasetGrid",
"config": {},
"name": "Order Grid (v2)"
}
Response · 200
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/visuals/00000000-0000-4000-8000-000000000001"
}
},
"component": {
"datasetGrid": {}
},
"permissions": {
"write": true,
"deletePinned": false
},
"id": "00000000-0000-4000-8000-000000000001",
"datasourceId": "00000000-0000-4000-8000-000000000002",
"source": null,
"name": "Order Grid (v2)",
"description": null,
"defaultName": null,
"defaultDescription": null,
"embedded": false,
"pinned": false,
"layoutData": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"tenant": "acme",
"ownerId": "admin",
"datasets": []
}
Captured from the API examples test suite; ids and timestamps are normalized.

DELETE /api/datasources/{datasourceId}/visuals/{id}

Delete a saved visual. Returns 200 with an empty body.

Delete a datasource visualDELETE /api/datasources/admin:northwind/visuals/00000000-0000-4000-8000-000000000001
DELETE /api/datasources/{datasourceId}/visuals/{id} removes the visual and returns 200 with an empty body.
Response · 200 · no body
Captured from the API examples test suite; ids and timestamps are normalized.

GET /api/datasources/{id}/visual-templates

List the visual templates available for the datasource.

List datasource visual templatesGET /api/datasources/admin:northwind/visual-templates
GET /api/datasources/{id}/visual-templates lists the visual templates available for the datasource.
Response · 200
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/visual-templates"
}
},
"start": 0,
"count": 0,
"total": 0,
"_embedded": {
"inf:visual-template": []
}
}
Captured from the API examples test suite; ids and timestamps are normalized.

Comments

GET /api/datasources/{id}/comments

List the datasource's comments, newest first.

List datasource commentsGET /api/datasources/admin:northwind/comments
GET /api/datasources/{id}/comments lists comments newest-first.
Response · 200
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/comments?sort=-createdAt&limit=0"
}
},
"start": 0,
"count": 1,
"total": 1,
"_embedded": {
"inf:comment": [
{
"_links": {
"self": {
"href": "https://informer.example.com/api/comments/00000000-0000-4000-8000-000000000001"
},
"inf:comments": {
"href": "https://informer.example.com/api/comments/00000000-0000-4000-8000-000000000001/replies"
}
},
"permissions": {
"edit": true,
"delete": true
},
"id": "00000000-0000-4000-8000-000000000001",
"message": "Re-scanned after the Q1 load.",
"public": false,
"userId": "admin",
"datasetId": null,
"datasourceId": "00000000-0000-4000-8000-000000000002",
"reportId": null,
"queryId": null,
"teamId": null,
"jobId": null,
"templateId": null,
"assistantId": null,
"libraryId": null,
"mentions": null,
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"tenant": "acme",
"parentId": null,
"_embedded": {
"inf:user": {
"_links": {
"self": {
"href": "https://informer.example.com/api/users/admin"
},
"inf:memberships": {
"href": "https://informer.example.com/api/users/admin/memberships"
},
"inf:avatar-upload": {
"href": "https://informer.example.com/api/users/admin/_upload/{uploadId}/avatar-upload",
"templated": true
},
"inf:password": {
"href": "https://informer.example.com/api/users/admin/password"
},
"inf:feed": {
"href": "https://informer.example.com/api/users/admin/feed"
},
"inf:viewed-feed": {
"href": "https://informer.example.com/api/users/admin/_markFeedViewed"
},
"inf:superuser": {
"href": "https://informer.example.com/api/users/admin/superuser"
}
},
"permissions": {
"changeDomain": false,
"changeProfile": true,
"changePassword": true,
"delete": false,
"edit": true,
"reassign": true,
"superuser": true,
"enable": true,
"changeTheme": true,
"lock": true,
"setGlobalPermissions": true,
"manageLogin": true
},
"domain": "local",
"username": "admin",
"displayName": "acme Administrator",
"familyName": "Administrator",
"givenName": "acme",
"middleName": null,
"email": null,
"data": null,
"superuser": true,
"timezone": "America/New_York",
"settings": {
"log": {
"log": false,
"info": false,
"warn": false,
"debug": false,
"error": true,
"remote": false
}
},
"enabled": true,
"source": null,
"sourceId": null,
"lastViewedFeed": null,
"tenant": "acme",
"globalPermissions": {
"ai": false,
"jobCreation": true,
"viewAllTeams": true,
"viewAllUsers": true,
"painlessScriptCreation": true
},
"userFields": {},
"locked": false,
"lockedAt": null,
"loginAttempts": 0,
"passwordSetAt": "2026-01-15T16:20:00.000Z",
"passwordExpiresAt": "2026-01-15T16:20:00.000Z",
"forgotPasswordRequestTime": null,
"mfa": null,
"mfaConfig": {},
"aiMessage": null,
"aiConsent": false,
"hasSharedDatasources": false,
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"initials": "NA",
"colorIndex": 4,
"avatarColor": {
"background": "#81C784",
"text": "#1B5E20"
},
"managesPassword": true
}
}
}
]
}
}
Captured from the API examples test suite; ids and timestamps are normalized.

POST /api/datasources/{id}/comments

Add a comment.

FieldTypeRequiredDescription
messagestringYesComment text.

Returns 201 with a Location header.

Add a datasource commentPOST /api/datasources/admin:northwind/comments
POST /api/datasources/{id}/comments adds a comment. Payload { message }. Returns 201 with a Location header.
Request body
{
"message": "Re-scanned after the Q1 load."
}
Response · 201
{
"_links": {
"self": {
"href": "https://informer.example.com/api/comments/00000000-0000-4000-8000-000000000001"
}
},
"permissions": {
"edit": true,
"delete": true
},
"id": "00000000-0000-4000-8000-000000000001",
"public": false,
"tenant": "acme",
"message": "Re-scanned after the Q1 load.",
"datasourceId": "00000000-0000-4000-8000-000000000002",
"userId": "admin",
"updatedAt": "2026-01-15T16:20:00.000Z",
"createdAt": "2026-01-15T16:20:00.000Z",
"mentions": null,
"teamId": null,
"_altid": null,
"datasetId": null,
"reportId": null,
"queryId": null,
"jobId": null,
"parentId": null,
"templateId": null,
"assistantId": null,
"libraryId": null
}
Captured from the API examples test suite; ids and timestamps are normalized.

Favorite

The current user's favorite flag on the datasource.

GET /api/datasources/{id}/favorite

Read the current user's favorite status.

Get datasource favorite statusGET /api/datasources/admin:northwind/favorite
Response · 200
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/favorite"
}
},
"permissions": {},
"id": "00000000-0000-4000-8000-000000000001",
"principalId": "admin",
"reportId": null,
"datasetId": null,
"queryId": null,
"datasourceId": "00000000-0000-4000-8000-000000000002",
"jobId": null,
"assistantId": null,
"templateId": null,
"libraryId": null,
"appId": null,
"integrationId": null,
"toolkitId": null,
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"tenant": "acme"
}
Captured from the API examples test suite; ids and timestamps are normalized.

PUT /api/datasources/{id}/favorite

Mark the datasource as a favorite.

Mark a datasource as favoritePUT /api/datasources/admin:northwind/favorite
PUT /api/datasources/{id}/favorite flags the datasource as a favorite for the current user.
Response · 200
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/favorite"
}
},
"permissions": {},
"id": "00000000-0000-4000-8000-000000000001",
"tenant": "acme",
"datasourceId": "00000000-0000-4000-8000-000000000002",
"principalId": "admin",
"reportId": null,
"datasetId": null,
"queryId": null,
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"jobId": null,
"templateId": null,
"assistantId": null,
"libraryId": null,
"appId": null,
"integrationId": null,
"toolkitId": null
}
Captured from the API examples test suite; ids and timestamps are normalized.

DELETE /api/datasources/{id}/favorite

Clear the favorite flag. Returns 200 with an empty body.

Clear datasource favoriteDELETE /api/datasources/admin:northwind/favorite
DELETE /api/datasources/{id}/favorite removes the current user’s favorite flag.
Response · 200 · no body
Captured from the API examples test suite; ids and timestamps are normalized.