Customers
Students and customers · 7 operations
List customers of a student
/api/student/customerCustomers (parents or other payers) linked to a student; pass studentId.
list_student_customers
Query parameters · 1
studentId—Response · 200
application/json
curl "https://your-school.rist.pro/api/student/customer?studentId=1" \
-H "Authorization: Bearer $RIST_API_KEY"const response = await fetch("https://your-school.rist.pro/api/student/customer?studentId=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/customer",
headers={"Authorization": f"Bearer {os.environ['RIST_API_KEY']}"},
params={
"studentId": 1
},
)
response.raise_for_status()
data = response.json()["data"]{
"statusCode": 200,
"message": "Operation completed successfully",
"data": …
}List customers
/api/customerCustomers (parents and other payers) with search and filters. Paginated.
list_customers
Query parameters · 16
pagemin 1 · default 1pageSize1–250 · default 20sortByOne of: name manager emails phones messengers linkssortOrderOne of: ASC DESCcustomerId—search—firstName—lastName—Show 8 more
middleName—genderOne of: MALE FEMALEnote—managerIds—relationsToStudentOne of: MOTHER FATHER GRANDMOTHER GRANDFATHERtypesOfMessengerMessenger channels the customer has a connected chat in; several values are OR-ed.One of: TELEGRAM_BOT INSTAGRAM FACEBOOK IMESSAGEisArchivaldefault falsecf—Response · 200
application/json
statusCodeexample 200message—data4 fields
total—totalPages—currentPage—customers16 fields
customerId—firstName—lastName—middleName—contacts3 fields
type—value—label—dateOfBirthformat YYYY-MM-DDTHH:mm:ssgenderOne of: MALE FEMALErelationToStudentOne of: MOTHER FATHER GRANDMOTHER GRANDFATHERnote—manager4 fields
id—firstName—lastName—isArchival—avatarUrl—isArchival—updatedAtformat YYYY-MM-DDTHH:mm:sscreatedAtformat YYYY-MM-DDTHH:mm:sschatsConnected chats, shown as channel icons in the table row.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.customFieldsCustom field values for the columns chosen in the table preset.any keyscurl "https://your-school.rist.pro/api/customer" \
-H "Authorization: Bearer $RIST_API_KEY"const response = await fetch("https://your-school.rist.pro/api/customer", {
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/customer",
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,
"customers": [
{
"customerId": 1,
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "string",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"gender": "MALE",
"relationToStudent": "MOTHER",
"note": "string",
"manager": {
"id": 1,
"firstName": "string",
"lastName": "string",
"isArchival": false
},
"avatarUrl": "string",
"isArchival": false,
"updatedAt": "2026-11-09T14:30:00",
"createdAt": "2026-11-09T14:30:00",
"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": {}
}
}
}
],
"customFields": {}
}
]
}
}Get customer card
/api/customer/{id}Full customer card: contacts, linked students, custom fields.
get_customer
Path parameters · 1
id—Response · 200
application/json
statusCodeexample 200message—data17 fields
customerId—firstName—lastName—middleName—contacts3 fields
type—value—label—dateOfBirthformat YYYY-MM-DDTHH:mm:ssgenderOne of: MALE FEMALErelationToStudentOne of: MOTHER FATHER GRANDMOTHER GRANDFATHERnote—avatarUrl—isArchival—updatedAtformat YYYY-MM-DDTHH:mm:sscreatedAtformat YYYY-MM-DDTHH:mm:ssuser5 fields
id—firstName—lastName—email—isArchival—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.customFieldsany keyscurl "https://your-school.rist.pro/api/customer/1" \
-H "Authorization: Bearer $RIST_API_KEY"const response = await fetch("https://your-school.rist.pro/api/customer/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/customer/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": {
"customerId": 1,
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "string",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"gender": "MALE",
"relationToStudent": "MOTHER",
"note": "string",
"avatarUrl": "string",
"isArchival": false,
"updatedAt": "2026-11-09T14:30:00",
"createdAt": "2026-11-09T14:30:00",
"user": {
"id": 1,
"firstName": "string",
"lastName": "string",
"email": "string",
"isArchival": false
},
"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": {}
}
}
}
],
"customFields": {}
}
}List students of a customer
/api/customer/{id}/studentsStudents linked to one customer.
list_customer_students
Path parameters · 1
id—Response · 200
application/json
curl "https://your-school.rist.pro/api/customer/1/students" \
-H "Authorization: Bearer $RIST_API_KEY"const response = await fetch("https://your-school.rist.pro/api/customer/1/students", {
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/customer/1/students",
headers={"Authorization": f"Bearer {os.environ['RIST_API_KEY']}"},
)
response.raise_for_status()
data = response.json()["data"]{
"statusCode": 200,
"message": "Operation completed successfully",
"data": …
}Link customer to student
/api/student/customerLink an existing customer to a student (studentId, customerId, optional note).
link_student_customer
Request body
application/json · object
customerIdmin 1studentIdmin 1notelength max 1500Response · 201
application/json
curl -X POST "https://your-school.rist.pro/api/student/customer" \
-H "Authorization: Bearer $RIST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"customerId": 1,
"studentId": 1,
"note": "string"
}'const response = await fetch("https://your-school.rist.pro/api/student/customer", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RIST_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"customerId": 1,
"studentId": 1,
"note": "string"
}),
});
const { data } = await response.json();import os
import requests
response = requests.post(
"https://your-school.rist.pro/api/student/customer",
headers={"Authorization": f"Bearer {os.environ['RIST_API_KEY']}"},
json={
"customerId": 1,
"studentId": 1,
"note": "string"
},
)
response.raise_for_status()
data = response.json()["data"]{
"statusCode": 201,
"message": "Operation completed successfully",
"data": {}
}Create customer
/api/customerCreate a customer card, optionally linked to students (studentIds). Look the customer up with search first to avoid duplicates.
create_customer
Request body
application/json · object
firstNamelength 1–30lastNamelength max 30middleNamelength max 30contacts3 fields
typeOne of: PHONE EMAIL MESSENGER URLvaluelength 1–255labellength max 50dateOfBirthformat YYYY-MM-DDTHH:mm:ssgenderOne of: MALE FEMALErelationToStudentOne of: MOTHER FATHER GRANDMOTHER GRANDFATHERnotelength max 1500managerIdmin 1studentIds—customFieldsany keysResponse · 201
application/json
statusCodeexample 201message—data16 fields
customerId—firstName—lastName—middleName—contacts3 fields
type—value—label—dateOfBirthformat YYYY-MM-DDTHH:mm:ssgenderOne of: MALE FEMALErelationToStudentOne of: MOTHER FATHER GRANDMOTHER GRANDFATHERnote—manager4 fields
id—firstName—lastName—isArchival—avatarUrl—isArchival—updatedAtformat YYYY-MM-DDTHH:mm:sscreatedAtformat YYYY-MM-DDTHH:mm:sschatsConnected chats, shown as channel icons in the table row.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.customFieldsCustom field values for the columns chosen in the table preset.any keyscurl -X POST "https://your-school.rist.pro/api/customer" \
-H "Authorization: Bearer $RIST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "PHONE",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"gender": "MALE",
"relationToStudent": "MOTHER",
"note": "string",
"managerId": 1,
"studentIds": [
1
],
"customFields": {}
}'const response = await fetch("https://your-school.rist.pro/api/customer", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RIST_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "PHONE",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"gender": "MALE",
"relationToStudent": "MOTHER",
"note": "string",
"managerId": 1,
"studentIds": [
1
],
"customFields": {}
}),
});
const { data } = await response.json();import os
import requests
response = requests.post(
"https://your-school.rist.pro/api/customer",
headers={"Authorization": f"Bearer {os.environ['RIST_API_KEY']}"},
json={
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "PHONE",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"gender": "MALE",
"relationToStudent": "MOTHER",
"note": "string",
"managerId": 1,
"studentIds": [
1
],
"customFields": {}
},
)
response.raise_for_status()
data = response.json()["data"]{
"statusCode": 201,
"message": "Operation completed successfully",
"data": {
"customerId": 1,
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "string",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"gender": "MALE",
"relationToStudent": "MOTHER",
"note": "string",
"manager": {
"id": 1,
"firstName": "string",
"lastName": "string",
"isArchival": false
},
"avatarUrl": "string",
"isArchival": false,
"updatedAt": "2026-11-09T14:30:00",
"createdAt": "2026-11-09T14:30:00",
"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": {}
}
}
}
],
"customFields": {}
}
}Update customer
/api/customer/{id}Change fields of a customer card. Send only the fields to change: contacts, when sent, replace the whole contact list.
update_customer
Path parameters · 1
id—Request body
application/json · object
firstNamelength 1–30lastNamelength max 30middleNamelength max 30contacts3 fields
typeOne of: PHONE EMAIL MESSENGER URLvaluelength 1–255labellength max 50dateOfBirthformat YYYY-MM-DDTHH:mm:ssgenderOne of: MALE FEMALErelationToStudentOne of: MOTHER FATHER GRANDMOTHER GRANDFATHERnotelength max 1500managerIdmin 1studentIds—customFieldsany keysResponse · 200
application/json
statusCodeexample 200message—data16 fields
customerId—firstName—lastName—middleName—contacts3 fields
type—value—label—dateOfBirthformat YYYY-MM-DDTHH:mm:ssgenderOne of: MALE FEMALErelationToStudentOne of: MOTHER FATHER GRANDMOTHER GRANDFATHERnote—manager4 fields
id—firstName—lastName—isArchival—avatarUrl—isArchival—updatedAtformat YYYY-MM-DDTHH:mm:sscreatedAtformat YYYY-MM-DDTHH:mm:sschatsConnected chats, shown as channel icons in the table row.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.customFieldsCustom field values for the columns chosen in the table preset.any keyscurl -X PATCH "https://your-school.rist.pro/api/customer/1" \
-H "Authorization: Bearer $RIST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "PHONE",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"gender": "MALE",
"relationToStudent": "MOTHER",
"note": "string",
"managerId": 1,
"studentIds": [
1
],
"customFields": {}
}'const response = await fetch("https://your-school.rist.pro/api/customer/1", {
method: "PATCH",
headers: {
Authorization: `Bearer ${process.env.RIST_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "PHONE",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"gender": "MALE",
"relationToStudent": "MOTHER",
"note": "string",
"managerId": 1,
"studentIds": [
1
],
"customFields": {}
}),
});
const { data } = await response.json();import os
import requests
response = requests.patch(
"https://your-school.rist.pro/api/customer/1",
headers={"Authorization": f"Bearer {os.environ['RIST_API_KEY']}"},
json={
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "PHONE",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"gender": "MALE",
"relationToStudent": "MOTHER",
"note": "string",
"managerId": 1,
"studentIds": [
1
],
"customFields": {}
},
)
response.raise_for_status()
data = response.json()["data"]{
"statusCode": 200,
"message": "Operation completed successfully",
"data": {
"customerId": 1,
"firstName": "string",
"lastName": "string",
"middleName": "string",
"contacts": [
{
"type": "string",
"value": "string",
"label": "string"
}
],
"dateOfBirth": "2026-11-09T14:30:00",
"gender": "MALE",
"relationToStudent": "MOTHER",
"note": "string",
"manager": {
"id": 1,
"firstName": "string",
"lastName": "string",
"isArchival": false
},
"avatarUrl": "string",
"isArchival": false,
"updatedAt": "2026-11-09T14:30:00",
"createdAt": "2026-11-09T14:30:00",
"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": {}
}
}
}
],
"customFields": {}
}
}