curl --request POST \
--url https://pria.praxislxp.com/api/user/institution \
--header 'Content-Type: application/json' \
--header 'x-access-token: <api-key>' \
--data '
{
"name": "29312345.jane.school.edu",
"ainame": "Ada",
"picture": "<string>",
"picture_bg": "<string>",
"picture_dark_bg": "<string>",
"prompt": "<string>",
"allowJoining": "disabled",
"poolCredits": true,
"questionType": "PERSONA",
"rtEnabled": true,
"rtAdminOnly": true,
"personalisationAsked": true,
"account": "<string>",
"domain": "school.edu"
}
'import requests
url = "https://pria.praxislxp.com/api/user/institution"
payload = {
"name": "29312345.jane.school.edu",
"ainame": "Ada",
"picture": "<string>",
"picture_bg": "<string>",
"picture_dark_bg": "<string>",
"prompt": "<string>",
"allowJoining": "disabled",
"poolCredits": True,
"questionType": "PERSONA",
"rtEnabled": True,
"rtAdminOnly": True,
"personalisationAsked": True,
"account": "<string>",
"domain": "school.edu"
}
headers = {
"x-access-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-access-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '29312345.jane.school.edu',
ainame: 'Ada',
picture: '<string>',
picture_bg: '<string>',
picture_dark_bg: '<string>',
prompt: '<string>',
allowJoining: 'disabled',
poolCredits: true,
questionType: 'PERSONA',
rtEnabled: true,
rtAdminOnly: true,
personalisationAsked: true,
account: '<string>',
domain: 'school.edu'
})
};
fetch('https://pria.praxislxp.com/api/user/institution', 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/user/institution",
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([
'name' => '29312345.jane.school.edu',
'ainame' => 'Ada',
'picture' => '<string>',
'picture_bg' => '<string>',
'picture_dark_bg' => '<string>',
'prompt' => '<string>',
'allowJoining' => 'disabled',
'poolCredits' => true,
'questionType' => 'PERSONA',
'rtEnabled' => true,
'rtAdminOnly' => true,
'personalisationAsked' => true,
'account' => '<string>',
'domain' => 'school.edu'
]),
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/user/institution"
payload := strings.NewReader("{\n \"name\": \"29312345.jane.school.edu\",\n \"ainame\": \"Ada\",\n \"picture\": \"<string>\",\n \"picture_bg\": \"<string>\",\n \"picture_dark_bg\": \"<string>\",\n \"prompt\": \"<string>\",\n \"allowJoining\": \"disabled\",\n \"poolCredits\": true,\n \"questionType\": \"PERSONA\",\n \"rtEnabled\": true,\n \"rtAdminOnly\": true,\n \"personalisationAsked\": true,\n \"account\": \"<string>\",\n \"domain\": \"school.edu\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://pria.praxislxp.com/api/user/institution")
.header("x-access-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"29312345.jane.school.edu\",\n \"ainame\": \"Ada\",\n \"picture\": \"<string>\",\n \"picture_bg\": \"<string>\",\n \"picture_dark_bg\": \"<string>\",\n \"prompt\": \"<string>\",\n \"allowJoining\": \"disabled\",\n \"poolCredits\": true,\n \"questionType\": \"PERSONA\",\n \"rtEnabled\": true,\n \"rtAdminOnly\": true,\n \"personalisationAsked\": true,\n \"account\": \"<string>\",\n \"domain\": \"school.edu\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pria.praxislxp.com/api/user/institution")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-access-token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"29312345.jane.school.edu\",\n \"ainame\": \"Ada\",\n \"picture\": \"<string>\",\n \"picture_bg\": \"<string>\",\n \"picture_dark_bg\": \"<string>\",\n \"prompt\": \"<string>\",\n \"allowJoining\": \"disabled\",\n \"poolCredits\": true,\n \"questionType\": \"PERSONA\",\n \"rtEnabled\": true,\n \"rtAdminOnly\": true,\n \"personalisationAsked\": true,\n \"account\": \"<string>\",\n \"domain\": \"school.edu\"\n}"
response = http.request(request)
puts response.read_body{
"_id": "68793ef2a8a4a5eaff36e7ca",
"name": "teacher1.domain.edu.instructure",
"picture": "https://hiimpria.ai/uploads/6430736fd62d650040420674/Clarkey20Headshot20Animated_1752713782148.gif",
"picture_bg": "",
"picture_dark_bg": "",
"picture_animated": "https://hiimpria.ai/uploads/6430736fd62d650040420674/Clarkey20Headshot20Animated_1752713782148.gif",
"elevenlabs_agent_id": "agent_xxxxxxxxxxxxxxxxxxxx",
"credits": 50,
"status": "active",
"allowJoining": "disabled",
"joiningAdminOnly": false,
"publicId": "2e1006ec-5b59-4431-96d2-b0e1b1022a3a",
"publicAuthorizedUrls": [
"https://domain.edu"
],
"ainame": "Hugo",
"prompt": "",
"contactEmail": "jane.doe@praxis-ai.com",
"creditAward": 0,
"poolCredits": true,
"questionType": "CORPORATE",
"rtEnabled": false,
"rtAdminOnly": true,
"created": "2025-07-17T18:20:34.330Z",
"id": "68793ef2a8a4a5eaff36e7ca"
}Create a Digital Twin
Creates a Digital Twin with the signed-in user as its contact and administrator: the user gets an admin membership with the admin entitlements on it, it becomes their current Digital Twin, and their user account becomes an administrator account. The Digital Twin joins a customer account only when the user manages that account: the one named in account; without account, the one whose registered domain is exactly domain; then the account of the user’s current Digital Twin; otherwise no account. The listed managers of that account get an admin membership too. It starts with 50 credits and in persona mode. Fields not listed below are ignored. Only from the user’s own session. At most 5 creations per user every 10 minutes (429 beyond). When the upgrade to create Digital Twins is offered (see /api/user/twin-upgrade), only an account that can create Digital Twins may call it, and an account that upgraded itself creates at most 3 Digital Twins.
curl --request POST \
--url https://pria.praxislxp.com/api/user/institution \
--header 'Content-Type: application/json' \
--header 'x-access-token: <api-key>' \
--data '
{
"name": "29312345.jane.school.edu",
"ainame": "Ada",
"picture": "<string>",
"picture_bg": "<string>",
"picture_dark_bg": "<string>",
"prompt": "<string>",
"allowJoining": "disabled",
"poolCredits": true,
"questionType": "PERSONA",
"rtEnabled": true,
"rtAdminOnly": true,
"personalisationAsked": true,
"account": "<string>",
"domain": "school.edu"
}
'import requests
url = "https://pria.praxislxp.com/api/user/institution"
payload = {
"name": "29312345.jane.school.edu",
"ainame": "Ada",
"picture": "<string>",
"picture_bg": "<string>",
"picture_dark_bg": "<string>",
"prompt": "<string>",
"allowJoining": "disabled",
"poolCredits": True,
"questionType": "PERSONA",
"rtEnabled": True,
"rtAdminOnly": True,
"personalisationAsked": True,
"account": "<string>",
"domain": "school.edu"
}
headers = {
"x-access-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-access-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '29312345.jane.school.edu',
ainame: 'Ada',
picture: '<string>',
picture_bg: '<string>',
picture_dark_bg: '<string>',
prompt: '<string>',
allowJoining: 'disabled',
poolCredits: true,
questionType: 'PERSONA',
rtEnabled: true,
rtAdminOnly: true,
personalisationAsked: true,
account: '<string>',
domain: 'school.edu'
})
};
fetch('https://pria.praxislxp.com/api/user/institution', 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/user/institution",
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([
'name' => '29312345.jane.school.edu',
'ainame' => 'Ada',
'picture' => '<string>',
'picture_bg' => '<string>',
'picture_dark_bg' => '<string>',
'prompt' => '<string>',
'allowJoining' => 'disabled',
'poolCredits' => true,
'questionType' => 'PERSONA',
'rtEnabled' => true,
'rtAdminOnly' => true,
'personalisationAsked' => true,
'account' => '<string>',
'domain' => 'school.edu'
]),
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/user/institution"
payload := strings.NewReader("{\n \"name\": \"29312345.jane.school.edu\",\n \"ainame\": \"Ada\",\n \"picture\": \"<string>\",\n \"picture_bg\": \"<string>\",\n \"picture_dark_bg\": \"<string>\",\n \"prompt\": \"<string>\",\n \"allowJoining\": \"disabled\",\n \"poolCredits\": true,\n \"questionType\": \"PERSONA\",\n \"rtEnabled\": true,\n \"rtAdminOnly\": true,\n \"personalisationAsked\": true,\n \"account\": \"<string>\",\n \"domain\": \"school.edu\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://pria.praxislxp.com/api/user/institution")
.header("x-access-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"29312345.jane.school.edu\",\n \"ainame\": \"Ada\",\n \"picture\": \"<string>\",\n \"picture_bg\": \"<string>\",\n \"picture_dark_bg\": \"<string>\",\n \"prompt\": \"<string>\",\n \"allowJoining\": \"disabled\",\n \"poolCredits\": true,\n \"questionType\": \"PERSONA\",\n \"rtEnabled\": true,\n \"rtAdminOnly\": true,\n \"personalisationAsked\": true,\n \"account\": \"<string>\",\n \"domain\": \"school.edu\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pria.praxislxp.com/api/user/institution")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-access-token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"29312345.jane.school.edu\",\n \"ainame\": \"Ada\",\n \"picture\": \"<string>\",\n \"picture_bg\": \"<string>\",\n \"picture_dark_bg\": \"<string>\",\n \"prompt\": \"<string>\",\n \"allowJoining\": \"disabled\",\n \"poolCredits\": true,\n \"questionType\": \"PERSONA\",\n \"rtEnabled\": true,\n \"rtAdminOnly\": true,\n \"personalisationAsked\": true,\n \"account\": \"<string>\",\n \"domain\": \"school.edu\"\n}"
response = http.request(request)
puts response.read_body{
"_id": "68793ef2a8a4a5eaff36e7ca",
"name": "teacher1.domain.edu.instructure",
"picture": "https://hiimpria.ai/uploads/6430736fd62d650040420674/Clarkey20Headshot20Animated_1752713782148.gif",
"picture_bg": "",
"picture_dark_bg": "",
"picture_animated": "https://hiimpria.ai/uploads/6430736fd62d650040420674/Clarkey20Headshot20Animated_1752713782148.gif",
"elevenlabs_agent_id": "agent_xxxxxxxxxxxxxxxxxxxx",
"credits": 50,
"status": "active",
"allowJoining": "disabled",
"joiningAdminOnly": false,
"publicId": "2e1006ec-5b59-4431-96d2-b0e1b1022a3a",
"publicAuthorizedUrls": [
"https://domain.edu"
],
"ainame": "Hugo",
"prompt": "",
"contactEmail": "jane.doe@praxis-ai.com",
"creditAward": 0,
"poolCredits": true,
"questionType": "CORPORATE",
"rtEnabled": false,
"rtAdminOnly": true,
"created": "2025-07-17T18:20:34.330Z",
"id": "68793ef2a8a4a5eaff36e7ca"
}Authorizations
JWT token passed in x-access-token header
Body
The Digital Twin's identifier, unique per minute (409 when taken)
"29312345.jane.school.edu"
The name the Digital Twin answers to
"Ada"
Avatar picture URL
Light-mode background picture URL
Dark-mode background picture URL
'' lets each user choose; dark or light sets it for everyone
, dark, light The Digital Twin's instructions
Who may join the Digital Twin
disabled, account, public "disabled"
Whether users spend the Digital Twin's pooled credits
The personalization question bank
"PERSONA"
Enable real-time voice conversations
Restrict real-time conversations to administrators
Whether the personalization prompt was already answered (default false)
A customer account id, used only when the signed-in user manages that account
A host name; the customer account whose registered domain it is exactly, when the user manages that account
"school.edu"
Response
The Digital Twin created (public fields; its account as _id and name only)
Unique institution identifier
"68793ef2a8a4a5eaff36e7ca"
"teacher1.domain.edu.instructure"
"https://hiimpria.ai/uploads/6430736fd62d650040420674/Clarkey20Headshot20Animated_1752713782148.gif"
""
""
"https://hiimpria.ai/uploads/6430736fd62d650040420674/Clarkey20Headshot20Animated_1752713782148.gif"
ElevenLabs Agent ID for Digital Twin Voice
"agent_xxxxxxxxxxxxxxxxxxxx"
Total credits allocated
50
active, inactive "active"
disabled, account, public "disabled"
false
Public identifier for the institution
"2e1006ec-5b59-4431-96d2-b0e1b1022a3a"
["https://domain.edu"]
"Hugo"
""
"jane.doe@praxis-ai.com"
0
true
Personalization question bank type
"CORPORATE"
Whether real-time voice conversations are enabled
false
Whether real-time conversations are restricted to admins
true
"2025-07-17T18:20:34.330Z"
"68793ef2a8a4a5eaff36e7ca"
Was this page helpful?