Students
Students and customers · 9 operations
/api/studentGETCount students by status, manager or teacher/api/student/breakdownGETStudents most likely to leave/api/student/churn-riskGETGet student card/api/student/{id}GETList groups of a student/api/student/{id}/groupsGETList leads of a student/api/student/{id}/leadsGETGet student churn risk/api/student/{id}/churn-riskPOSTCreate student/api/studentPATCHUpdate student/api/student/{id}List students
/api/studentList students with filters: search, teacher, manager, status, balance range, debtors (isDebtor=true), lessons left (lessonsLeftTo, hasOneLessonLeft, hasNoLessonsLeft), enrolled range (enrolledStart/End: new students), subscription ending in a period (subscriptionEndStart/End: active subscriptions by end date), upcoming lessons in subjects (subjectIds), no lessons in a period (noLessonsStart/End), hasNoCustomer, hasDiscount, archived. Paginated with page/pageSize (max 250); "total" is the full count. Returns only students the current user may see.
list_students
Query parameters · 56
pagemin 1 · default 1pageSize1–250 · default 20sortByOne of: status name teacher manager emails phones messengers linkssortOrderOne of: ASC DESCstatusOfStudentId—statusOfStudentIdsAny of these statuses; broadcast audiences pick several.groupIdsActive membership in any of these groups.customerId—Show 48 more
studentIds—search—firstName—lastName—middleName—isChild—genderOne of: MALE FEMALEteacherId—teacherIds—managerId—managerIds—reasonForRefusalId—reasonForRefusalIds—teachingProgramIds—classOfStudentIds—subscriptionIds—balanceFrom—balanceTo—lessonsLeftFrom—lessonsLeftTo—note—typesOfMessengerChannels where the student has a connected chat; several are OR-ed.One of: TELEGRAM_BOT INSTAGRAM FACEBOOK IMESSAGEhasGroup—hasNoGroup—hasNoLessons—isDebtor—hasNoLessonsLeft—hasOneLessonLeft—hasFreeLessons—hasFreeTrialLessons—hasNoSubscription—hasExpiredSubscription—isDuplicate—isBirthdayToday—isArchivaldefault falseisEnrolleddefault trueenrolledStartEnrolled (became a paying student) from, a school-local calendar day: "new students this month".enrolledEndEnrolled until, inclusive: the end of that school-local day.createdStartCard created from, a school-local calendar day.createdEndCard created until, inclusive: the end of that school-local day.subscriptionEndStartAn active subscription ends from this school-local day: "subscriptions ending this month".subscriptionEndEndAn active subscription ends until this school-local day, inclusive.subjectIdsStudents with upcoming scheduled lessons in these subjects.hasNoCustomerNo paying customer (parent) linked.hasDiscountHas a discount in effect today.noLessonsStartNo lessons, except cancelled ones, from this school-local day; pair with noLessonsEnd.noLessonsEndNo lessons until this school-local day, inclusive.cf—Response · 200
application/json
statusCodeexample 200message—data4 fields
total—totalPages—currentPage—students23 fields
studentId—status3 fields
statusOfStudentId—nameOfStatus—isArchival—teachers—manager4 fields
id—firstName—lastName—isArchival—chats4 fields
chatParticipantId—chatId—createdAtformat YYYY-MM-DDTHH:mm:sschatAlways present at runtime; optional because card selects are built dynamically
and TS cannot prove the nested object exists.5 fields
chatId—contactName—avatar—lastMessageAtformat YYYY-MM-DDTHH:mm:ssmessenger4 fields
messengerId—nameOfMessenger—typeOfMessengerOne of: TELEGRAM_BOT INSTAGRAM FACEBOOK IMESSAGEcapabilitiesWhat the channel supports; null when its adapter is not registered, so the chat is read-only.firstName—lastName—middleName—contacts3 fields
type—value—label—dateOfBirthformat YYYY-MM-DDTHH:mm:sstimeZoneStudent's own IANA time zone; null means the school time zone.isChild—genderOne of: MALE FEMALEnote—archivalNote—avatarUrl—isArchival—updatedAtformat YYYY-MM-DDTHH:mm:sscreatedAtformat YYYY-MM-DDTHH:mm:sssubscriptions5 fields
balance—studentSubscriptionId—typeOfBillOne of: BASE SEPARATE BURNED CASHBACKsubscription1 field
nameOfSubscription—effectivePricePerLessonLesson price after the student's discounts; null for non-per-lesson subscriptions.currentMonthLessons3 fields
planned—conducted—cancelled—nextMonthLessons3 fields
planned—conducted—cancelled—customFieldsCustom field values for the columns selected in the table preset.any keyscurl "https://your-school.rist.pro/api/student" \
-H "Authorization: Bearer $RIST_API_KEY"const response = await fetch("https://your-school.rist.pro/api/student", {
headers: {
Authorization: `Bearer ${process.env.RIST_API_KEY}`,
},
});
const { data } = await response.json();import os
import requests
response = requests.get(
"https://your-school.rist.pro/api/student",
headers={"Authorization": f"Bearer {os.environ['RIST_API_KEY']}"},
)
response.raise_for_status()
data = response.json()["data"]{
"statusCode": 200,
"message": "Operation completed successfully",
"data": {
"total": 0,
"totalPages": 0,
"currentPage": 0,
"students": [
{
"studentId": 1,
"status": {
"statusOfStudentId": 1,
"nameOfStatus": "string",
"isArchival": false
},
"teachers": [
{}
],
"manager": {
"id": 1,
"firstName": "string",
"lastName": "string",
"isArchival": false
},
"chats": [
{
"chatParticipantId": 1,
"chatId": 1,
"createdAt": "2026-11-09T14:30:00",
"chat": {
"chatId": 1,
"contactName": "string",
"avatar": "string",
"lastMessageAt": "2026-11-09T14:30:00",
"messenger": {
"messengerId": 1,
"nameOfMessenger": "string",
"typeOfMessenger": "TELEGRAM_BOT",
"capabilities": {}
}
}
}
],
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "string",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"timeZone": "string",
"isChild": false,
"gender": "MALE",
"note": "string",
"archivalNote": "string",
"avatarUrl": "string",
"isArchival": false,
"updatedAt": "2026-11-09T14:30:00",
"createdAt": "2026-11-09T14:30:00",
"subscriptions": [
{
"balance": 0,
"studentSubscriptionId": 1,
"typeOfBill": "BASE",
"subscription": {
"nameOfSubscription": "string"
},
"effectivePricePerLesson": 0
}
],
"currentMonthLessons": {
"planned": 0,
"conducted": 0,
"cancelled": 0
},
"nextMonthLessons": {
"planned": 0,
"conducted": 0,
"cancelled": 0
},
"customFields": {}
}
]
}
}Count students by status, manager or teacher
/api/student/breakdownHow many students match the GET /api/student filters, per status, manager, class or teacher (groupBy); e.g. subscriptionEndStart/End counts students whose subscription ends in a period. For students per subject use GET /api/lesson/breakdown with countBy=students.
count_students
Query parameters · 53
cf—statusOfStudentId—statusOfStudentIdsAny of these statuses; broadcast audiences pick several.groupIdsActive membership in any of these groups.customerId—studentIds—search—firstName—Show 45 more
lastName—middleName—isChild—genderOne of: MALE FEMALEteacherId—teacherIds—managerId—managerIds—reasonForRefusalId—reasonForRefusalIds—teachingProgramIds—classOfStudentIds—subscriptionIds—balanceFrom—balanceTo—lessonsLeftFrom—lessonsLeftTo—note—typesOfMessengerChannels where the student has a connected chat; several are OR-ed.One of: TELEGRAM_BOT INSTAGRAM FACEBOOK IMESSAGEhasGroup—hasNoGroup—hasNoLessons—isDebtor—hasNoLessonsLeft—hasOneLessonLeft—hasFreeLessons—hasFreeTrialLessons—hasNoSubscription—hasExpiredSubscription—isDuplicate—isBirthdayToday—isArchivaldefault falseisEnrolleddefault trueenrolledStartEnrolled (became a paying student) from, a school-local calendar day: "new students this month".enrolledEndEnrolled until, inclusive: the end of that school-local day.createdStartCard created from, a school-local calendar day.createdEndCard created until, inclusive: the end of that school-local day.subscriptionEndStartAn active subscription ends from this school-local day: "subscriptions ending this month".subscriptionEndEndAn active subscription ends until this school-local day, inclusive.subjectIdsStudents with upcoming scheduled lessons in these subjects.hasNoCustomerNo paying customer (parent) linked.hasDiscountHas a discount in effect today.noLessonsStartNo lessons, except cancelled ones, from this school-local day; pair with noLessonsEnd.noLessonsEndNo lessons until this school-local day, inclusive.groupByWhat to count students by; with teacher a student with two teachers counts in both rows.One of: status manager classOfStudent teacherResponse · 200
application/json
statusCodeexample 200message—data3 fields
omittedRowsRows left out by the limittotalRecords matching the filters; a record counted in several rows (a student with two teachers) counts here once.rows3 fields
idId of the grouped value (teacher id, stage id, weekday 1-7) or its code (lesson status); null means "no value".name—count—curl "https://your-school.rist.pro/api/student/breakdown" \
-H "Authorization: Bearer $RIST_API_KEY"const response = await fetch("https://your-school.rist.pro/api/student/breakdown", {
headers: {
Authorization: `Bearer ${process.env.RIST_API_KEY}`,
},
});
const { data } = await response.json();import os
import requests
response = requests.get(
"https://your-school.rist.pro/api/student/breakdown",
headers={"Authorization": f"Bearer {os.environ['RIST_API_KEY']}"},
)
response.raise_for_status()
data = response.json()["data"]{
"statusCode": 200,
"message": "Operation completed successfully",
"data": {
"omittedRows": 0,
"total": 0,
"rows": [
{
"id": 1,
"name": "string",
"count": 0
}
]
}
}Students most likely to leave
/api/student/churn-riskActive students ranked by churn risk score (0-100, higher is riskier) with its factors: attendance, fewer lessons than before, lessons left, subscription ending, days since the last lesson, no regular schedule, late payment. limit and minScore narrow the list.
list_students_by_churn_risk
Query parameters · 2
limitHow many students to return, riskiest first.1–100 · default 20minScoreLowest risk score to include, 0-100.0–100 · default 0Response · 200
application/json
curl "https://your-school.rist.pro/api/student/churn-risk?limit=20&minScore=0" \
-H "Authorization: Bearer $RIST_API_KEY"const response = await fetch("https://your-school.rist.pro/api/student/churn-risk?limit=20&minScore=0", {
headers: {
Authorization: `Bearer ${process.env.RIST_API_KEY}`,
},
});
const { data } = await response.json();import os
import requests
response = requests.get(
"https://your-school.rist.pro/api/student/churn-risk",
headers={"Authorization": f"Bearer {os.environ['RIST_API_KEY']}"},
params={
"limit": 20,
"minScore": 0
},
)
response.raise_for_status()
data = response.json()["data"]{
"statusCode": 200,
"message": "Operation completed successfully",
"data": [
{}
]
}Get student card
/api/student/{id}Full student card: contacts, teachers, manager, custom fields. Balances are in GET /api/student/subscription.
get_student
Path parameters · 1
id—Response · 200
application/json
statusCodeexample 200message—data19 fields
studentId—firstName—lastName—middleName—contacts3 fields
type—value—label—dateOfBirthformat YYYY-MM-DDTHH:mm:sstimeZoneStudent's own IANA time zone; null means the school time zone.isChild—genderOne of: MALE FEMALEpayerOne of: CUSTOMER STUDENTnote—archivalNote—customFieldsany keysavatarUrl—isArchival—updatedAtformat YYYY-MM-DDTHH:mm:sscreatedAtformat YYYY-MM-DDTHH:mm:ssteachers—chatsConnected chats, used for channel icons.4 fields
chatParticipantId—chatId—createdAtformat YYYY-MM-DDTHH:mm:sschatAlways present at runtime; optional because card selects are built dynamically
and TS cannot prove the nested object exists.5 fields
chatId—contactName—avatar—lastMessageAtformat YYYY-MM-DDTHH:mm:ssmessenger4 fields
messengerId—nameOfMessenger—typeOfMessengerOne of: TELEGRAM_BOT INSTAGRAM FACEBOOK IMESSAGEcapabilitiesWhat the channel supports; null when its adapter is not registered, so the chat is read-only.curl "https://your-school.rist.pro/api/student/1" \
-H "Authorization: Bearer $RIST_API_KEY"const response = await fetch("https://your-school.rist.pro/api/student/1", {
headers: {
Authorization: `Bearer ${process.env.RIST_API_KEY}`,
},
});
const { data } = await response.json();import os
import requests
response = requests.get(
"https://your-school.rist.pro/api/student/1",
headers={"Authorization": f"Bearer {os.environ['RIST_API_KEY']}"},
)
response.raise_for_status()
data = response.json()["data"]{
"statusCode": 200,
"message": "Operation completed successfully",
"data": {
"studentId": 1,
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "string",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"timeZone": "string",
"isChild": false,
"gender": "MALE",
"payer": "CUSTOMER",
"note": "string",
"archivalNote": "string",
"customFields": {},
"avatarUrl": "string",
"isArchival": false,
"updatedAt": "2026-11-09T14:30:00",
"createdAt": "2026-11-09T14:30:00",
"teachers": [
{}
],
"chats": [
{
"chatParticipantId": 1,
"chatId": 1,
"createdAt": "2026-11-09T14:30:00",
"chat": {
"chatId": 1,
"contactName": "string",
"avatar": "string",
"lastMessageAt": "2026-11-09T14:30:00",
"messenger": {
"messengerId": 1,
"nameOfMessenger": "string",
"typeOfMessenger": "TELEGRAM_BOT",
"capabilities": {}
}
}
}
]
}
}List groups of a student
/api/student/{id}/groupsStudy groups the student belongs to.
list_student_groups
Path parameters · 1
id—Response · 200
application/json
curl "https://your-school.rist.pro/api/student/1/groups" \
-H "Authorization: Bearer $RIST_API_KEY"const response = await fetch("https://your-school.rist.pro/api/student/1/groups", {
headers: {
Authorization: `Bearer ${process.env.RIST_API_KEY}`,
},
});
const { data } = await response.json();import os
import requests
response = requests.get(
"https://your-school.rist.pro/api/student/1/groups",
headers={"Authorization": f"Bearer {os.environ['RIST_API_KEY']}"},
)
response.raise_for_status()
data = response.json()["data"]{
"statusCode": 200,
"message": "Operation completed successfully",
"data": …
}List leads of a student
/api/student/{id}/leadsSales leads linked to the student, with their pipeline stage.
list_student_leads
Path parameters · 1
id—Response · 200
application/json
curl "https://your-school.rist.pro/api/student/1/leads" \
-H "Authorization: Bearer $RIST_API_KEY"const response = await fetch("https://your-school.rist.pro/api/student/1/leads", {
headers: {
Authorization: `Bearer ${process.env.RIST_API_KEY}`,
},
});
const { data } = await response.json();import os
import requests
response = requests.get(
"https://your-school.rist.pro/api/student/1/leads",
headers={"Authorization": f"Bearer {os.environ['RIST_API_KEY']}"},
)
response.raise_for_status()
data = response.json()["data"]{
"statusCode": 200,
"message": "Operation completed successfully",
"data": …
}Get student churn risk
/api/student/{id}/churn-riskChurn risk score of a student with its factors (attendance, days since last lesson, lessons left). Returns null when the role has no access to churn risk or the student is not visible.
get_student_churn_risk
Path parameters · 1
id—Response · 200
application/json
curl "https://your-school.rist.pro/api/student/1/churn-risk" \
-H "Authorization: Bearer $RIST_API_KEY"const response = await fetch("https://your-school.rist.pro/api/student/1/churn-risk", {
headers: {
Authorization: `Bearer ${process.env.RIST_API_KEY}`,
},
});
const { data } = await response.json();import os
import requests
response = requests.get(
"https://your-school.rist.pro/api/student/1/churn-risk",
headers={"Authorization": f"Bearer {os.environ['RIST_API_KEY']}"},
)
response.raise_for_status()
data = response.json()["data"]{
"statusCode": 200,
"message": "Operation completed successfully",
"data": {}
}Create student
/api/studentCreate a new student card. Look the student up with GET /api/student first to avoid duplicates.
create_student
Request body
application/json · object
statusOfStudentIdmin 1classOfStudentIdmin 1teacherIdsmin 1managerIdmin 1customerIdmin 1firstNamelength 1–30lastNamelength max 30middleNamelength max 30contacts3 fields
typeOne of: PHONE EMAIL MESSENGER URLvaluelength 1–255labellength max 50dateOfBirthformat YYYY-MM-DDTHH:mm:sstimeZone—isChild—genderOne of: MALE FEMALEpayerOne of: STUDENT CUSTOMERnotelength max 1500customFieldsany keysResponse · 201
application/json
statusCodeexample 201message—data23 fields
studentId—status3 fields
statusOfStudentId—nameOfStatus—isArchival—teachers—manager4 fields
id—firstName—lastName—isArchival—chats4 fields
chatParticipantId—chatId—createdAtformat YYYY-MM-DDTHH:mm:sschatAlways present at runtime; optional because card selects are built dynamically
and TS cannot prove the nested object exists.5 fields
chatId—contactName—avatar—lastMessageAtformat YYYY-MM-DDTHH:mm:ssmessenger4 fields
messengerId—nameOfMessenger—typeOfMessengerOne of: TELEGRAM_BOT INSTAGRAM FACEBOOK IMESSAGEcapabilitiesWhat the channel supports; null when its adapter is not registered, so the chat is read-only.firstName—lastName—middleName—contacts3 fields
type—value—label—dateOfBirthformat YYYY-MM-DDTHH:mm:sstimeZoneStudent's own IANA time zone; null means the school time zone.isChild—genderOne of: MALE FEMALEnote—archivalNote—avatarUrl—isArchival—updatedAtformat YYYY-MM-DDTHH:mm:sscreatedAtformat YYYY-MM-DDTHH:mm:sssubscriptions5 fields
balance—studentSubscriptionId—typeOfBillOne of: BASE SEPARATE BURNED CASHBACKsubscription1 field
nameOfSubscription—effectivePricePerLessonLesson price after the student's discounts; null for non-per-lesson subscriptions.currentMonthLessons3 fields
planned—conducted—cancelled—nextMonthLessons3 fields
planned—conducted—cancelled—customFieldsCustom field values for the columns selected in the table preset.any keyscurl -X POST "https://your-school.rist.pro/api/student" \
-H "Authorization: Bearer $RIST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"statusOfStudentId": 1,
"classOfStudentId": 1,
"teacherIds": [
1
],
"managerId": 1,
"customerId": 1,
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "PHONE",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"timeZone": "string",
"isChild": false,
"gender": "MALE",
"payer": "STUDENT",
"note": "string",
"customFields": {}
}'const response = await fetch("https://your-school.rist.pro/api/student", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RIST_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"statusOfStudentId": 1,
"classOfStudentId": 1,
"teacherIds": [
1
],
"managerId": 1,
"customerId": 1,
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "PHONE",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"timeZone": "string",
"isChild": false,
"gender": "MALE",
"payer": "STUDENT",
"note": "string",
"customFields": {}
}),
});
const { data } = await response.json();import os
import requests
response = requests.post(
"https://your-school.rist.pro/api/student",
headers={"Authorization": f"Bearer {os.environ['RIST_API_KEY']}"},
json={
"statusOfStudentId": 1,
"classOfStudentId": 1,
"teacherIds": [
1
],
"managerId": 1,
"customerId": 1,
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "PHONE",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"timeZone": "string",
"isChild": False,
"gender": "MALE",
"payer": "STUDENT",
"note": "string",
"customFields": {}
},
)
response.raise_for_status()
data = response.json()["data"]{
"statusCode": 201,
"message": "Operation completed successfully",
"data": {
"studentId": 1,
"status": {
"statusOfStudentId": 1,
"nameOfStatus": "string",
"isArchival": false
},
"teachers": [
{}
],
"manager": {
"id": 1,
"firstName": "string",
"lastName": "string",
"isArchival": false
},
"chats": [
{
"chatParticipantId": 1,
"chatId": 1,
"createdAt": "2026-11-09T14:30:00",
"chat": {
"chatId": 1,
"contactName": "string",
"avatar": "string",
"lastMessageAt": "2026-11-09T14:30:00",
"messenger": {
"messengerId": 1,
"nameOfMessenger": "string",
"typeOfMessenger": "TELEGRAM_BOT",
"capabilities": {}
}
}
}
],
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "string",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"timeZone": "string",
"isChild": false,
"gender": "MALE",
"note": "string",
"archivalNote": "string",
"avatarUrl": "string",
"isArchival": false,
"updatedAt": "2026-11-09T14:30:00",
"createdAt": "2026-11-09T14:30:00",
"subscriptions": [
{
"balance": 0,
"studentSubscriptionId": 1,
"typeOfBill": "BASE",
"subscription": {
"nameOfSubscription": "string"
},
"effectivePricePerLesson": 0
}
],
"currentMonthLessons": {
"planned": 0,
"conducted": 0,
"cancelled": 0
},
"nextMonthLessons": {
"planned": 0,
"conducted": 0,
"cancelled": 0
},
"customFields": {}
}
}Update student
/api/student/{id}Change fields of a student card. Send only the fields to change.
update_student
Path parameters · 1
id—Request body
application/json · object
statusOfStudentIdmin 1classOfStudentIdmin 1teacherIdsmin 1managerIdmin 1firstNamelength 1–30lastNamelength max 30middleNamelength max 30contacts3 fields
typeOne of: PHONE EMAIL MESSENGER URLvaluelength 1–255labellength max 50dateOfBirthformat YYYY-MM-DDTHH:mm:sstimeZone—isChild—genderOne of: MALE FEMALEpayerOne of: STUDENT CUSTOMERnotelength max 1500archivedAtformat YYYY-MM-DDTHH:mm:ssisEnrolled—customFieldsany keysResponse · 200
application/json
statusCodeexample 200message—data23 fields
studentId—status3 fields
statusOfStudentId—nameOfStatus—isArchival—teachers—manager4 fields
id—firstName—lastName—isArchival—chats4 fields
chatParticipantId—chatId—createdAtformat YYYY-MM-DDTHH:mm:sschatAlways present at runtime; optional because card selects are built dynamically
and TS cannot prove the nested object exists.5 fields
chatId—contactName—avatar—lastMessageAtformat YYYY-MM-DDTHH:mm:ssmessenger4 fields
messengerId—nameOfMessenger—typeOfMessengerOne of: TELEGRAM_BOT INSTAGRAM FACEBOOK IMESSAGEcapabilitiesWhat the channel supports; null when its adapter is not registered, so the chat is read-only.firstName—lastName—middleName—contacts3 fields
type—value—label—dateOfBirthformat YYYY-MM-DDTHH:mm:sstimeZoneStudent's own IANA time zone; null means the school time zone.isChild—genderOne of: MALE FEMALEnote—archivalNote—avatarUrl—isArchival—updatedAtformat YYYY-MM-DDTHH:mm:sscreatedAtformat YYYY-MM-DDTHH:mm:sssubscriptions5 fields
balance—studentSubscriptionId—typeOfBillOne of: BASE SEPARATE BURNED CASHBACKsubscription1 field
nameOfSubscription—effectivePricePerLessonLesson price after the student's discounts; null for non-per-lesson subscriptions.currentMonthLessons3 fields
planned—conducted—cancelled—nextMonthLessons3 fields
planned—conducted—cancelled—customFieldsCustom field values for the columns selected in the table preset.any keyscurl -X PATCH "https://your-school.rist.pro/api/student/1" \
-H "Authorization: Bearer $RIST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"statusOfStudentId": 1,
"classOfStudentId": 1,
"teacherIds": [
1
],
"managerId": 1,
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "PHONE",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"timeZone": "string",
"isChild": false,
"gender": "MALE",
"payer": "STUDENT",
"note": "string",
"archivedAt": "2026-11-09T14:30:00",
"isEnrolled": false,
"customFields": {}
}'const response = await fetch("https://your-school.rist.pro/api/student/1", {
method: "PATCH",
headers: {
Authorization: `Bearer ${process.env.RIST_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"statusOfStudentId": 1,
"classOfStudentId": 1,
"teacherIds": [
1
],
"managerId": 1,
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "PHONE",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"timeZone": "string",
"isChild": false,
"gender": "MALE",
"payer": "STUDENT",
"note": "string",
"archivedAt": "2026-11-09T14:30:00",
"isEnrolled": false,
"customFields": {}
}),
});
const { data } = await response.json();import os
import requests
response = requests.patch(
"https://your-school.rist.pro/api/student/1",
headers={"Authorization": f"Bearer {os.environ['RIST_API_KEY']}"},
json={
"statusOfStudentId": 1,
"classOfStudentId": 1,
"teacherIds": [
1
],
"managerId": 1,
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "PHONE",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"timeZone": "string",
"isChild": False,
"gender": "MALE",
"payer": "STUDENT",
"note": "string",
"archivedAt": "2026-11-09T14:30:00",
"isEnrolled": False,
"customFields": {}
},
)
response.raise_for_status()
data = response.json()["data"]{
"statusCode": 200,
"message": "Operation completed successfully",
"data": {
"studentId": 1,
"status": {
"statusOfStudentId": 1,
"nameOfStatus": "string",
"isArchival": false
},
"teachers": [
{}
],
"manager": {
"id": 1,
"firstName": "string",
"lastName": "string",
"isArchival": false
},
"chats": [
{
"chatParticipantId": 1,
"chatId": 1,
"createdAt": "2026-11-09T14:30:00",
"chat": {
"chatId": 1,
"contactName": "string",
"avatar": "string",
"lastMessageAt": "2026-11-09T14:30:00",
"messenger": {
"messengerId": 1,
"nameOfMessenger": "string",
"typeOfMessenger": "TELEGRAM_BOT",
"capabilities": {}
}
}
}
],
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "string",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"timeZone": "string",
"isChild": false,
"gender": "MALE",
"note": "string",
"archivalNote": "string",
"avatarUrl": "string",
"isArchival": false,
"updatedAt": "2026-11-09T14:30:00",
"createdAt": "2026-11-09T14:30:00",
"subscriptions": [
{
"balance": 0,
"studentSubscriptionId": 1,
"typeOfBill": "BASE",
"subscription": {
"nameOfSubscription": "string"
},
"effectivePricePerLesson": 0
}
],
"currentMonthLessons": {
"planned": 0,
"conducted": 0,
"cancelled": 0
},
"nextMonthLessons": {
"planned": 0,
"conducted": 0,
"cancelled": 0
},
"customFields": {}
}
}