KDB knowledge

Comments and suggestions

How people who use a KDB server send comments, suggestions and problem reports, and how its admins read them.

Anyone who may use a KDB server can send its admins a comment, a suggestion or a problem report. The message is saved on that server, in the table _feedback, so it survives restarts and is part of every backup.

WhoWhat they can doWhere
anyone who can open the console (logged in, or with the token)send a messageHelp > Comments and suggestions
a server admin (the user's own ROLE admin, or the token)read every message and mark it read or donethe same page, under Received
a programthe same, over HTTPPOST /api/feedback, GET /api/feedback, POST /api/feedback/<id>

The page in the console

Open Help > Comments and suggestions.

  1. Pick what it is: Comment, Suggestion or Problem.
  2. Write the message. Ctrl+Enter sends it too.
  3. Optionally add a name or email, if you would like an answer.
  4. Press Send. The page says which number the message was saved as.

A server admin also sees Received: every message, newest first, with its kind, time, sender and state. New, Read, Done and All filter the list; Mark read, Mark done and Mark new change a message's state.

POST /api/feedback

Syntax:

POST /api/feedback
Content-Type: application/json

{"kind": "comment | suggestion | problem", "message": "...", "contact": "...", "page": "..."}

Saves one message. Needs a login or the token, like every /api route; no role is needed.

FieldNeededRule
kindno (default comment)comment, suggestion or problem
messageyes1 to 4,000 characters, no control characters except line breaks and tabs
contactnoup to 200 characters
pagenowhere it was sent from, up to 200 characters
curl -s -X POST "$KDB_URL/api/feedback" -H "Authorization: Bearer $KDB_TOKEN" \
  -H "Content-Type: application/json" \
  --data-binary '{"kind":"suggestion","message":"Please add a CSV export to dashboards.","contact":"ram@example.com"}'

{"id":1,"saved":true}

GET /api/feedback

Syntax:

GET /api/feedback[?status=new|read|done][&limit=N]

Reads the messages, newest first, as columns and rows like /exec. Needs a server admin: the user's own ROLE admin or the token, because messages can hold names and email addresses.

ParameterMeaningDefault
statusonly messages in this state: new, read or doneall
limitat most this many rows; more than 1,000 counts as 1,000100
ColumnTypeMeaning
idLONGthe message number
timeTIMESTAMPwhen it was sent (UTC)
kindSTRINGcomment, suggestion or problem
statusSTRINGnew, read or done
messageSTRINGthe text
contactSTRINGthe name or email given, or NULL
pageSTRINGwhere it was sent from
userSTRINGthe logged-in user, or NULL for the token
clientSTRINGthe client address

POST /api/feedback/<id>

Syntax:

POST /api/feedback/<id>
Content-Type: application/json

{"status": "new | read | done"}

Changes the state of one message. status can also be a query or form field (?status=done). Needs a server admin, like reading.

HTTP: Send a suggestion, read the new ones, mark it done

POST /api/feedback
Content-Type: application/json

{"kind":"suggestion","message":"Please add a CSV export to dashboards.","contact":"ram@example.com","page":"console"}
###
GET /api/feedback?status=new
###
POST /api/feedback/{{id}}
Content-Type: application/json

{"status":"done"}

Response:

POST /api/feedback

HTTP 200 (application/json)

{"id": 1, "saved": true}

GET /api/feedback?status=new

HTTP 200 (application/json)

{
  "columns": [
    {"name": "id", "type": "LONG"},
    {"name": "time", "type": "TIMESTAMP"},
    {"name": "kind", "type": "STRING"},
    {"name": "status", "type": "STRING"},
    {"name": "message", "type": "STRING"},
    {"name": "contact", "type": "STRING"},
    {"name": "page", "type": "STRING"},
    {"name": "user", "type": "STRING"},
    {"name": "client", "type": "STRING"}
  ],
  "dataset": [
    [
      1,
      "2026-10-22T05:43:41.888Z",
      "suggestion",
      "new",
      "Please add a CSV export to dashboards.",
      "ram@example.com",
      "console",
      null,
      "127.0.0.1 (http)"
    ]
  ],
  "count": 1
}

POST /api/feedback/{{id}}

HTTP 200 (application/json)

{"id": 1, "status": "done"}

HTTP: A message number that does not exist

POST /api/feedback/999
Content-Type: application/json

{"status":"read"}

Response:

HTTP 404 (application/json)

{"error": "there is no message #999"}