Feedback Public
curl --request GET \
--url https://your-instance.iw-erp.de/api/media/feedback_public/roadmap \
--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_public/roadmap', 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_public/roadmap"
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_public/roadmap', [
'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_public/roadmap"),
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_public/roadmap")
.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_public/roadmap"
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 package:http (no controller in the iw_erp_api package)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://your-instance.iw-erp.de/api/media/feedback_public/roadmap'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Confirms a guest submission or vote from the double opt-in link.
GET/api/media/feedback_public/confirm/{confirmToken}
The token is cleared on use, so a forwarded mail cannot be replayed.
Path parameters
confirmTokenrequiredstring |
Responses
default
curl --request GET \
--url https://your-instance.iw-erp.de/api/media/feedback_public/confirm/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_public/confirm/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_public/confirm/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_public/confirm/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_public/confirm/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_public/confirm/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_public/confirm/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 package:http (no controller in the iw_erp_api package)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://your-instance.iw-erp.de/api/media/feedback_public/confirm/42'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);A single public entry with its comments and status history.
GET/api/media/feedback_public/board/{publicKey}/entry/{identifier}
Path parameters
publicKeyrequiredstring | |
identifierrequiredstring |
Query parameters
voterTokenstring | Caller's own voter token |
Responses
default
curl --request GET \
--url https://your-instance.iw-erp.de/api/media/feedback_public/board/42/entry/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_public/board/42/entry/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_public/board/42/entry/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_public/board/42/entry/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_public/board/42/entry/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_public/board/42/entry/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_public/board/42/entry/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 package:http (no controller in the iw_erp_api package)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://your-instance.iw-erp.de/api/media/feedback_public/board/42/entry/42'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Submits an entry without a session.
POST/api/media/feedback_public/board/{publicKey}/entry
The response carries the guest token exactly once — it is the only way the guest can come back to their own entry, and it is never serialized again afterwards.
Path parameters
publicKeyrequiredstring |
Request body application/json
dataMediaFeedbackEntry2Show fields (17)
boardMediaFeedbackBoard2Feedback 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.
moderation_reasonstringReason for the moderation decision.
social_profileMediaSocialProfile16Author 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.
attachmentsarray<Attachment12>Files attached to the entry.
duplicate_ofMediaFeedbackEntry2Merge target. Set together with STATUS_DUPLICATE.
roadmap_itemsarray<MediaFeedbackRoadmapItem2>internal_notestringScope-only.
internal_priorityintegerScope-only.
deletedbooleanThis property is used to mark an entity as deleted / archived
ucatsarray<UnifiedCategory11>Unified categories of the entity.
Responses
default
curl --request POST \
--url https://your-instance.iw-erp.de/api/media/feedback_public/board/42/entry \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"text": "Text",
"guest_name": "Beispiel",
"board": {
"name": "Beispiel",
"public_title": "Beispiel",
"public_description": "Text",
"image_url": "https://vynst.de",
"sort_order": 1,
"allow_new_entries": true
},
"headline": "string",
"feedback_type": "string",
"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',
board: {
name: 'Beispiel',
public_title: 'Beispiel',
public_description: 'Text',
image_url: 'https://vynst.de',
sort_order: 1,
allow_new_entries: true
},
headline: 'string',
feedback_type: 'string',
status: 'string'
}
})
};
fetch('https://your-instance.iw-erp.de/api/media/feedback_public/board/42/entry', 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_public/board/42/entry"
payload = { "data": {
"text": "Text",
"guest_name": "Beispiel",
"board": {
"name": "Beispiel",
"public_title": "Beispiel",
"public_description": "Text",
"image_url": "https://vynst.de",
"sort_order": 1,
"allow_new_entries": True
},
"headline": "string",
"feedback_type": "string",
"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_public/board/42/entry', [
'body' => '{"data":{"text":"Text","guest_name":"Beispiel","board":{"name":"Beispiel","public_title":"Beispiel","public_description":"Text","image_url":"https://vynst.de","sort_order":1,"allow_new_entries":true},"headline":"string","feedback_type":"string","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_public/board/42/entry"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"text\":\"Text\",\"guest_name\":\"Beispiel\",\"board\":{\"name\":\"Beispiel\",\"public_title\":\"Beispiel\",\"public_description\":\"Text\",\"image_url\":\"https://vynst.de\",\"sort_order\":1,\"allow_new_entries\":true},\"headline\":\"string\",\"feedback_type\":\"string\",\"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\",\"board\":{\"name\":\"Beispiel\",\"public_title\":\"Beispiel\",\"public_description\":\"Text\",\"image_url\":\"https://vynst.de\",\"sort_order\":1,\"allow_new_entries\":true},\"headline\":\"string\",\"feedback_type\":\"string\",\"status\":\"string\"}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/media/feedback_public/board/42/entry")
.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_public/board/42/entry"
payload := strings.NewReader("{\"data\":{\"text\":\"Text\",\"guest_name\":\"Beispiel\",\"board\":{\"name\":\"Beispiel\",\"public_title\":\"Beispiel\",\"public_description\":\"Text\",\"image_url\":\"https://vynst.de\",\"sort_order\":1,\"allow_new_entries\":true},\"headline\":\"string\",\"feedback_type\":\"string\",\"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 package:http (no controller in the iw_erp_api package)
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.post(
Uri.parse('https://your-instance.iw-erp.de/api/media/feedback_public/board/42/entry'),
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: jsonEncode({
"data": {
"text": "Text",
"guest_name": "Beispiel",
"board": {
"name": "Beispiel",
"public_title": "Beispiel",
"public_description": "Text",
"image_url": "https://vynst.de",
"sort_order": 1,
"allow_new_entries": true
},
"headline": "string",
"feedback_type": "string",
"status": "string"
}
}),
);
print(response.body);Casts a guest vote.
POST/api/media/feedback_public/board/{publicKey}/vote
Path parameters
publicKeyrequiredstring |
Query parameters
entryIdentifierrequiredstring | Entry to vote for |
voterTokenrequiredstring | Caller's own voter token |
Responses
default
curl --request POST \
--url 'https://your-instance.iw-erp.de/api/media/feedback_public/board/42/vote?entryIdentifier=42&voterToken=string' \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'POST', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/media/feedback_public/board/42/vote?entryIdentifier=42&voterToken=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_public/board/42/vote?entryIdentifier=42&voterToken=string"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.post(url, 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_public/board/42/vote?entryIdentifier=42&voterToken=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.Post,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/media/feedback_public/board/42/vote?entryIdentifier=42&voterToken=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_public/board/42/vote?entryIdentifier=42&voterToken=string")
.post(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_public/board/42/vote?entryIdentifier=42&voterToken=string"
req, _ := http.NewRequest("POST", 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 package:http (no controller in the iw_erp_api package)
import 'package:http/http.dart' as http;
final response = await http.post(
Uri.parse('https://your-instance.iw-erp.de/api/media/feedback_public/board/42/vote').replace(queryParameters: {'entryIdentifier': '42', 'voterToken': 'string'}),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Withdraws a guest vote.
DELETE/api/media/feedback_public/board/{publicKey}/vote
Path parameters
publicKeyrequiredstring |
Query parameters
entryIdentifierrequiredstring | Entry to withdraw the vote from |
voterTokenrequiredstring | Caller's own voter token |
Responses
default
curl --request DELETE \
--url 'https://your-instance.iw-erp.de/api/media/feedback_public/board/42/vote?entryIdentifier=42&voterToken=string' \
--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_public/board/42/vote?entryIdentifier=42&voterToken=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_public/board/42/vote?entryIdentifier=42&voterToken=string"
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_public/board/42/vote?entryIdentifier=42&voterToken=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.Delete,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/media/feedback_public/board/42/vote?entryIdentifier=42&voterToken=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_public/board/42/vote?entryIdentifier=42&voterToken=string")
.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_public/board/42/vote?entryIdentifier=42&voterToken=string"
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 package:http (no controller in the iw_erp_api package)
import 'package:http/http.dart' as http;
final response = await http.delete(
Uri.parse('https://your-instance.iw-erp.de/api/media/feedback_public/board/42/vote').replace(queryParameters: {'entryIdentifier': '42', 'voterToken': 'string'}),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Board, capabilities, limits and the first page of entries — everything the widget needs to draw itself, in one request. Split across several calls it would flicker while it works out what it is allowed to show.
GET/api/media/feedback_public/board/{publicKey}
Path parameters
publicKeyrequiredstring |
Query parameters
sortstring | top, new or status |
statusstring | Filter by entry status |
pageinteger | Zero-based page index |
limitinteger | Page size, max 100 |
voterTokenstring | Caller's own voter token, to mark entries they already voted for |
Responses
default
curl --request GET \
--url https://your-instance.iw-erp.de/api/media/feedback_public/board/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_public/board/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_public/board/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_public/board/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_public/board/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_public/board/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_public/board/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 package:http (no controller in the iw_erp_api package)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://your-instance.iw-erp.de/api/media/feedback_public/board/42'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);