curl --request PUT \
--url https://pria.praxislxp.com/api/admin/institution/{id} \
--header 'Content-Type: application/json' \
--header 'x-access-token: <api-key>' \
--data '
{
"conversationModel": "<string>",
"conversationFallbackModel": "<string>",
"presentationShareAudiences": [],
"presentationFilePicturesPublic": false,
"roleModels": {},
"roleEfforts": {},
"tierModels": {},
"tierEfforts": {},
"ltiContextIds": [
"<string>"
]
}
'import requests
url = "https://pria.praxislxp.com/api/admin/institution/{id}"
payload = {
"conversationModel": "<string>",
"conversationFallbackModel": "<string>",
"presentationShareAudiences": [],
"presentationFilePicturesPublic": False,
"roleModels": {},
"roleEfforts": {},
"tierModels": {},
"tierEfforts": {},
"ltiContextIds": ["<string>"]
}
headers = {
"x-access-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'x-access-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
conversationModel: '<string>',
conversationFallbackModel: '<string>',
presentationShareAudiences: [],
presentationFilePicturesPublic: false,
roleModels: {},
roleEfforts: {},
tierModels: {},
tierEfforts: {},
ltiContextIds: ['<string>']
})
};
fetch('https://pria.praxislxp.com/api/admin/institution/{id}', 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://pria.praxislxp.com/api/admin/institution/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'conversationModel' => '<string>',
'conversationFallbackModel' => '<string>',
'presentationShareAudiences' => [
],
'presentationFilePicturesPublic' => false,
'roleModels' => [
],
'roleEfforts' => [
],
'tierModels' => [
],
'tierEfforts' => [
],
'ltiContextIds' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-access-token: <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://pria.praxislxp.com/api/admin/institution/{id}"
payload := strings.NewReader("{\n \"conversationModel\": \"<string>\",\n \"conversationFallbackModel\": \"<string>\",\n \"presentationShareAudiences\": [],\n \"presentationFilePicturesPublic\": false,\n \"roleModels\": {},\n \"roleEfforts\": {},\n \"tierModels\": {},\n \"tierEfforts\": {},\n \"ltiContextIds\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("x-access-token", "<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.put("https://pria.praxislxp.com/api/admin/institution/{id}")
.header("x-access-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"conversationModel\": \"<string>\",\n \"conversationFallbackModel\": \"<string>\",\n \"presentationShareAudiences\": [],\n \"presentationFilePicturesPublic\": false,\n \"roleModels\": {},\n \"roleEfforts\": {},\n \"tierModels\": {},\n \"tierEfforts\": {},\n \"ltiContextIds\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pria.praxislxp.com/api/admin/institution/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["x-access-token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"conversationModel\": \"<string>\",\n \"conversationFallbackModel\": \"<string>\",\n \"presentationShareAudiences\": [],\n \"presentationFilePicturesPublic\": false,\n \"roleModels\": {},\n \"roleEfforts\": {},\n \"tierModels\": {},\n \"tierEfforts\": {},\n \"ltiContextIds\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "User institution deleted successfully"
}Update an institution
Updates a Digital Twin’s settings. The caller needs the institutions.edit entitlement on that twin; a field the caller is not allowed to change is dropped. Only the keys sent are written. Model fields are validated against the model catalog before anything is written. Under cloudServices only the switches of each provider are written, leaf by leaf (a provider’s connection is managed by its own connect and disconnect routes). A switch the caller is not allowed to change is ignored, and the rest of the request is saved. presentationPlainLanguageServer (the server-wide level of video requests in chat that the twin read returns, ‘off’ | ‘ask’ | ‘on’) is read-only and ignored here.
curl --request PUT \
--url https://pria.praxislxp.com/api/admin/institution/{id} \
--header 'Content-Type: application/json' \
--header 'x-access-token: <api-key>' \
--data '
{
"conversationModel": "<string>",
"conversationFallbackModel": "<string>",
"presentationShareAudiences": [],
"presentationFilePicturesPublic": false,
"roleModels": {},
"roleEfforts": {},
"tierModels": {},
"tierEfforts": {},
"ltiContextIds": [
"<string>"
]
}
'import requests
url = "https://pria.praxislxp.com/api/admin/institution/{id}"
payload = {
"conversationModel": "<string>",
"conversationFallbackModel": "<string>",
"presentationShareAudiences": [],
"presentationFilePicturesPublic": False,
"roleModels": {},
"roleEfforts": {},
"tierModels": {},
"tierEfforts": {},
"ltiContextIds": ["<string>"]
}
headers = {
"x-access-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'x-access-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
conversationModel: '<string>',
conversationFallbackModel: '<string>',
presentationShareAudiences: [],
presentationFilePicturesPublic: false,
roleModels: {},
roleEfforts: {},
tierModels: {},
tierEfforts: {},
ltiContextIds: ['<string>']
})
};
fetch('https://pria.praxislxp.com/api/admin/institution/{id}', 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://pria.praxislxp.com/api/admin/institution/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'conversationModel' => '<string>',
'conversationFallbackModel' => '<string>',
'presentationShareAudiences' => [
],
'presentationFilePicturesPublic' => false,
'roleModels' => [
],
'roleEfforts' => [
],
'tierModels' => [
],
'tierEfforts' => [
],
'ltiContextIds' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-access-token: <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://pria.praxislxp.com/api/admin/institution/{id}"
payload := strings.NewReader("{\n \"conversationModel\": \"<string>\",\n \"conversationFallbackModel\": \"<string>\",\n \"presentationShareAudiences\": [],\n \"presentationFilePicturesPublic\": false,\n \"roleModels\": {},\n \"roleEfforts\": {},\n \"tierModels\": {},\n \"tierEfforts\": {},\n \"ltiContextIds\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("x-access-token", "<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.put("https://pria.praxislxp.com/api/admin/institution/{id}")
.header("x-access-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"conversationModel\": \"<string>\",\n \"conversationFallbackModel\": \"<string>\",\n \"presentationShareAudiences\": [],\n \"presentationFilePicturesPublic\": false,\n \"roleModels\": {},\n \"roleEfforts\": {},\n \"tierModels\": {},\n \"tierEfforts\": {},\n \"ltiContextIds\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pria.praxislxp.com/api/admin/institution/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["x-access-token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"conversationModel\": \"<string>\",\n \"conversationFallbackModel\": \"<string>\",\n \"presentationShareAudiences\": [],\n \"presentationFilePicturesPublic\": false,\n \"roleModels\": {},\n \"roleEfforts\": {},\n \"tierModels\": {},\n \"tierEfforts\": {},\n \"ltiContextIds\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "User institution deleted successfully"
}Authorizations
JWT token passed in x-access-token header
Path Parameters
Institution ID
Body
Any combination of institution fields; only the keys sent are written.
Conversation model for the twin ('' = the platform default).
Fallback conversation model — answers when the conversation model fails before any reply started. '' inherits the platform default (System Models → Conversation Fallback, unset until an operator picks one); otherwise a catalog conversation model or a custom:<aimodelId> reference to one of this twin's active custom conversation models. Any other value is rejected with 400.
Presentation videos — the audiences a share link may have (default [public, twin]; twin admins). An unknown or repeated value is rejected with 400.
public, twin Presentation videos — the twin's default look for new videos (twin admins, not super-only). null or absent = no default. Any other value is rejected with 400.
dark-tech, editorial, bold, minimal, warm-human, null Presentation videos — vault file pictures may show on PUBLIC share links and in public-footer exports (twin admins, not super-only; default false = twin-audience links only). A non-boolean is rejected with 400; a change is audited.
Twin-wide role-model pins (All modes): role slot → model id. Slots: conductorModel, plannerModel, designerModel, coderModel, testerModel, writerModel, researcherModel, agenticLoopModel, preflightModel, specWriterModel, planReviewerModel, judgeModel, vision (legacy visionModel). The coder level slots are refused here (use tierModels). '' or null clears a pin; an unknown slot, a non-slug value or a model the catalog does not allow for that role is refused with 400.
Show child attributes
Show child attributes
Twin-wide reasoning effort per role slot (All modes); same slots as roleModels. Empty clears a slot.
Show child attributes
Show child attributes
Per-mode model pins (Map mode → role slot → model id), authorized like roleModels (institutions.edit). Modes: basic, advanced, expert, mythical (auto has no pool). Slots: the roleModels slots plus the coder level slots coderUpgradeModel (harder tasks) and coderVisualModel (games and simulations), which are accepted ONLY here, never in roleModels. A mode pin outranks the twin-wide roleModels pin and the platform per-mode pick; '' or null clears one pin, a null mode clears that mode. A coder level pin is used when the run's coder dispatch picks that level; with a twin-wide or mode coder pin and no level pins, the automatic level choice stays off. Values must be model-id slugs the catalog allows for that role (400 otherwise).
Show child attributes
Show child attributes
Per-mode reasoning effort (Map mode → role slot → effort), same vocabulary, authorization and whole-map semantics as roleEfforts. Modes: basic, advanced, expert, mythical. Slots: the roleEfforts slots except conductorModel (the conductor has no per-mode effort), plus coderUpgradeModel and coderVisualModel (the effort for a coder dispatch that ran that level). Order on a run: this mode cell, then roleEfforts, then the platform effort, else the model's own default. Empty clears a cell.
Show child attributes
Show child attributes
Canvas course ids connected to this twin. Only NEW ids (not already held by this twin) are claim-checked: one already held by a usable Digital Twin is refused (400, naming it) before anything is written — one twin per course; after the write, each new id is moved off any disabled/deleted holders that still listed it.
Was this page helpful?