curl --request PATCH \
--url https://api.ropes.ai/api/public/problems/{problemId} \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"problemTitle": "<string>",
"desiredTime": 45,
"includeAiUsageScoring": true,
"expirationDays": 183
}
'import requests
url = "https://api.ropes.ai/api/public/problems/{problemId}"
payload = {
"problemTitle": "<string>",
"desiredTime": 45,
"includeAiUsageScoring": True,
"expirationDays": 183
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
problemTitle: '<string>',
desiredTime: 45,
includeAiUsageScoring: true,
expirationDays: 183
})
};
fetch('https://api.ropes.ai/api/public/problems/{problemId}', 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.ropes.ai/api/public/problems/{problemId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'problemTitle' => '<string>',
'desiredTime' => 45,
'includeAiUsageScoring' => true,
'expirationDays' => 183
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-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.ropes.ai/api/public/problems/{problemId}"
payload := strings.NewReader("{\n \"problemTitle\": \"<string>\",\n \"desiredTime\": 45,\n \"includeAiUsageScoring\": true,\n \"expirationDays\": 183\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("x-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.patch("https://api.ropes.ai/api/public/problems/{problemId}")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"problemTitle\": \"<string>\",\n \"desiredTime\": 45,\n \"includeAiUsageScoring\": true,\n \"expirationDays\": 183\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ropes.ai/api/public/problems/{problemId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"problemTitle\": \"<string>\",\n \"desiredTime\": 45,\n \"includeAiUsageScoring\": true,\n \"expirationDays\": 183\n}"
response = http.request(request)
puts response.read_body{
"problem": {
"id": "<string>",
"name": "<string>",
"status": "Ready",
"type": "technical-assessment",
"duration": 123,
"candidateSummary": "<string>",
"problemSummary": "<string>",
"scoringCategories": [
{
"title": "<string>",
"weight": 123,
"rubric": "<string>"
}
],
"externalResourceMode": "CLOSED",
"integrationSource": "<string>",
"externalId": "<string>",
"testMode": true,
"isFromRopesTestBank": true
}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Update Problem
Update settings on an existing technical assessment. Only the fields present in the request body are changed; omitted fields keep their current value. Video screens, archived problems, and problems shared from the Ropes Test Bank cannot be updated, and a problem must be in the Ready status. Changes apply to assessments issued from this point on — assessments already issued keep the settings they were created with.
curl --request PATCH \
--url https://api.ropes.ai/api/public/problems/{problemId} \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"problemTitle": "<string>",
"desiredTime": 45,
"includeAiUsageScoring": true,
"expirationDays": 183
}
'import requests
url = "https://api.ropes.ai/api/public/problems/{problemId}"
payload = {
"problemTitle": "<string>",
"desiredTime": 45,
"includeAiUsageScoring": True,
"expirationDays": 183
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
problemTitle: '<string>',
desiredTime: 45,
includeAiUsageScoring: true,
expirationDays: 183
})
};
fetch('https://api.ropes.ai/api/public/problems/{problemId}', 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.ropes.ai/api/public/problems/{problemId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'problemTitle' => '<string>',
'desiredTime' => 45,
'includeAiUsageScoring' => true,
'expirationDays' => 183
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-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.ropes.ai/api/public/problems/{problemId}"
payload := strings.NewReader("{\n \"problemTitle\": \"<string>\",\n \"desiredTime\": 45,\n \"includeAiUsageScoring\": true,\n \"expirationDays\": 183\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("x-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.patch("https://api.ropes.ai/api/public/problems/{problemId}")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"problemTitle\": \"<string>\",\n \"desiredTime\": 45,\n \"includeAiUsageScoring\": true,\n \"expirationDays\": 183\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ropes.ai/api/public/problems/{problemId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"problemTitle\": \"<string>\",\n \"desiredTime\": 45,\n \"includeAiUsageScoring\": true,\n \"expirationDays\": 183\n}"
response = http.request(request)
puts response.read_body{
"problem": {
"id": "<string>",
"name": "<string>",
"status": "Ready",
"type": "technical-assessment",
"duration": 123,
"candidateSummary": "<string>",
"problemSummary": "<string>",
"scoringCategories": [
{
"title": "<string>",
"weight": 123,
"rubric": "<string>"
}
],
"externalResourceMode": "CLOSED",
"integrationSource": "<string>",
"externalId": "<string>",
"testMode": true,
"isFromRopesTestBank": true
}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
Path Parameters
The unique identifier of the problem
Body
New problem title.
1 - 255New assessment duration in minutes. Must be between 30 and 60. Assessments already issued keep the duration they were created with.
30 <= x <= 60New external-resource policy. Only CLOSED and AI_ASSISTED can be set here, and switching modes rewrites the problem's scoring rubric for the target mode. Problems currently in OPEN mode cannot be converted through the API.
CLOSED, OPEN, AI_ASSISTED Adds an AI-usage scoring category when converting to AI_ASSISTED. Only valid alongside externalResourceMode "AI_ASSISTED".
Days an issued assessment link stays valid. Send null to clear the problem override and fall back to the organization's default.
1 <= x <= 365Response
Successfully updated the problem
Detailed problem information
Show child attributes
Show child attributes