Feedback Comments
Returns a list of feedback comments (three-tier visibility).
GET/api/media/feedback_comment
Query parameters
entrystring | Requires access right: PUBLIC, LOGGED_IN, SCOPE |
socialProfilestring | Requires access right: PUBLIC, LOGGED_IN, SCOPE |
isOfficialboolean | Marks a reply written on behalf of the operator, so the UI can set it apart from community comments. | Requires access right: PUBLIC, LOGGED_IN, SCOPE |
createdstring | Requires access right: PUBLIC, LOGGED_IN, SCOPE |
idinteger | |
deletedboolean | This property is used to mark an entity as deleted / archived |
moderationStatusstring | |
updatedstring | |
searchStringstring | text to search for in the list |
orderFieldNamestring | name of the order field |
orderFieldSortstring | sorting modeAllowed: DESCASC |
pageinteger | page of the list |
pageSizeinteger | number of entries for each page |
withMaxPageNumberstring | returns the number of pages available as a header if this is set |
Responses
200Returns a list of MediaFeedbackComment objectsarray<MediaFeedbackComment>
Show fields (14)
author_namestringidintegerPrimary key of the feedback comment. Internal ID.
entryMediaFeedbackEntry8Feedback entry the comment belongs to.
Show fields (17)
author_namestringDisplay name of the author, honouring the pseudonymity the person chose on their social profile. Falls back to the guest name, then to a neutral label — never to an email address.
idintegerPrimary key of the feedback entry. Internal ID.
boardMediaFeedbackBoard5Feedback board the entry belongs to.
headlinestringHeadline of the feedback entry.
textstringText of the feedback entry.
feedback_typestringType of the feedback, for example idea or problem.
statusstringStatus of the feedback, for example open, planned or done.
status_notestringPublicly visible reason for the current status. A declined wish without a reason is worse than no board at all, so this is exposed to every access tier.
moderation_statusstringModeration status, for example pending or approved.
social_profileMediaSocialProfile10Author when submitted by a logged-in person. Reuses the social profile so the pseudonymity settings a person already chose apply here too.
guest_namestringName of the guest who wrote the entry.
vote_countintegerDenormalized so lists can sort by popularity without a join. Maintained by MediaFeedbackVoteHelper; MediaFeedbackRecountCommand repairs it.
comment_countintegerNumber of comments on the entry.
duplicate_ofMediaFeedbackEntry8Merge target. Set together with STATUS_DUPLICATE.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
textstringText of the comment.
social_profileMediaSocialProfile10Profile that wrote the comment.
Show fields (11)
idintegerPrimary key of the social profile. Internal ID.
public_namestringName shown publicly.
profile_picture_urlstringURL of the profile picture.
public_about_mestringText about the person shown publicly.
global_profilebooleanThe profile is a global profile across installations.
name_display_typestringHow the name is shown, for example full name or first name only.
show_profile_picturebooleanThe profile picture is shown.
profile_picture_check_statusstringPruefstatus des Profilbilds (KI-Pruefung, siehe MediaSocialProfilePictureHelper): null = nie geprueft (Pruefung aus), pending, approved, rejected. Nur ein freigegebenes Bild landet in profilePictureUrl, solange die Pruefung eingeschaltet ist.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
guest_namestringName of the guest who wrote the comment.
guest_emailstringScope-only.
is_officialbooleanMarks a reply written on behalf of the operator, so the UI can set it apart from community comments.
moderation_statusstringModeration status, for example pending or approved.
moderation_reasonstringReason for the moderation decision.
moderated_atstring (date-time)Time the comment was moderated.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
curl --request GET \
--url https://your-instance.iw-erp.de/api/media/feedback_comment \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/media/feedback_comment', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/media/feedback_comment"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/media/feedback_comment', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/media/feedback_comment"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/media/feedback_comment")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/media/feedback_comment"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/media_feedback_comment_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await MediaFeedbackCommentController.getAll();
if (result.success) {
print(result.data);
}[
{
"author_name": "Beispiel",
"id": 42,
"text": "Text",
"guest_name": "Beispiel",
"guest_email": "lena.hartmann@example.org",
"entry": {
"author_name": "Beispiel",
"id": 42,
"text": "Text",
"guest_name": "Beispiel",
"headline": "string",
"feedback_type": "string",
"status": "string",
"status_note": "string",
"moderation_status": "string",
"vote_count": 1
},
"social_profile": {
"id": 42,
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"global_profile": true,
"name_display_type": "string",
"show_profile_picture": true,
"profile_picture_check_status": "string",
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
},
"is_official": true,
"moderation_status": "string",
"moderation_reason": "string"
}
]Creates a comment as an administrator.
POST/api/media/feedback_comment
Request body application/json
dataMediaFeedbackComment2Show fields (8)
entryMediaFeedbackEntry9Feedback entry the comment belongs to.
textstringText of the comment.
social_profileMediaSocialProfile16Profile that wrote the comment.
guest_namestringName of the guest who wrote the comment.
is_officialbooleanMarks a reply written on behalf of the operator, so the UI can set it apart from community comments.
moderation_statusstringModeration status, for example pending or approved.
moderation_reasonstringReason for the moderation decision.
deletedbooleanThis property is used to mark an entity as deleted / archived
Responses
200Add a new MediaFeedbackCommentMediaFeedbackComment
Show fields (14)
author_namestringidintegerPrimary key of the feedback comment. Internal ID.
entryMediaFeedbackEntry8Feedback entry the comment belongs to.
Show fields (17)
author_namestringDisplay name of the author, honouring the pseudonymity the person chose on their social profile. Falls back to the guest name, then to a neutral label — never to an email address.
idintegerPrimary key of the feedback entry. Internal ID.
boardMediaFeedbackBoard5Feedback board the entry belongs to.
headlinestringHeadline of the feedback entry.
textstringText of the feedback entry.
feedback_typestringType of the feedback, for example idea or problem.
statusstringStatus of the feedback, for example open, planned or done.
status_notestringPublicly visible reason for the current status. A declined wish without a reason is worse than no board at all, so this is exposed to every access tier.
moderation_statusstringModeration status, for example pending or approved.
social_profileMediaSocialProfile10Author when submitted by a logged-in person. Reuses the social profile so the pseudonymity settings a person already chose apply here too.
guest_namestringName of the guest who wrote the entry.
vote_countintegerDenormalized so lists can sort by popularity without a join. Maintained by MediaFeedbackVoteHelper; MediaFeedbackRecountCommand repairs it.
comment_countintegerNumber of comments on the entry.
duplicate_ofMediaFeedbackEntry8Merge target. Set together with STATUS_DUPLICATE.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
textstringText of the comment.
social_profileMediaSocialProfile10Profile that wrote the comment.
Show fields (11)
idintegerPrimary key of the social profile. Internal ID.
public_namestringName shown publicly.
profile_picture_urlstringURL of the profile picture.
public_about_mestringText about the person shown publicly.
global_profilebooleanThe profile is a global profile across installations.
name_display_typestringHow the name is shown, for example full name or first name only.
show_profile_picturebooleanThe profile picture is shown.
profile_picture_check_statusstringPruefstatus des Profilbilds (KI-Pruefung, siehe MediaSocialProfilePictureHelper): null = nie geprueft (Pruefung aus), pending, approved, rejected. Nur ein freigegebenes Bild landet in profilePictureUrl, solange die Pruefung eingeschaltet ist.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
guest_namestringName of the guest who wrote the comment.
guest_emailstringScope-only.
is_officialbooleanMarks a reply written on behalf of the operator, so the UI can set it apart from community comments.
moderation_statusstringModeration status, for example pending or approved.
moderation_reasonstringReason for the moderation decision.
moderated_atstring (date-time)Time the comment was moderated.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
curl --request POST \
--url https://your-instance.iw-erp.de/api/media/feedback_comment \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"text": "Text",
"guest_name": "Beispiel",
"entry": {
"text": "Text",
"headline": "string",
"feedback_type": "string",
"deleted": true
},
"social_profile": {
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"name_display_type": "string",
"show_profile_picture": true,
"profile_picture_check_status": "string"
},
"is_official": true,
"moderation_status": "string"
}
}
'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
text: 'Text',
guest_name: 'Beispiel',
entry: {text: 'Text', headline: 'string', feedback_type: 'string', deleted: true},
social_profile: {
public_name: 'Beispiel',
profile_picture_url: 'https://vynst.de',
public_about_me: 'string',
name_display_type: 'string',
show_profile_picture: true,
profile_picture_check_status: 'string'
},
is_official: true,
moderation_status: 'string'
}
})
};
fetch('https://your-instance.iw-erp.de/api/media/feedback_comment', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/media/feedback_comment"
payload = { "data": {
"text": "Text",
"guest_name": "Beispiel",
"entry": {
"text": "Text",
"headline": "string",
"feedback_type": "string",
"deleted": True
},
"social_profile": {
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"name_display_type": "string",
"show_profile_picture": True,
"profile_picture_check_status": "string"
},
"is_official": True,
"moderation_status": "string"
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://your-instance.iw-erp.de/api/media/feedback_comment', [
'body' => '{"data":{"text":"Text","guest_name":"Beispiel","entry":{"text":"Text","headline":"string","feedback_type":"string","deleted":true},"social_profile":{"public_name":"Beispiel","profile_picture_url":"https://vynst.de","public_about_me":"string","name_display_type":"string","show_profile_picture":true,"profile_picture_check_status":"string"},"is_official":true,"moderation_status":"string"}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/media/feedback_comment"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"text\":\"Text\",\"guest_name\":\"Beispiel\",\"entry\":{\"text\":\"Text\",\"headline\":\"string\",\"feedback_type\":\"string\",\"deleted\":true},\"social_profile\":{\"public_name\":\"Beispiel\",\"profile_picture_url\":\"https://vynst.de\",\"public_about_me\":\"string\",\"name_display_type\":\"string\",\"show_profile_picture\":true,\"profile_picture_check_status\":\"string\"},\"is_official\":true,\"moderation_status\":\"string\"}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"text\":\"Text\",\"guest_name\":\"Beispiel\",\"entry\":{\"text\":\"Text\",\"headline\":\"string\",\"feedback_type\":\"string\",\"deleted\":true},\"social_profile\":{\"public_name\":\"Beispiel\",\"profile_picture_url\":\"https://vynst.de\",\"public_about_me\":\"string\",\"name_display_type\":\"string\",\"show_profile_picture\":true,\"profile_picture_check_status\":\"string\"},\"is_official\":true,\"moderation_status\":\"string\"}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/media/feedback_comment")
.post(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/media/feedback_comment"
payload := strings.NewReader("{\"data\":{\"text\":\"Text\",\"guest_name\":\"Beispiel\",\"entry\":{\"text\":\"Text\",\"headline\":\"string\",\"feedback_type\":\"string\",\"deleted\":true},\"social_profile\":{\"public_name\":\"Beispiel\",\"profile_picture_url\":\"https://vynst.de\",\"public_about_me\":\"string\",\"name_display_type\":\"string\",\"show_profile_picture\":true,\"profile_picture_check_status\":\"string\"},\"is_official\":true,\"moderation_status\":\"string\"}}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/media_feedback_comment_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/media_feedback_comment.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await MediaFeedbackCommentController.post(MediaFeedbackComment.fromJson({
"text": "Text",
"guest_name": "Beispiel",
"entry": {
"text": "Text",
"headline": "string",
"feedback_type": "string",
"deleted": true
},
"social_profile": {
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"name_display_type": "string",
"show_profile_picture": true,
"profile_picture_check_status": "string"
},
"is_official": true,
"moderation_status": "string"
}));
if (result.success) {
print(result.data);
}{
"author_name": "Beispiel",
"id": 42,
"text": "Text",
"guest_name": "Beispiel",
"guest_email": "lena.hartmann@example.org",
"entry": {
"author_name": "Beispiel",
"id": 42,
"text": "Text",
"guest_name": "Beispiel",
"board": {
"id": 42,
"name": "Beispiel",
"public_title": "Beispiel",
"public_description": "Text",
"image_url": "https://vynst.de",
"is_public": true,
"public_key": "string",
"sort_order": 1,
"allow_new_entries": true,
"allow_voting": true
},
"headline": "string",
"feedback_type": "string",
"status": "string",
"status_note": "string",
"moderation_status": "string"
},
"social_profile": {
"id": 42,
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"global_profile": true,
"name_display_type": "string",
"show_profile_picture": true,
"profile_picture_check_status": "string",
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
},
"is_official": true,
"moderation_status": "string",
"moderation_reason": "string"
}Returns a single feedback comment.
GET/api/media/feedback_comment/{identifier}
Path parameters
identifierrequiredstring |
Responses
200Returns a single MediaFeedbackCommentMediaFeedbackComment
Show fields (14)
author_namestringidintegerPrimary key of the feedback comment. Internal ID.
entryMediaFeedbackEntry8Feedback entry the comment belongs to.
Show fields (17)
author_namestringDisplay name of the author, honouring the pseudonymity the person chose on their social profile. Falls back to the guest name, then to a neutral label — never to an email address.
idintegerPrimary key of the feedback entry. Internal ID.
boardMediaFeedbackBoard5Feedback board the entry belongs to.
headlinestringHeadline of the feedback entry.
textstringText of the feedback entry.
feedback_typestringType of the feedback, for example idea or problem.
statusstringStatus of the feedback, for example open, planned or done.
status_notestringPublicly visible reason for the current status. A declined wish without a reason is worse than no board at all, so this is exposed to every access tier.
moderation_statusstringModeration status, for example pending or approved.
social_profileMediaSocialProfile10Author when submitted by a logged-in person. Reuses the social profile so the pseudonymity settings a person already chose apply here too.
guest_namestringName of the guest who wrote the entry.
vote_countintegerDenormalized so lists can sort by popularity without a join. Maintained by MediaFeedbackVoteHelper; MediaFeedbackRecountCommand repairs it.
comment_countintegerNumber of comments on the entry.
duplicate_ofMediaFeedbackEntry8Merge target. Set together with STATUS_DUPLICATE.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
textstringText of the comment.
social_profileMediaSocialProfile10Profile that wrote the comment.
Show fields (11)
idintegerPrimary key of the social profile. Internal ID.
public_namestringName shown publicly.
profile_picture_urlstringURL of the profile picture.
public_about_mestringText about the person shown publicly.
global_profilebooleanThe profile is a global profile across installations.
name_display_typestringHow the name is shown, for example full name or first name only.
show_profile_picturebooleanThe profile picture is shown.
profile_picture_check_statusstringPruefstatus des Profilbilds (KI-Pruefung, siehe MediaSocialProfilePictureHelper): null = nie geprueft (Pruefung aus), pending, approved, rejected. Nur ein freigegebenes Bild landet in profilePictureUrl, solange die Pruefung eingeschaltet ist.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
guest_namestringName of the guest who wrote the comment.
guest_emailstringScope-only.
is_officialbooleanMarks a reply written on behalf of the operator, so the UI can set it apart from community comments.
moderation_statusstringModeration status, for example pending or approved.
moderation_reasonstringReason for the moderation decision.
moderated_atstring (date-time)Time the comment was moderated.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
curl --request GET \
--url https://your-instance.iw-erp.de/api/media/feedback_comment/42 \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/media/feedback_comment/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/media/feedback_comment/42"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/media/feedback_comment/42', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/media/feedback_comment/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/media/feedback_comment/42")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/media/feedback_comment/42"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/media_feedback_comment_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await MediaFeedbackCommentController.get('42');
if (result.success) {
print(result.data);
}{
"author_name": "Beispiel",
"id": 42,
"text": "Text",
"guest_name": "Beispiel",
"guest_email": "lena.hartmann@example.org",
"entry": {
"author_name": "Beispiel",
"id": 42,
"text": "Text",
"guest_name": "Beispiel",
"board": {
"id": 42,
"name": "Beispiel",
"public_title": "Beispiel",
"public_description": "Text",
"image_url": "https://vynst.de",
"is_public": true,
"public_key": "string",
"sort_order": 1,
"allow_new_entries": true,
"allow_voting": true
},
"headline": "string",
"feedback_type": "string",
"status": "string",
"status_note": "string",
"moderation_status": "string"
},
"social_profile": {
"id": 42,
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"global_profile": true,
"name_display_type": "string",
"show_profile_picture": true,
"profile_picture_check_status": "string",
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
},
"is_official": true,
"moderation_status": "string",
"moderation_reason": "string"
}Updates a comment as an administrator.
PUT/api/media/feedback_comment/{identifier}
Path parameters
identifierrequiredstring |
Request body application/json
dataMediaFeedbackComment2Show fields (8)
entryMediaFeedbackEntry9Feedback entry the comment belongs to.
textstringText of the comment.
social_profileMediaSocialProfile16Profile that wrote the comment.
guest_namestringName of the guest who wrote the comment.
is_officialbooleanMarks a reply written on behalf of the operator, so the UI can set it apart from community comments.
moderation_statusstringModeration status, for example pending or approved.
moderation_reasonstringReason for the moderation decision.
deletedbooleanThis property is used to mark an entity as deleted / archived
Responses
200Update a MediaFeedbackCommentMediaFeedbackComment
Show fields (14)
author_namestringidintegerPrimary key of the feedback comment. Internal ID.
entryMediaFeedbackEntry8Feedback entry the comment belongs to.
Show fields (17)
author_namestringDisplay name of the author, honouring the pseudonymity the person chose on their social profile. Falls back to the guest name, then to a neutral label — never to an email address.
idintegerPrimary key of the feedback entry. Internal ID.
boardMediaFeedbackBoard5Feedback board the entry belongs to.
headlinestringHeadline of the feedback entry.
textstringText of the feedback entry.
feedback_typestringType of the feedback, for example idea or problem.
statusstringStatus of the feedback, for example open, planned or done.
status_notestringPublicly visible reason for the current status. A declined wish without a reason is worse than no board at all, so this is exposed to every access tier.
moderation_statusstringModeration status, for example pending or approved.
social_profileMediaSocialProfile10Author when submitted by a logged-in person. Reuses the social profile so the pseudonymity settings a person already chose apply here too.
guest_namestringName of the guest who wrote the entry.
vote_countintegerDenormalized so lists can sort by popularity without a join. Maintained by MediaFeedbackVoteHelper; MediaFeedbackRecountCommand repairs it.
comment_countintegerNumber of comments on the entry.
duplicate_ofMediaFeedbackEntry8Merge target. Set together with STATUS_DUPLICATE.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
textstringText of the comment.
social_profileMediaSocialProfile10Profile that wrote the comment.
Show fields (11)
idintegerPrimary key of the social profile. Internal ID.
public_namestringName shown publicly.
profile_picture_urlstringURL of the profile picture.
public_about_mestringText about the person shown publicly.
global_profilebooleanThe profile is a global profile across installations.
name_display_typestringHow the name is shown, for example full name or first name only.
show_profile_picturebooleanThe profile picture is shown.
profile_picture_check_statusstringPruefstatus des Profilbilds (KI-Pruefung, siehe MediaSocialProfilePictureHelper): null = nie geprueft (Pruefung aus), pending, approved, rejected. Nur ein freigegebenes Bild landet in profilePictureUrl, solange die Pruefung eingeschaltet ist.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
guest_namestringName of the guest who wrote the comment.
guest_emailstringScope-only.
is_officialbooleanMarks a reply written on behalf of the operator, so the UI can set it apart from community comments.
moderation_statusstringModeration status, for example pending or approved.
moderation_reasonstringReason for the moderation decision.
moderated_atstring (date-time)Time the comment was moderated.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
curl --request PUT \
--url https://your-instance.iw-erp.de/api/media/feedback_comment/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"text": "Text",
"guest_name": "Beispiel",
"entry": {
"text": "Text",
"headline": "string",
"feedback_type": "string",
"deleted": true
},
"social_profile": {
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"name_display_type": "string",
"show_profile_picture": true,
"profile_picture_check_status": "string"
},
"is_official": true,
"moderation_status": "string"
}
}
'const options = {
method: 'PUT',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
text: 'Text',
guest_name: 'Beispiel',
entry: {text: 'Text', headline: 'string', feedback_type: 'string', deleted: true},
social_profile: {
public_name: 'Beispiel',
profile_picture_url: 'https://vynst.de',
public_about_me: 'string',
name_display_type: 'string',
show_profile_picture: true,
profile_picture_check_status: 'string'
},
is_official: true,
moderation_status: 'string'
}
})
};
fetch('https://your-instance.iw-erp.de/api/media/feedback_comment/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/media/feedback_comment/42"
payload = { "data": {
"text": "Text",
"guest_name": "Beispiel",
"entry": {
"text": "Text",
"headline": "string",
"feedback_type": "string",
"deleted": True
},
"social_profile": {
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"name_display_type": "string",
"show_profile_picture": True,
"profile_picture_check_status": "string"
},
"is_official": True,
"moderation_status": "string"
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('PUT', 'https://your-instance.iw-erp.de/api/media/feedback_comment/42', [
'body' => '{"data":{"text":"Text","guest_name":"Beispiel","entry":{"text":"Text","headline":"string","feedback_type":"string","deleted":true},"social_profile":{"public_name":"Beispiel","profile_picture_url":"https://vynst.de","public_about_me":"string","name_display_type":"string","show_profile_picture":true,"profile_picture_check_status":"string"},"is_official":true,"moderation_status":"string"}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Put,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/media/feedback_comment/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"text\":\"Text\",\"guest_name\":\"Beispiel\",\"entry\":{\"text\":\"Text\",\"headline\":\"string\",\"feedback_type\":\"string\",\"deleted\":true},\"social_profile\":{\"public_name\":\"Beispiel\",\"profile_picture_url\":\"https://vynst.de\",\"public_about_me\":\"string\",\"name_display_type\":\"string\",\"show_profile_picture\":true,\"profile_picture_check_status\":\"string\"},\"is_official\":true,\"moderation_status\":\"string\"}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"text\":\"Text\",\"guest_name\":\"Beispiel\",\"entry\":{\"text\":\"Text\",\"headline\":\"string\",\"feedback_type\":\"string\",\"deleted\":true},\"social_profile\":{\"public_name\":\"Beispiel\",\"profile_picture_url\":\"https://vynst.de\",\"public_about_me\":\"string\",\"name_display_type\":\"string\",\"show_profile_picture\":true,\"profile_picture_check_status\":\"string\"},\"is_official\":true,\"moderation_status\":\"string\"}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/media/feedback_comment/42")
.put(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/media/feedback_comment/42"
payload := strings.NewReader("{\"data\":{\"text\":\"Text\",\"guest_name\":\"Beispiel\",\"entry\":{\"text\":\"Text\",\"headline\":\"string\",\"feedback_type\":\"string\",\"deleted\":true},\"social_profile\":{\"public_name\":\"Beispiel\",\"profile_picture_url\":\"https://vynst.de\",\"public_about_me\":\"string\",\"name_display_type\":\"string\",\"show_profile_picture\":true,\"profile_picture_check_status\":\"string\"},\"is_official\":true,\"moderation_status\":\"string\"}}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with package:http (no controller in the iw_erp_api package)
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.put(
Uri.parse('https://your-instance.iw-erp.de/api/media/feedback_comment/42'),
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: jsonEncode({
"data": {
"text": "Text",
"guest_name": "Beispiel",
"entry": {
"text": "Text",
"headline": "string",
"feedback_type": "string",
"deleted": true
},
"social_profile": {
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"name_display_type": "string",
"show_profile_picture": true,
"profile_picture_check_status": "string"
},
"is_official": true,
"moderation_status": "string"
}
}),
);
print(response.body);{
"author_name": "Beispiel",
"id": 42,
"text": "Text",
"guest_name": "Beispiel",
"guest_email": "lena.hartmann@example.org",
"entry": {
"author_name": "Beispiel",
"id": 42,
"text": "Text",
"guest_name": "Beispiel",
"board": {
"id": 42,
"name": "Beispiel",
"public_title": "Beispiel",
"public_description": "Text",
"image_url": "https://vynst.de",
"is_public": true,
"public_key": "string",
"sort_order": 1,
"allow_new_entries": true,
"allow_voting": true
},
"headline": "string",
"feedback_type": "string",
"status": "string",
"status_note": "string",
"moderation_status": "string"
},
"social_profile": {
"id": 42,
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"global_profile": true,
"name_display_type": "string",
"show_profile_picture": true,
"profile_picture_check_status": "string",
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
},
"is_official": true,
"moderation_status": "string",
"moderation_reason": "string"
}Updates a comment as an administrator.
PATCH/api/media/feedback_comment/{identifier}
Path parameters
identifierrequiredstring |
Request body application/json
dataMediaFeedbackComment2Show fields (8)
entryMediaFeedbackEntry9Feedback entry the comment belongs to.
textstringText of the comment.
social_profileMediaSocialProfile16Profile that wrote the comment.
guest_namestringName of the guest who wrote the comment.
is_officialbooleanMarks a reply written on behalf of the operator, so the UI can set it apart from community comments.
moderation_statusstringModeration status, for example pending or approved.
moderation_reasonstringReason for the moderation decision.
deletedbooleanThis property is used to mark an entity as deleted / archived
Responses
200Update a MediaFeedbackCommentMediaFeedbackComment
Show fields (14)
author_namestringidintegerPrimary key of the feedback comment. Internal ID.
entryMediaFeedbackEntry8Feedback entry the comment belongs to.
Show fields (17)
author_namestringDisplay name of the author, honouring the pseudonymity the person chose on their social profile. Falls back to the guest name, then to a neutral label — never to an email address.
idintegerPrimary key of the feedback entry. Internal ID.
boardMediaFeedbackBoard5Feedback board the entry belongs to.
headlinestringHeadline of the feedback entry.
textstringText of the feedback entry.
feedback_typestringType of the feedback, for example idea or problem.
statusstringStatus of the feedback, for example open, planned or done.
status_notestringPublicly visible reason for the current status. A declined wish without a reason is worse than no board at all, so this is exposed to every access tier.
moderation_statusstringModeration status, for example pending or approved.
social_profileMediaSocialProfile10Author when submitted by a logged-in person. Reuses the social profile so the pseudonymity settings a person already chose apply here too.
guest_namestringName of the guest who wrote the entry.
vote_countintegerDenormalized so lists can sort by popularity without a join. Maintained by MediaFeedbackVoteHelper; MediaFeedbackRecountCommand repairs it.
comment_countintegerNumber of comments on the entry.
duplicate_ofMediaFeedbackEntry8Merge target. Set together with STATUS_DUPLICATE.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
textstringText of the comment.
social_profileMediaSocialProfile10Profile that wrote the comment.
Show fields (11)
idintegerPrimary key of the social profile. Internal ID.
public_namestringName shown publicly.
profile_picture_urlstringURL of the profile picture.
public_about_mestringText about the person shown publicly.
global_profilebooleanThe profile is a global profile across installations.
name_display_typestringHow the name is shown, for example full name or first name only.
show_profile_picturebooleanThe profile picture is shown.
profile_picture_check_statusstringPruefstatus des Profilbilds (KI-Pruefung, siehe MediaSocialProfilePictureHelper): null = nie geprueft (Pruefung aus), pending, approved, rejected. Nur ein freigegebenes Bild landet in profilePictureUrl, solange die Pruefung eingeschaltet ist.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
guest_namestringName of the guest who wrote the comment.
guest_emailstringScope-only.
is_officialbooleanMarks a reply written on behalf of the operator, so the UI can set it apart from community comments.
moderation_statusstringModeration status, for example pending or approved.
moderation_reasonstringReason for the moderation decision.
moderated_atstring (date-time)Time the comment was moderated.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
curl --request PATCH \
--url https://your-instance.iw-erp.de/api/media/feedback_comment/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"text": "Text",
"guest_name": "Beispiel",
"entry": {
"text": "Text",
"headline": "string",
"feedback_type": "string",
"deleted": true
},
"social_profile": {
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"name_display_type": "string",
"show_profile_picture": true,
"profile_picture_check_status": "string"
},
"is_official": true,
"moderation_status": "string"
}
}
'const options = {
method: 'PATCH',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
text: 'Text',
guest_name: 'Beispiel',
entry: {text: 'Text', headline: 'string', feedback_type: 'string', deleted: true},
social_profile: {
public_name: 'Beispiel',
profile_picture_url: 'https://vynst.de',
public_about_me: 'string',
name_display_type: 'string',
show_profile_picture: true,
profile_picture_check_status: 'string'
},
is_official: true,
moderation_status: 'string'
}
})
};
fetch('https://your-instance.iw-erp.de/api/media/feedback_comment/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/media/feedback_comment/42"
payload = { "data": {
"text": "Text",
"guest_name": "Beispiel",
"entry": {
"text": "Text",
"headline": "string",
"feedback_type": "string",
"deleted": True
},
"social_profile": {
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"name_display_type": "string",
"show_profile_picture": True,
"profile_picture_check_status": "string"
},
"is_official": True,
"moderation_status": "string"
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('PATCH', 'https://your-instance.iw-erp.de/api/media/feedback_comment/42', [
'body' => '{"data":{"text":"Text","guest_name":"Beispiel","entry":{"text":"Text","headline":"string","feedback_type":"string","deleted":true},"social_profile":{"public_name":"Beispiel","profile_picture_url":"https://vynst.de","public_about_me":"string","name_display_type":"string","show_profile_picture":true,"profile_picture_check_status":"string"},"is_official":true,"moderation_status":"string"}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Patch,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/media/feedback_comment/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"text\":\"Text\",\"guest_name\":\"Beispiel\",\"entry\":{\"text\":\"Text\",\"headline\":\"string\",\"feedback_type\":\"string\",\"deleted\":true},\"social_profile\":{\"public_name\":\"Beispiel\",\"profile_picture_url\":\"https://vynst.de\",\"public_about_me\":\"string\",\"name_display_type\":\"string\",\"show_profile_picture\":true,\"profile_picture_check_status\":\"string\"},\"is_official\":true,\"moderation_status\":\"string\"}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"text\":\"Text\",\"guest_name\":\"Beispiel\",\"entry\":{\"text\":\"Text\",\"headline\":\"string\",\"feedback_type\":\"string\",\"deleted\":true},\"social_profile\":{\"public_name\":\"Beispiel\",\"profile_picture_url\":\"https://vynst.de\",\"public_about_me\":\"string\",\"name_display_type\":\"string\",\"show_profile_picture\":true,\"profile_picture_check_status\":\"string\"},\"is_official\":true,\"moderation_status\":\"string\"}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/media/feedback_comment/42")
.patch(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/media/feedback_comment/42"
payload := strings.NewReader("{\"data\":{\"text\":\"Text\",\"guest_name\":\"Beispiel\",\"entry\":{\"text\":\"Text\",\"headline\":\"string\",\"feedback_type\":\"string\",\"deleted\":true},\"social_profile\":{\"public_name\":\"Beispiel\",\"profile_picture_url\":\"https://vynst.de\",\"public_about_me\":\"string\",\"name_display_type\":\"string\",\"show_profile_picture\":true,\"profile_picture_check_status\":\"string\"},\"is_official\":true,\"moderation_status\":\"string\"}}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with package:http (no controller in the iw_erp_api package)
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.patch(
Uri.parse('https://your-instance.iw-erp.de/api/media/feedback_comment/42'),
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: jsonEncode({
"data": {
"text": "Text",
"guest_name": "Beispiel",
"entry": {
"text": "Text",
"headline": "string",
"feedback_type": "string",
"deleted": true
},
"social_profile": {
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"name_display_type": "string",
"show_profile_picture": true,
"profile_picture_check_status": "string"
},
"is_official": true,
"moderation_status": "string"
}
}),
);
print(response.body);{
"author_name": "Beispiel",
"id": 42,
"text": "Text",
"guest_name": "Beispiel",
"guest_email": "lena.hartmann@example.org",
"entry": {
"author_name": "Beispiel",
"id": 42,
"text": "Text",
"guest_name": "Beispiel",
"board": {
"id": 42,
"name": "Beispiel",
"public_title": "Beispiel",
"public_description": "Text",
"image_url": "https://vynst.de",
"is_public": true,
"public_key": "string",
"sort_order": 1,
"allow_new_entries": true,
"allow_voting": true
},
"headline": "string",
"feedback_type": "string",
"status": "string",
"status_note": "string",
"moderation_status": "string"
},
"social_profile": {
"id": 42,
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"global_profile": true,
"name_display_type": "string",
"show_profile_picture": true,
"profile_picture_check_status": "string",
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
},
"is_official": true,
"moderation_status": "string",
"moderation_reason": "string"
}Soft-deletes a comment.
DELETE/api/media/feedback_comment/{identifier}
Path parameters
identifierrequiredstring |
Responses
200Delete a MediaFeedbackCommentMediaFeedbackComment
Show fields (14)
author_namestringidintegerPrimary key of the feedback comment. Internal ID.
entryMediaFeedbackEntry8Feedback entry the comment belongs to.
Show fields (17)
author_namestringDisplay name of the author, honouring the pseudonymity the person chose on their social profile. Falls back to the guest name, then to a neutral label — never to an email address.
idintegerPrimary key of the feedback entry. Internal ID.
boardMediaFeedbackBoard5Feedback board the entry belongs to.
headlinestringHeadline of the feedback entry.
textstringText of the feedback entry.
feedback_typestringType of the feedback, for example idea or problem.
statusstringStatus of the feedback, for example open, planned or done.
status_notestringPublicly visible reason for the current status. A declined wish without a reason is worse than no board at all, so this is exposed to every access tier.
moderation_statusstringModeration status, for example pending or approved.
social_profileMediaSocialProfile10Author when submitted by a logged-in person. Reuses the social profile so the pseudonymity settings a person already chose apply here too.
guest_namestringName of the guest who wrote the entry.
vote_countintegerDenormalized so lists can sort by popularity without a join. Maintained by MediaFeedbackVoteHelper; MediaFeedbackRecountCommand repairs it.
comment_countintegerNumber of comments on the entry.
duplicate_ofMediaFeedbackEntry8Merge target. Set together with STATUS_DUPLICATE.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
textstringText of the comment.
social_profileMediaSocialProfile10Profile that wrote the comment.
Show fields (11)
idintegerPrimary key of the social profile. Internal ID.
public_namestringName shown publicly.
profile_picture_urlstringURL of the profile picture.
public_about_mestringText about the person shown publicly.
global_profilebooleanThe profile is a global profile across installations.
name_display_typestringHow the name is shown, for example full name or first name only.
show_profile_picturebooleanThe profile picture is shown.
profile_picture_check_statusstringPruefstatus des Profilbilds (KI-Pruefung, siehe MediaSocialProfilePictureHelper): null = nie geprueft (Pruefung aus), pending, approved, rejected. Nur ein freigegebenes Bild landet in profilePictureUrl, solange die Pruefung eingeschaltet ist.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
guest_namestringName of the guest who wrote the comment.
guest_emailstringScope-only.
is_officialbooleanMarks a reply written on behalf of the operator, so the UI can set it apart from community comments.
moderation_statusstringModeration status, for example pending or approved.
moderation_reasonstringReason for the moderation decision.
moderated_atstring (date-time)Time the comment was moderated.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
curl --request DELETE \
--url https://your-instance.iw-erp.de/api/media/feedback_comment/42 \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'DELETE', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/media/feedback_comment/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/media/feedback_comment/42"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.delete(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('DELETE', 'https://your-instance.iw-erp.de/api/media/feedback_comment/42', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Delete,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/media/feedback_comment/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/media/feedback_comment/42")
.delete(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/media/feedback_comment/42"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/media_feedback_comment_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await MediaFeedbackCommentController.delete('42');
if (result.success) {
print(result.data);
}{
"author_name": "Beispiel",
"id": 42,
"text": "Text",
"guest_name": "Beispiel",
"guest_email": "lena.hartmann@example.org",
"entry": {
"author_name": "Beispiel",
"id": 42,
"text": "Text",
"guest_name": "Beispiel",
"board": {
"id": 42,
"name": "Beispiel",
"public_title": "Beispiel",
"public_description": "Text",
"image_url": "https://vynst.de",
"is_public": true,
"public_key": "string",
"sort_order": 1,
"allow_new_entries": true,
"allow_voting": true
},
"headline": "string",
"feedback_type": "string",
"status": "string",
"status_note": "string",
"moderation_status": "string"
},
"social_profile": {
"id": 42,
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"global_profile": true,
"name_display_type": "string",
"show_profile_picture": true,
"profile_picture_check_status": "string",
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
},
"is_official": true,
"moderation_status": "string",
"moderation_reason": "string"
}Creates a comment as a logged-in user.
POST/api/media/feedback_comment/user
Request body application/json
dataMediaFeedbackComment2Show fields (8)
entryMediaFeedbackEntry9Feedback entry the comment belongs to.
textstringText of the comment.
social_profileMediaSocialProfile16Profile that wrote the comment.
guest_namestringName of the guest who wrote the comment.
is_officialbooleanMarks a reply written on behalf of the operator, so the UI can set it apart from community comments.
moderation_statusstringModeration status, for example pending or approved.
moderation_reasonstringReason for the moderation decision.
deletedbooleanThis property is used to mark an entity as deleted / archived
Responses
200User creates a feedback commentMediaFeedbackComment3
Show fields (6)
author_namestringidintegerPrimary key of the feedback comment. Internal ID.
textstringText of the comment.
social_profileMediaSocialProfile23Profile that wrote the comment.
guest_namestringName of the guest who wrote the comment.
is_officialbooleanMarks a reply written on behalf of the operator, so the UI can set it apart from community comments.
curl --request POST \
--url https://your-instance.iw-erp.de/api/media/feedback_comment/user \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"text": "Text",
"guest_name": "Beispiel",
"entry": {
"text": "Text",
"headline": "string",
"feedback_type": "string",
"deleted": true
},
"social_profile": {
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"name_display_type": "string",
"show_profile_picture": true,
"profile_picture_check_status": "string"
},
"is_official": true,
"moderation_status": "string"
}
}
'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
text: 'Text',
guest_name: 'Beispiel',
entry: {text: 'Text', headline: 'string', feedback_type: 'string', deleted: true},
social_profile: {
public_name: 'Beispiel',
profile_picture_url: 'https://vynst.de',
public_about_me: 'string',
name_display_type: 'string',
show_profile_picture: true,
profile_picture_check_status: 'string'
},
is_official: true,
moderation_status: 'string'
}
})
};
fetch('https://your-instance.iw-erp.de/api/media/feedback_comment/user', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/media/feedback_comment/user"
payload = { "data": {
"text": "Text",
"guest_name": "Beispiel",
"entry": {
"text": "Text",
"headline": "string",
"feedback_type": "string",
"deleted": True
},
"social_profile": {
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"name_display_type": "string",
"show_profile_picture": True,
"profile_picture_check_status": "string"
},
"is_official": True,
"moderation_status": "string"
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://your-instance.iw-erp.de/api/media/feedback_comment/user', [
'body' => '{"data":{"text":"Text","guest_name":"Beispiel","entry":{"text":"Text","headline":"string","feedback_type":"string","deleted":true},"social_profile":{"public_name":"Beispiel","profile_picture_url":"https://vynst.de","public_about_me":"string","name_display_type":"string","show_profile_picture":true,"profile_picture_check_status":"string"},"is_official":true,"moderation_status":"string"}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/media/feedback_comment/user"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"text\":\"Text\",\"guest_name\":\"Beispiel\",\"entry\":{\"text\":\"Text\",\"headline\":\"string\",\"feedback_type\":\"string\",\"deleted\":true},\"social_profile\":{\"public_name\":\"Beispiel\",\"profile_picture_url\":\"https://vynst.de\",\"public_about_me\":\"string\",\"name_display_type\":\"string\",\"show_profile_picture\":true,\"profile_picture_check_status\":\"string\"},\"is_official\":true,\"moderation_status\":\"string\"}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"text\":\"Text\",\"guest_name\":\"Beispiel\",\"entry\":{\"text\":\"Text\",\"headline\":\"string\",\"feedback_type\":\"string\",\"deleted\":true},\"social_profile\":{\"public_name\":\"Beispiel\",\"profile_picture_url\":\"https://vynst.de\",\"public_about_me\":\"string\",\"name_display_type\":\"string\",\"show_profile_picture\":true,\"profile_picture_check_status\":\"string\"},\"is_official\":true,\"moderation_status\":\"string\"}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/media/feedback_comment/user")
.post(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/media/feedback_comment/user"
payload := strings.NewReader("{\"data\":{\"text\":\"Text\",\"guest_name\":\"Beispiel\",\"entry\":{\"text\":\"Text\",\"headline\":\"string\",\"feedback_type\":\"string\",\"deleted\":true},\"social_profile\":{\"public_name\":\"Beispiel\",\"profile_picture_url\":\"https://vynst.de\",\"public_about_me\":\"string\",\"name_display_type\":\"string\",\"show_profile_picture\":true,\"profile_picture_check_status\":\"string\"},\"is_official\":true,\"moderation_status\":\"string\"}}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/media_feedback_comment_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/media_feedback_comment.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await MediaFeedbackCommentController.postUser(MediaFeedbackComment.fromJson({
"text": "Text",
"guest_name": "Beispiel",
"entry": {
"text": "Text",
"headline": "string",
"feedback_type": "string",
"deleted": true
},
"social_profile": {
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"name_display_type": "string",
"show_profile_picture": true,
"profile_picture_check_status": "string"
},
"is_official": true,
"moderation_status": "string"
}));
if (result.success) {
print(result.data);
}{
"author_name": "Beispiel",
"id": 42,
"text": "Text",
"guest_name": "Beispiel",
"is_official": true
}Moderates several comments in one call.
PUT/api/media/feedback_comment/bulk_moderation
Comment moderation is on by default, so this queue is the one that fills up fastest — and approving thirty harmless replies one request at a time is the work nobody does, which is how a moderated board ends up looking dead.
Approving or hiding also refreshes the comment counters of the entries involved, because the count only includes visible comments.
Query parameters
identifiersrequiredstring | Comma separated comment identifiers |
moderationStatusrequiredstring | Target moderation status |
moderationReasonstring | Reason kept with the comment |
Responses
200Moderate multiple comments at onceMediaFeedbackComment
Show fields (14)
author_namestringidintegerPrimary key of the feedback comment. Internal ID.
entryMediaFeedbackEntry8Feedback entry the comment belongs to.
Show fields (17)
author_namestringDisplay name of the author, honouring the pseudonymity the person chose on their social profile. Falls back to the guest name, then to a neutral label — never to an email address.
idintegerPrimary key of the feedback entry. Internal ID.
boardMediaFeedbackBoard5Feedback board the entry belongs to.
headlinestringHeadline of the feedback entry.
textstringText of the feedback entry.
feedback_typestringType of the feedback, for example idea or problem.
statusstringStatus of the feedback, for example open, planned or done.
status_notestringPublicly visible reason for the current status. A declined wish without a reason is worse than no board at all, so this is exposed to every access tier.
moderation_statusstringModeration status, for example pending or approved.
social_profileMediaSocialProfile10Author when submitted by a logged-in person. Reuses the social profile so the pseudonymity settings a person already chose apply here too.
guest_namestringName of the guest who wrote the entry.
vote_countintegerDenormalized so lists can sort by popularity without a join. Maintained by MediaFeedbackVoteHelper; MediaFeedbackRecountCommand repairs it.
comment_countintegerNumber of comments on the entry.
duplicate_ofMediaFeedbackEntry8Merge target. Set together with STATUS_DUPLICATE.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
textstringText of the comment.
social_profileMediaSocialProfile10Profile that wrote the comment.
Show fields (11)
idintegerPrimary key of the social profile. Internal ID.
public_namestringName shown publicly.
profile_picture_urlstringURL of the profile picture.
public_about_mestringText about the person shown publicly.
global_profilebooleanThe profile is a global profile across installations.
name_display_typestringHow the name is shown, for example full name or first name only.
show_profile_picturebooleanThe profile picture is shown.
profile_picture_check_statusstringPruefstatus des Profilbilds (KI-Pruefung, siehe MediaSocialProfilePictureHelper): null = nie geprueft (Pruefung aus), pending, approved, rejected. Nur ein freigegebenes Bild landet in profilePictureUrl, solange die Pruefung eingeschaltet ist.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
guest_namestringName of the guest who wrote the comment.
guest_emailstringScope-only.
is_officialbooleanMarks a reply written on behalf of the operator, so the UI can set it apart from community comments.
moderation_statusstringModeration status, for example pending or approved.
moderation_reasonstringReason for the moderation decision.
moderated_atstring (date-time)Time the comment was moderated.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
curl --request PUT \
--url 'https://your-instance.iw-erp.de/api/media/feedback_comment/bulk_moderation?identifiers=string&moderationStatus=string' \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'PUT', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/media/feedback_comment/bulk_moderation?identifiers=string&moderationStatus=string', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/media/feedback_comment/bulk_moderation?identifiers=string&moderationStatus=string"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.put(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('PUT', 'https://your-instance.iw-erp.de/api/media/feedback_comment/bulk_moderation?identifiers=string&moderationStatus=string', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Put,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/media/feedback_comment/bulk_moderation?identifiers=string&moderationStatus=string"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/media/feedback_comment/bulk_moderation?identifiers=string&moderationStatus=string")
.put(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/media/feedback_comment/bulk_moderation?identifiers=string&moderationStatus=string"
req, _ := http.NewRequest("PUT", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/media_feedback_comment_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await MediaFeedbackCommentController.bulkModerate(['42'], 'string');
if (result.success) {
print(result.data);
}{
"author_name": "Beispiel",
"id": 42,
"text": "Text",
"guest_name": "Beispiel",
"guest_email": "lena.hartmann@example.org",
"entry": {
"author_name": "Beispiel",
"id": 42,
"text": "Text",
"guest_name": "Beispiel",
"board": {
"id": 42,
"name": "Beispiel",
"public_title": "Beispiel",
"public_description": "Text",
"image_url": "https://vynst.de",
"is_public": true,
"public_key": "string",
"sort_order": 1,
"allow_new_entries": true,
"allow_voting": true
},
"headline": "string",
"feedback_type": "string",
"status": "string",
"status_note": "string",
"moderation_status": "string"
},
"social_profile": {
"id": 42,
"public_name": "Beispiel",
"profile_picture_url": "https://vynst.de",
"public_about_me": "string",
"global_profile": true,
"name_display_type": "string",
"show_profile_picture": true,
"profile_picture_check_status": "string",
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
},
"is_official": true,
"moderation_status": "string",
"moderation_reason": "string"
}Soft-deletes the caller's own comment.
DELETE/api/media/feedback_comment/user/{identifier}
Path parameters
identifierrequiredstring |
Responses
200User deletes their own commentMediaFeedbackComment3
Show fields (6)
author_namestringidintegerPrimary key of the feedback comment. Internal ID.
textstringText of the comment.
social_profileMediaSocialProfile23Profile that wrote the comment.
guest_namestringName of the guest who wrote the comment.
is_officialbooleanMarks a reply written on behalf of the operator, so the UI can set it apart from community comments.
curl --request DELETE \
--url https://your-instance.iw-erp.de/api/media/feedback_comment/user/42 \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'DELETE', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/media/feedback_comment/user/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/media/feedback_comment/user/42"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.delete(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('DELETE', 'https://your-instance.iw-erp.de/api/media/feedback_comment/user/42', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Delete,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/media/feedback_comment/user/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/media/feedback_comment/user/42")
.delete(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/media/feedback_comment/user/42"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/media_feedback_comment_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await MediaFeedbackCommentController.deleteUser('42');
if (result.success) {
print(result.data);
}{
"author_name": "Beispiel",
"id": 42,
"text": "Text",
"guest_name": "Beispiel",
"is_official": true
}