curl --request POST \
--url https://api.redem.io/v3/qualityCheckSuggestions \
--header 'Content-Type: application/json' \
--header 'api-key: <api-key>' \
--data '
{
"surveyPlatform": "SightX",
"allInclusive": true,
"surveyStructure": [
{
"questionId": "Q1",
"questionType": "OpenEnd",
"question": "Why did you choose this product?"
},
{
"questionId": "Q2",
"questionType": "Grid",
"question": "Please rate the following brands.",
"items": [
"Brand A",
"Brand B",
"Brand C",
"Brand D",
"Brand E"
],
"answerOptions": [
"Very poor",
"Poor",
"Neutral",
"Good",
"Excellent"
],
"isMultiSelect": false,
"isRandomized": false
},
{
"questionId": "Q3",
"questionType": "Select",
"question": "Which age group are you in?",
"answerOptions": [
"18-24",
"25-34",
"35-44",
"45-54",
"55+"
],
"isMultiSelect": false
}
]
}
'import requests
url = "https://api.redem.io/v3/qualityCheckSuggestions"
payload = {
"surveyPlatform": "SightX",
"allInclusive": True,
"surveyStructure": [
{
"questionId": "Q1",
"questionType": "OpenEnd",
"question": "Why did you choose this product?"
},
{
"questionId": "Q2",
"questionType": "Grid",
"question": "Please rate the following brands.",
"items": ["Brand A", "Brand B", "Brand C", "Brand D", "Brand E"],
"answerOptions": ["Very poor", "Poor", "Neutral", "Good", "Excellent"],
"isMultiSelect": False,
"isRandomized": False
},
{
"questionId": "Q3",
"questionType": "Select",
"question": "Which age group are you in?",
"answerOptions": ["18-24", "25-34", "35-44", "45-54", "55+"],
"isMultiSelect": False
}
]
}
headers = {
"api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
surveyPlatform: 'SightX',
allInclusive: true,
surveyStructure: [
{
questionId: 'Q1',
questionType: 'OpenEnd',
question: 'Why did you choose this product?'
},
{
questionId: 'Q2',
questionType: 'Grid',
question: 'Please rate the following brands.',
items: ['Brand A', 'Brand B', 'Brand C', 'Brand D', 'Brand E'],
answerOptions: ['Very poor', 'Poor', 'Neutral', 'Good', 'Excellent'],
isMultiSelect: false,
isRandomized: false
},
{
questionId: 'Q3',
questionType: 'Select',
question: 'Which age group are you in?',
answerOptions: ['18-24', '25-34', '35-44', '45-54', '55+'],
isMultiSelect: false
}
]
})
};
fetch('https://api.redem.io/v3/qualityCheckSuggestions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.redem.io/v3/qualityCheckSuggestions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'surveyPlatform' => 'SightX',
'allInclusive' => true,
'surveyStructure' => [
[
'questionId' => 'Q1',
'questionType' => 'OpenEnd',
'question' => 'Why did you choose this product?'
],
[
'questionId' => 'Q2',
'questionType' => 'Grid',
'question' => 'Please rate the following brands.',
'items' => [
'Brand A',
'Brand B',
'Brand C',
'Brand D',
'Brand E'
],
'answerOptions' => [
'Very poor',
'Poor',
'Neutral',
'Good',
'Excellent'
],
'isMultiSelect' => false,
'isRandomized' => false
],
[
'questionId' => 'Q3',
'questionType' => 'Select',
'question' => 'Which age group are you in?',
'answerOptions' => [
'18-24',
'25-34',
'35-44',
'45-54',
'55+'
],
'isMultiSelect' => false
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.redem.io/v3/qualityCheckSuggestions"
payload := strings.NewReader("{\n \"surveyPlatform\": \"SightX\",\n \"allInclusive\": true,\n \"surveyStructure\": [\n {\n \"questionId\": \"Q1\",\n \"questionType\": \"OpenEnd\",\n \"question\": \"Why did you choose this product?\"\n },\n {\n \"questionId\": \"Q2\",\n \"questionType\": \"Grid\",\n \"question\": \"Please rate the following brands.\",\n \"items\": [\n \"Brand A\",\n \"Brand B\",\n \"Brand C\",\n \"Brand D\",\n \"Brand E\"\n ],\n \"answerOptions\": [\n \"Very poor\",\n \"Poor\",\n \"Neutral\",\n \"Good\",\n \"Excellent\"\n ],\n \"isMultiSelect\": false,\n \"isRandomized\": false\n },\n {\n \"questionId\": \"Q3\",\n \"questionType\": \"Select\",\n \"question\": \"Which age group are you in?\",\n \"answerOptions\": [\n \"18-24\",\n \"25-34\",\n \"35-44\",\n \"45-54\",\n \"55+\"\n ],\n \"isMultiSelect\": false\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("api-key", "<api-key>")
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))
}HttpResponse<String> response = Unirest.post("https://api.redem.io/v3/qualityCheckSuggestions")
.header("api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"surveyPlatform\": \"SightX\",\n \"allInclusive\": true,\n \"surveyStructure\": [\n {\n \"questionId\": \"Q1\",\n \"questionType\": \"OpenEnd\",\n \"question\": \"Why did you choose this product?\"\n },\n {\n \"questionId\": \"Q2\",\n \"questionType\": \"Grid\",\n \"question\": \"Please rate the following brands.\",\n \"items\": [\n \"Brand A\",\n \"Brand B\",\n \"Brand C\",\n \"Brand D\",\n \"Brand E\"\n ],\n \"answerOptions\": [\n \"Very poor\",\n \"Poor\",\n \"Neutral\",\n \"Good\",\n \"Excellent\"\n ],\n \"isMultiSelect\": false,\n \"isRandomized\": false\n },\n {\n \"questionId\": \"Q3\",\n \"questionType\": \"Select\",\n \"question\": \"Which age group are you in?\",\n \"answerOptions\": [\n \"18-24\",\n \"25-34\",\n \"35-44\",\n \"45-54\",\n \"55+\"\n ],\n \"isMultiSelect\": false\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.redem.io/v3/qualityCheckSuggestions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"surveyPlatform\": \"SightX\",\n \"allInclusive\": true,\n \"surveyStructure\": [\n {\n \"questionId\": \"Q1\",\n \"questionType\": \"OpenEnd\",\n \"question\": \"Why did you choose this product?\"\n },\n {\n \"questionId\": \"Q2\",\n \"questionType\": \"Grid\",\n \"question\": \"Please rate the following brands.\",\n \"items\": [\n \"Brand A\",\n \"Brand B\",\n \"Brand C\",\n \"Brand D\",\n \"Brand E\"\n ],\n \"answerOptions\": [\n \"Very poor\",\n \"Poor\",\n \"Neutral\",\n \"Good\",\n \"Excellent\"\n ],\n \"isMultiSelect\": false,\n \"isRandomized\": false\n },\n {\n \"questionId\": \"Q3\",\n \"questionType\": \"Select\",\n \"question\": \"Which age group are you in?\",\n \"answerOptions\": [\n \"18-24\",\n \"25-34\",\n \"35-44\",\n \"45-54\",\n \"55+\"\n ],\n \"isMultiSelect\": false\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Quality check suggestions generated",
"results": {
"OES": [
{
"questionId": "Q1",
"keywords": [
"price",
"quality",
"brand"
],
"enableDuplicateCheck": true
}
],
"GQS": [
{
"questionId": "Q2",
"enablePatternCheck": true
}
],
"CHS": {
"questionIds": [
"Q3",
"Q2"
],
"surveyDescription": "A survey about brand preference and product choice among shoppers."
},
"BAS": [
{
"questionId": "Q1",
"keystrokes": true,
"mouse": true
}
],
"cleaningSettings": {
"redemScore": 60,
"OES": {
"activate": true,
"score": 40,
"minDataPoints": 2
},
"CHS": {
"activate": true,
"score": 30
},
"GQS": {
"activate": true,
"score": 20,
"minDataPoints": 2
},
"TS": {
"activate": true,
"score": 30
},
"BAS": {
"activate": true,
"score": 20,
"minDataPoints": 2
},
"DES": {
"activate": true,
"score": 40
}
}
}
}{
"success": false,
"message": "Validation Failed",
"errors": {}
}Quality Check Suggestions
Generate smart quality-check suggestions from a survey questionnaire structure. Partners can use this to help their users set up API projects in ReDem with recommendations that align with ReDem best practices — reducing manual configuration effort for OES, GQS, CHS, and BAS.
Use the returned question IDs, keywords, and cleaning settings when calling POST /v3/addRespondent.
TS is not suggested by this endpoint. DES suggestions are coming soon.
curl --request POST \
--url https://api.redem.io/v3/qualityCheckSuggestions \
--header 'Content-Type: application/json' \
--header 'api-key: <api-key>' \
--data '
{
"surveyPlatform": "SightX",
"allInclusive": true,
"surveyStructure": [
{
"questionId": "Q1",
"questionType": "OpenEnd",
"question": "Why did you choose this product?"
},
{
"questionId": "Q2",
"questionType": "Grid",
"question": "Please rate the following brands.",
"items": [
"Brand A",
"Brand B",
"Brand C",
"Brand D",
"Brand E"
],
"answerOptions": [
"Very poor",
"Poor",
"Neutral",
"Good",
"Excellent"
],
"isMultiSelect": false,
"isRandomized": false
},
{
"questionId": "Q3",
"questionType": "Select",
"question": "Which age group are you in?",
"answerOptions": [
"18-24",
"25-34",
"35-44",
"45-54",
"55+"
],
"isMultiSelect": false
}
]
}
'import requests
url = "https://api.redem.io/v3/qualityCheckSuggestions"
payload = {
"surveyPlatform": "SightX",
"allInclusive": True,
"surveyStructure": [
{
"questionId": "Q1",
"questionType": "OpenEnd",
"question": "Why did you choose this product?"
},
{
"questionId": "Q2",
"questionType": "Grid",
"question": "Please rate the following brands.",
"items": ["Brand A", "Brand B", "Brand C", "Brand D", "Brand E"],
"answerOptions": ["Very poor", "Poor", "Neutral", "Good", "Excellent"],
"isMultiSelect": False,
"isRandomized": False
},
{
"questionId": "Q3",
"questionType": "Select",
"question": "Which age group are you in?",
"answerOptions": ["18-24", "25-34", "35-44", "45-54", "55+"],
"isMultiSelect": False
}
]
}
headers = {
"api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
surveyPlatform: 'SightX',
allInclusive: true,
surveyStructure: [
{
questionId: 'Q1',
questionType: 'OpenEnd',
question: 'Why did you choose this product?'
},
{
questionId: 'Q2',
questionType: 'Grid',
question: 'Please rate the following brands.',
items: ['Brand A', 'Brand B', 'Brand C', 'Brand D', 'Brand E'],
answerOptions: ['Very poor', 'Poor', 'Neutral', 'Good', 'Excellent'],
isMultiSelect: false,
isRandomized: false
},
{
questionId: 'Q3',
questionType: 'Select',
question: 'Which age group are you in?',
answerOptions: ['18-24', '25-34', '35-44', '45-54', '55+'],
isMultiSelect: false
}
]
})
};
fetch('https://api.redem.io/v3/qualityCheckSuggestions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.redem.io/v3/qualityCheckSuggestions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'surveyPlatform' => 'SightX',
'allInclusive' => true,
'surveyStructure' => [
[
'questionId' => 'Q1',
'questionType' => 'OpenEnd',
'question' => 'Why did you choose this product?'
],
[
'questionId' => 'Q2',
'questionType' => 'Grid',
'question' => 'Please rate the following brands.',
'items' => [
'Brand A',
'Brand B',
'Brand C',
'Brand D',
'Brand E'
],
'answerOptions' => [
'Very poor',
'Poor',
'Neutral',
'Good',
'Excellent'
],
'isMultiSelect' => false,
'isRandomized' => false
],
[
'questionId' => 'Q3',
'questionType' => 'Select',
'question' => 'Which age group are you in?',
'answerOptions' => [
'18-24',
'25-34',
'35-44',
'45-54',
'55+'
],
'isMultiSelect' => false
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.redem.io/v3/qualityCheckSuggestions"
payload := strings.NewReader("{\n \"surveyPlatform\": \"SightX\",\n \"allInclusive\": true,\n \"surveyStructure\": [\n {\n \"questionId\": \"Q1\",\n \"questionType\": \"OpenEnd\",\n \"question\": \"Why did you choose this product?\"\n },\n {\n \"questionId\": \"Q2\",\n \"questionType\": \"Grid\",\n \"question\": \"Please rate the following brands.\",\n \"items\": [\n \"Brand A\",\n \"Brand B\",\n \"Brand C\",\n \"Brand D\",\n \"Brand E\"\n ],\n \"answerOptions\": [\n \"Very poor\",\n \"Poor\",\n \"Neutral\",\n \"Good\",\n \"Excellent\"\n ],\n \"isMultiSelect\": false,\n \"isRandomized\": false\n },\n {\n \"questionId\": \"Q3\",\n \"questionType\": \"Select\",\n \"question\": \"Which age group are you in?\",\n \"answerOptions\": [\n \"18-24\",\n \"25-34\",\n \"35-44\",\n \"45-54\",\n \"55+\"\n ],\n \"isMultiSelect\": false\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("api-key", "<api-key>")
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))
}HttpResponse<String> response = Unirest.post("https://api.redem.io/v3/qualityCheckSuggestions")
.header("api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"surveyPlatform\": \"SightX\",\n \"allInclusive\": true,\n \"surveyStructure\": [\n {\n \"questionId\": \"Q1\",\n \"questionType\": \"OpenEnd\",\n \"question\": \"Why did you choose this product?\"\n },\n {\n \"questionId\": \"Q2\",\n \"questionType\": \"Grid\",\n \"question\": \"Please rate the following brands.\",\n \"items\": [\n \"Brand A\",\n \"Brand B\",\n \"Brand C\",\n \"Brand D\",\n \"Brand E\"\n ],\n \"answerOptions\": [\n \"Very poor\",\n \"Poor\",\n \"Neutral\",\n \"Good\",\n \"Excellent\"\n ],\n \"isMultiSelect\": false,\n \"isRandomized\": false\n },\n {\n \"questionId\": \"Q3\",\n \"questionType\": \"Select\",\n \"question\": \"Which age group are you in?\",\n \"answerOptions\": [\n \"18-24\",\n \"25-34\",\n \"35-44\",\n \"45-54\",\n \"55+\"\n ],\n \"isMultiSelect\": false\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.redem.io/v3/qualityCheckSuggestions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"surveyPlatform\": \"SightX\",\n \"allInclusive\": true,\n \"surveyStructure\": [\n {\n \"questionId\": \"Q1\",\n \"questionType\": \"OpenEnd\",\n \"question\": \"Why did you choose this product?\"\n },\n {\n \"questionId\": \"Q2\",\n \"questionType\": \"Grid\",\n \"question\": \"Please rate the following brands.\",\n \"items\": [\n \"Brand A\",\n \"Brand B\",\n \"Brand C\",\n \"Brand D\",\n \"Brand E\"\n ],\n \"answerOptions\": [\n \"Very poor\",\n \"Poor\",\n \"Neutral\",\n \"Good\",\n \"Excellent\"\n ],\n \"isMultiSelect\": false,\n \"isRandomized\": false\n },\n {\n \"questionId\": \"Q3\",\n \"questionType\": \"Select\",\n \"question\": \"Which age group are you in?\",\n \"answerOptions\": [\n \"18-24\",\n \"25-34\",\n \"35-44\",\n \"45-54\",\n \"55+\"\n ],\n \"isMultiSelect\": false\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Quality check suggestions generated",
"results": {
"OES": [
{
"questionId": "Q1",
"keywords": [
"price",
"quality",
"brand"
],
"enableDuplicateCheck": true
}
],
"GQS": [
{
"questionId": "Q2",
"enablePatternCheck": true
}
],
"CHS": {
"questionIds": [
"Q3",
"Q2"
],
"surveyDescription": "A survey about brand preference and product choice among shoppers."
},
"BAS": [
{
"questionId": "Q1",
"keystrokes": true,
"mouse": true
}
],
"cleaningSettings": {
"redemScore": 60,
"OES": {
"activate": true,
"score": 40,
"minDataPoints": 2
},
"CHS": {
"activate": true,
"score": 30
},
"GQS": {
"activate": true,
"score": 20,
"minDataPoints": 2
},
"TS": {
"activate": true,
"score": 30
},
"BAS": {
"activate": true,
"score": 20,
"minDataPoints": 2
},
"DES": {
"activate": true,
"score": 40
}
}
}
}{
"success": false,
"message": "Validation Failed",
"errors": {}
}- Suggested OES questions with keywords and duplicate-check flags
- Suggested GQS grids with pattern-check recommendations
- Suggested CHS question IDs plus a
surveyDescription - Suggested BAS tracking targets (derived from suggested OES questions)
- Recommended default cleaning settings for API v3
- TS is not suggested here; configure it separately in your integration. DES suggestions are coming soon.
- Cap suggestion volume with
allInclusive(defaulttrue) to match all-inclusive plan limits.
Authorizations
Body
Request body for generating quality-check suggestions for an API project setup.
🔒 Authentication: This endpoint is only accessible via a PRIVATE API key.
Questionnaire structure used to suggest quality checks. Maximum 500 questions. Each item is a discriminated union on questionType (OpenEnd, Grid, or Select). Each questionId must be unique.
500A question from your survey platform questionnaire. Discriminated by questionType (OpenEnd | Grid | Select) — each variant has its own required and optional fields. questionId values must be unique across surveyStructure.
- OpenEnd
- Grid
- Select
Show child attributes
Show child attributes
Optional survey platform identifier (for example SightX, qualtrics). Stored for logging and support only; it does not change suggestions.
"SightX"
When true (default), suggestion counts are capped to all-inclusive plan limits (OES 5, GQS 20, CHS 100 question slots). When false, higher API maxima are used (OES 30, GQS 20, CHS 300 slots).

