טכנוליין — הקול בידיים שלך

מדריך API ניהול שלוחות

מדריך מלא לכל הפעולות של מנוע ניהול השלוחות, הקבצים, ההרשאות והודעות המערכת

סקירה כללית

ה-API של ניהול שלוחות מאפשר ליצור ולנהל ממשק משתמש מלא לעץ השלוחות, הקבצים, ההגדרות, ההרשאות והודעות המערכת — ללא תלות בעמוד PHP ייעודי. כל הנתונים הסטטיים (סוגי שלוחות, הגדרות שדות, מבני טפסים) והנתונים הדינמיים (עץ, קבצים, הגדרות) נגישים דרך ה-API.

המודל המנטלי של המערכת

כדי להבין את כל ה-API, מספיק להכיר 5 מושגים:

מושגמהו
שלוחה (Extension) צומת יחיד בעץ השלוחות. יש לה id, type (מה היא עושה — תפריט, ניתוב, נגן מדיה וכו'), name, extension (הספרה להקשה), belowExtension (מזהה ההורה) ו-settings (JSON של שדות לפי הסוג).
קובץ (File) קובץ שמע ששייך לשלוחה מסוימת. יש לו runningOrder (סדר השמעה) ואפשרות לתיוג.
עץ (Tree) השלוחות בנויות כעץ — כל שלוחה עם הורה יחיד ומספר ילדים. השורש הוא "תפריט ראשי".
Schema (types / fields / forms) ה-API מגיש בעצמו את סכמת ה-UI: מה הסוגים הזמינים, איזה שדות קיימים (label, type, options), ומה הטופס לכל סוג. אין צורך להרדקוד טפסים.
הודעות מערכת הקראות ברירת מחדל של המערכת ("לחצו 1", "קלט לא תקין") שכל שלוחה יכולה לדרוס בטקסט או הקלטה.

כתובת ה-API

https://app.tlivr.com/ivrFilesApi.php
אימות: כל בקשה חייבת להכיל apiKey=YOUR_API_KEY (כפרמטר GET או שדה POST). את המפתח מקבלים משירות הלקוחות.

זרימת עבודה לממשק חדש

1. Bootstrap getUiSchema
2. עץ foldersList
3. טעינת שלוחה folderSettings
4. Dropdowns getOptions2
5. שמירה extensionSet
קידוד הבקשות: ברירת מחדל — GET עם query string או POST עם application/x-www-form-urlencoded. חריגים: saveCustomMessagesBeta מצפה ל-JSON body, uploadFile ו-uploadChunk ל-multipart/form-data. כל תגובה מוחזרת כ-JSON, בד"כ עם "status": "OK" או "status": "ERROR" + note.

חוקי רינדור לטפסים דינמיים

כשמציגים טופס עבור שלוחה: שולפים את forms[type], מיטרים על הפריטים, ולכל פריט מחפשים את הגדרת השדה ב-fields[input]. כל פריט יכול להכיל:

מאפייןהשפעה
size1 = רוחב מלא (2 עמודות ב-grid), 2 = חצי (תא יחיד).
startLine"yes" → שורת grid חדשה.
view_if DSL להצגה מותנית: field:val / field:val1*val2 (OR לאותו שדה) / A&B (AND) / A|B (OR בין שדות).
input_idoverride ל-id — שימושי לרינדור של אותו שדה מספר פעמים (למשל digits1, digits2…).
errorExitאם ה-dropdown (options: GET) ריק — מציגים את המחרוזת הזו במקום הטופס.
htmlרק כשהפריט הוא type:"html" — בלוק HTML חופשי להזרקה.
Dropdowns דינמיים: שדה שה-options שלו שווה למחרוזת "GET" — יש להבעיר את optionsKey ל-getOptions2. ניתן לבקש כמה מפתחות בקריאה אחת: list=a,b,c.

תוכן עניינים

Schema / Bootstrap

כל המטא-דאטה הסטטית של המערכת (סוגי שלוחות, הגדרות שדות, מבני טפסים, רשימות תפוצה והגדרות חשבון) זמינה דרך קבוצת endpoints מסומנים בחדש.

getUiSchema חדש

GET action=getUiSchema

טוען בקריאה אחת את כל הסכמה — מומלץ בטעינה ראשונית של הממשק.

תגובה

{ "status": "OK", "types": { "menu": { "name": "תפריט", "txt": "שלוחת תפריט לניתוב לשלוחות", "icn": "78292" }, "audioPlayer": { "name": "נגן מדיה", "icn": "JzHJv10US60C" }, "simpleRouting": { "name": "ניתוב שיחה קולית", "icn": "53439" } }, "fields": { "dialPhone": { "id": "dialPhone", "type": "number", "name": "מספר טלפון", "tolip": "", "explanation": "יש לרשום מספר טלפון..." }, "voiceMail": { "id": "voiceMail", "type": "select", "options": "no~לא פעיל*yes~פעיל", "name": "תא קולי" } }, "forms": { "simpleRouting": [ { "type": "input", "input": "dialPhone", "startLine": "", "size": 2 }, { "type": "input", "input": "voiceMail", "size": 1 }, { "type": "input", "input": "stt_email", "view_if": "voiceMail:yes", "size": 1 } ] }, "accountSettings": { "use_rh": "yes", "rh_max": 5000, "ivrSystemPhone": "0772222603" }, "mailingLists": [ { "id": "1000", "name": "כללי", "label": "1000-כללי" } ] }

מבנה שדה ב-fields

מאפייןתפקיד
idמזהה לשדה (שם ה-input)
type text / number / select / multySelect / selectTags / email / url / audio / datetime-local
nameכותרת להצגה
tolipטולטיפ מרחף
explanationהסבר תחת השדה
defaultערך ברירת מחדל
options פורמט: val1~txt1*val2~txt2 — או "GET" עם optionsKey לשליפה דינמית
optionsKey מפתח ל-getOptions2

מבנה פריט טופס ב-forms[type]

מאפייןתפקיד
typeinput / html
inputמפתח ל-fields
input_idאופציונלי — override ל-id של ה-input (לשימוש חוזר באותו שדה, למשל digits1…digits9)
titleאופציונלי — override לכותרת
view_if תנאי הצגה: field:val / field:val1*val2.
חיבורים: & (AND), | (OR)
startLine"yes" → שורת grid חדשה
size1 = span על 2 עמודות; 2 = תא יחיד
defaultערך ברירת מחדל לשדה הזה
errorExitהודעה שתוצג במקום הטופס כשאין אפשרויות
html(רק כאשר type=html) — מחרוזת HTML חופשי

getExtensionTypes חדש

GET action=getExtensionTypes

מחזיר רק את types + accountSettings. שימושי לרשימה הראשונה של "בחר סוג שלוחה" בזמן יצירה.

accountSettings.use_rh = "yes" מפעיל את הסוגים runRingHangup, rhAdd, rhRemove.

getFieldsSchema חדש

GET action=getFieldsSchema

מחזיר רק את מערך השדות (colls_array). לאחסון ב-cache בקליינט.

getFormLayout חדש

GET action=getFormLayout&type=<typeKey>

החזרת מבנה הטופס של סוג שלוחה בודד. ללא type — מחזיר את כל הטפסים.

מפתחהסברחובה
type מפתח סוג שלוחה (למשל menu, simpleRouting, audioPlayer) אופציונלי

דוגמה

// GET ivrFilesApi.php?action=getFormLayout&type=simpleRouting { "status": "OK", "type": "simpleRouting", "form": [ { "type": "input", "input": "dialPhone", "size": 2 }, { "type": "input", "input": "voiceMail", "size": 1 } ] }

getAccountSettings חדש

GET action=getAccountSettings
שדההסברערכים
use_rh האם סוגי צינתוק (runRingHangup / rhAdd / rhRemove) פעילים לחשבון yes / no
rh_max מקסימום טלפונים לרשימת צינתוק (0 = ללא הגבלה) מספר שלם
ivrSystemPhone מספר מערכת המרכזיה מחרוזת

getMailingLists חדש

GET action=getMailingLists

מחזיר את רשימות התפוצה של המשתמש כ-JSON נקי (במקום <option> כמו שהיה קודם).

{ "status": "OK", "mailingLists": [ { "id": "1000", "name": "כללי", "label": "1000-כללי" } ] }

getExtensionPath חדש

GET action=getExtensionPath&extensionId=<id>

מחזיר breadcrumb מהשלוחה הראשית עד לשלוחה המבוקשת (כולל עצמה).

{ "status": "OK", "extensionId": "12345", "path": [ { "id": "1", "name": "תפריט ראשי", "extension": "", "type": "menu" }, { "id": "4500", "name": "שירות", "extension": "2", "type": "menu" }, { "id": "12345", "name": "נציג", "extension": "3", "type": "simpleRouting" } ] }

עץ שלוחות

foldersList

GET action=foldersList

מחזיר את כל עץ השלוחות של המשתמש.

מפתחהסברחובה
projectברירת מחדל: MAINאופציונלי

תגובה

{ "1": { "id": "1", "name": "תפריט ראשי", "belowExtension": "", "extension": "", "type": "menu", "children": { "4500": { "id": "4500", "extension": "2", "type": "menu", "children": { ... } } } } }

folderCopy

GET action=folderCopy

העתקה רקורסיבית של שלוחה — כולל תת-שלוחות וקבצים.

מפתחהסברחובה
extensionIdID אחד או מספר IDs מופרדים בפסיקחובה
targetID של שלוחת היעד (ההורה החדש)חובה
המערכת חוסמת העתקה לתוך עצמה / לתוך צאצא שלה.

תגובה

{ "status": "OK", "newExtensionIds": [70001, 70002], "foldersList": { ... } }

דוגמה — העתקה מרובה

GET ivrFilesApi.php?action=folderCopy&extensionId=4001,4023,4099&target=4502&project=main
כל מקור נבדק עצמאית; מקורות לא תקינים מדולגים בשקט. newExtensionIds מוחזר באותו סדר של הבקשה (פחות אלו שדולגו).

folderMove

GET action=folderMove

מעביר שלוחה (או מספר) להורה חדש — מעדכן רק belowExtension, הצאצאים עוברים אוטומטית.

מפתחהסברחובה
extensionIdID / IDs מופרדים בפסיקחובה
targetID של הורה חדשחובה

דוגמה — העברה מרובה

GET ivrFilesApi.php?action=folderMove&extensionId=4001,4023,4099&target=4502&project=main

folderDelete

GET action=folderDelete

מחיקת שלוחה. הקבצים תחתיה מסומנים ב-trash=time() (soft).

מפתחהסברחובה
extensionIdID / IDs מופרדים בפסיקחובה
השלוחה הראשית (belowExtension = null) לא ניתנת למחיקה.

ניהול קבצים

filesList

GET action=filesList
מפתחהסברחובה
extensionIdID של השלוחהחובה

תגובה

[ { "id": "60383", "name": "ברכות", "ivrName": "abc123", "time": "1713000000", "runningOrder": 1000, "runningOrderView": 1, "details": { "phone": "052-1234567" }, "taggs": [ { "tag": "5", "name": "ברכות", "color": "#4caf50" } ], "opus_size": 102400, "source": "r2" } ]

uploadFile

POST multipart action=uploadFile

העלאת קובץ-שמע בודד לשלוחה. הקובץ עובר שער-אבטחה: גודל עד 10MB (וגם חייב להיכנס למגבלת-הבקשה של השרת — upload_max_filesize/post_max_size; בשרת הנוכחי ~2MB, ולכן מעבר לכך חובה uploadInit למטה), סיומת מרשימת פורמטי-שמע מאושרים, ובדיקת-תוכן אמיתית ב-ffprobe (קובץ שאינו אודיו שמשנים לו את הסיומת — נדחה). קבצי-הביניים נשמרים מחוץ ל-document-root (ספרייה פרטית 0700) ונמחקים מיד עם העלייה ל-R2 — שום קובץ לא נשאר על השרת. לאחר אימות הקובץ מומר ל-opus ונשמר ב-R2.

מפתחהסברחובה
extensionIdיעד (חייב להיות שלך)חובה
fileקובץ שמע (multipart)חובה
nameשם להצגה (ברירת מחדל — שם הקובץ). מחוטא: תווי-בקרה ומפרידי-נתיב מוסרים, עד 120 תוויםאופציונלי
checkDuplicateSTOP (שגיאה אם קיים) / BACKUP (גיבוי עם תאריך) / אחרת — החלפהאופציונלי

סיומות מאושרות: wav, mp3, ogg, oga, opus, m4a, m4b, aac, flac, amr, wma, aiff, aif, aifc, mp4, 3gp, 3gpp, webm, mka, caf, au, ac3. אורך-אודיו מרבי: 6 שעות.

קודי שגיאה

errorCodeתיאור
2לא התקבל קובץ
3קובץ שמע לא תקין / לא ניתן לפענוח
4extensionId חסר
5extensionId לא שייך למשתמש
6שגיאה בקבלה/המרה/אחסון
8כפילות + checkDuplicate=STOP
9קובץ גדול מדי (מעל 60MB)
10סוג-קובץ לא נתמך
11אודיו ארוך מדי

בכל כשל מוחזר גם reason קריא-מכונה.

uploadInit → uploadChunk → uploadComplete

העלאה-בחתיכות (resumable) של קבצי-אודיו גדולים

לקבצים מעל מגבלת-ההעלאה-הרגילה (ולעמידות מול ניתוקים) — מעלים בחתיכות. כל חתיכה היא בקשת multipart/form-data קטנה שנשארת מתחת למגבלת-הבקשה של השרת — וזה בדיוק מה שמאפשר לשרת חסום-2MB לקלוט קבצים גדולים כרצונך. כל הסשן נעול ל-apiKey שלך: ה-uploadId שייך לחשבון שלך בלבד. מגבלות: קובץ עד 512MB, סשן חי 24 שעות, וגודל-החתיכה נחתך אוטומטית למה שהשרת מקבלuploadInit מחזיר chunkSize (השתמשו בו) ו-maxRequestBytes (אל תשלחו חתיכה גדולה מזה). קבצי-הביניים נשמרים מחוץ ל-document-root ונמחקים אחרי ההרכבה.

1. uploadInit (POST/GET — פותח סשן)

מפתחהסברחובה
extensionIdיעד (חייב להיות שלך)חובה
fileNameשם-הקובץ המקורי כולל סיומת (לבדיקת הרשימה-המאושרת)חובה
totalSizeגודל הקובץ המלא בבייטיםחובה
nameשם להצגה (ברירת מחדל — fileName בלי סיומת)אופציונלי
chunkSizeגודל-חתיכה מבוקש בבייטים (אופציונלי). נחתך אוטומטית לתקרת-הבקשה של השרת; ברירת-מחדל 1MB. תמיד השתמשו ב-chunkSize שחוזר מ-uploadInitאופציונלי
sha256SHA-256 (hex) של הקובץ המלא — מאומת ב-uploadCompleteאופציונלי
checkDuplicateכמו ב-uploadFileאופציונלי

מחזיר: {"status":"OK","uploadId":"<64-hex>","chunkSize":n,"totalChunks":n,"expiresAt":unix,"received":[]}. חותכים את הקובץ ל-totalChunks חלקים בגודל chunkSize (האחרון — השארית).

2. uploadChunk (POST multipart — שולחים כל חתיקה)

מפתחהסברחובה
uploadIdמתוך uploadInitחובה
chunkIndexאינדקס החתיכה (מבוסס-0)חובה
chunkהבייטים של החתיכה (שדה multipart)חובה
chunkSha256SHA-256 (hex) של החתיכה — מאומת אם נשלחאופציונלי

הסדר לא משנה, ושליחה-חוזרת של אותה חתיכה בטוחה (idempotent) — כך החידוש פשוט. מחזיר: {"status":"OK","received":count,"total":n,"complete":bool}.

3. uploadComplete (POST/GET — מרכיב, מאמת ומאחסן)

מפתחהסברחובה
uploadIdמתוך uploadInitחובה

מרכיב את החתיכות, מאמת (גודל + SHA-256 אם סופק + ffprobe), ממיר ל-opus, מאחסן ב-R2 ומשייך לשלוחה — ואז מוחק את הסשן והחתיכות. מחזיר: {"status":"OK","name":"...","fileId":id}.

פעולות-עזר

פעולההסבר
uploadStatus (uploadId)מחזיר received[] — אילו חתיכות התקבלו, לחידוש לאחר ניתוק
uploadAbort (uploadId)מבטל ומוחק את כל החתיכות

קודי שגיאה (חתיכות)

errorCodeתיאור
9 / 10 / 11גודל חסר/גדול מדי / סוג לא נתמך / אודיו ארוך מדי
12יותר מדי חתיכות
20סשן לא מוכר / לא שלך
21 / 22סשן לא פתוח / פג-תוקף
23 / 24 / 25חתיכה חסרה / אינדקס מחוץ-לטווח / גודל-חתיכה לא תקין
26חריגה מהגודל הכולל
27אי-התאמת hash של חתיכה
28כשל בשמירת חתיכה
30חתיכות חסרות (התגובה כוללת missing[])
31 / 32 / 33כשל-הרכבה / אי-התאמת גודל / אי-התאמת checksum

fileDelete

GET action=fileDelete

Soft delete — מסמן trash=time(). תומך במחיקה מרובה.

מפתחהסברחובה
fileIdID / IDs מופרדים בפסיקחובה
belowExtensionID של השלוחה — לחזרה עם filesList מעודכןחובה

fileRename

GET action=fileRename
מפתחהסברחובה
fileIdID של הקובץחובה
newNameשם חדשחובה
belowExtensionID של השלוחה — לחזרה עם filesList מעודכןחובה

fileTagging

GET action=fileTagging
מפתחהסברחובה
fileIdID של הקובץחובה
extensionIdID של השלוחה הנוכחיתחובה
typeSAVEחובה
tagsIDs מופרדים בפסיק, או טקסטים חדשים (ייווצרו כתגיות חדשות)חובה

fileOrderSet

GET action=fileOrderSet

שינוי מיקום (סדר השמעה) של הקובץ בשלוחה.

מפתחהסברחובה
fileIdID של הקובץחובה
extensionIdID של השלוחהחובה
type END / TOP / AFTER / RAPLACE חובה
val מספר קובץ יעד (ל-AFTER / RAPLACE) אופציונלי

fileCopy / fileMove

GET action=fileCopy | fileMove

fileMove מעתיק לשלוחה חדשה ומסמן את המקור כ-trash — זוהי הסמנטיקה של "גזירה והדבקה".

מפתחהסברחובה
fileIdID / IDs מופרדים בפסיקחובה
targetID שלוחה יעדחובה

דוגמה — העתקה/הזזה מרובה

GET ivrFilesApi.php?action=fileCopy&fileId=901,902,903,904&target=4502&project=main

מחזיר { status:"OK", note:"" } או { status:"ERROR", note } אם target לא קיים. הקבצים מוכנסים בסדר הבקשה, כל אחד מקבל runningOrder חדש (תוספות של 1000 מ-RO האחרון של היעד).

אין endpoint נפרד ל"גזירה" — לסמנטיקת cut-and-paste של קבצים השתמש ב-fileMove, ולשלוחות ב-folderMove.

fileDownload

GET action=fileDownload

מפעיל את audio.php להזרמת הקובץ. הממשק הקיים עוקף את זה עם לינק ישיר ל-audio.php?type=ivr&audio=<ivrName>.

הגדרות שלוחה

folderSettings

GET action=folderSettings

מחזיר את כל המידע על שלוחה: name, extension, belowExtension, type, settings (JSON מפוענח), security (JSON מפוענח), project.

מפתחהסברחובה
extensionIdID של השלוחהחובה

extensionSet

POST action=extensionSet

שמירה או יצירה של שלוחה.

מפתחהסברחובה
extensionIdID קיים, או NEW ליצירהחובה
belowExtensionID הורה (ב-NEW)חובה
nameשם השלוחהאופציונלי
extensionמספר השלוחה (להקשה)אופציונלי
typeמפתח מתוך typesחובה
settings[*]מפת המפתחות מה-fields הרלוונטיים לסוג (לפי forms[type])אופציונלי

דוגמה

POST ivrFilesApi.php?action=extensionSet&extensionId=NEW&belowExtension=1 Content-Type: application/x-www-form-urlencoded name=שירות&extension=2&type=menu &settings[maxDigits]=1&settings[menuReplay]=4
עבור type=menu עם פריטי תפריט דינמיים (menuItems) — שלוחת תת-אוסף settings[menuItems][i][menuItem]=upload|file|text, ו-settings[menuItems][i][uploadAudio]=<tmpFileName> אחרי שימוש ב-?ivrFileUploader=audioTmp.

הרשאות גישה

securitySet

POST action=securitySet

שומר רשימה של תנאי גישה על השלוחה. כל שדה שמכיל securityType במקום כלשהו במערך נכנס ל-security של השלוחה בסדר רציף (S1, S2, …).

מפתחהסברחובה
extensionIdID של השלוחהחובה
belowExtensionID הורה (לעדכון עץ)אופציונלי
S{i}[*]שדות תנאי (חייב להכיל securityType)חובה

דוגמה

POST ivrFilesApi.php?action=securitySet&extensionId=4500 Content-Type: application/x-www-form-urlencoded S1[securityType]=login&S1[passType]=adminPass &S2[securityType]=phoneFilter&S2[phones]=0521234567,0501234567

הודעות מערכת

systemMessagesList

GET action=systemMessagesList

מחזיר את כל קודי הודעות המערכת + ההתאמות שכבר הוגדרו לשלוחה.

מפתחהסברחובה
extensionIdID השלוחהחובה

getCustomMessages

GET action=getCustomMessages

מחזיר רצף הודעות מותאמות לקוד מסוים (לעריכה).

מפתחהסברחובה
codeקוד הודעה (למשל sys-5)חובה
extensionIdID השלוחהחובה

saveCustomMessagesBeta

POST action=saveCustomMessagesBeta (JSON body)

Body

{ "code": "sys-5", "extensionId": "4500", "project": "MAIN", "messages": [ { "type": "TEXT", "value": "ברוכים הבאים" }, { "type": "FILE", "value": "<ivrName>", "conditions": [ ... ] } ] }

updateSystemMessage / deleteSystemMessage

POST action=updateSystemMessage | deleteSystemMessage

updateSystemMessage — גרסה ישנה של שמירה בודדת (TEXT או FILE). deleteSystemMessage — מוחק את כל ההתאמות לקוד נתון בשלוחה.

מפתחהסברחובה
codeקוד הודעהחובה
extensionIdID השלוחהחובה

Dropdowns דינמיים

getOptions / getOptions2

GET action=getOptions | getOptions2

משמש לטעינת תוכן של כל שדה שהוגדר ב-fields עם options:"GET" ו-optionsKey:"<key>".

מפתחהסברחובה
listמפתח אחד או כמה מפתחות מופרדים בפסיקחובה

מפתחות נתמכים

streamId, templateId, musicOnHold, ivrForms, mailingLists, creditCardId, routerId, filesList, kesherPhone, playTemplate, fileTags.

דוגמה

// GET ivrFilesApi.php?action=getOptions2&list=fileTags,mailingLists { "fileTags": [ { "value": "5", "SYSvalue": "5", "label": "ברכות" } ], "mailingLists": [ { "value": "1000", "label": "1000-כללי" } ] }

סיכום מהיר — כל הפעולות

קבוצהactionmethodתיאור
Schema חדש getUiSchemaGETbootstrap יחיד לכל הנתונים
getExtensionTypesGETסוגי שלוחות
getFieldsSchemaGETהגדרות שדות
getFormLayoutGETמבנה טופס לפי סוג
getAccountSettingsGETuse_rh, rh_max, ivrSystemPhone
getMailingListsGETרשימות תפוצה כ-JSON
getExtensionPathGETbreadcrumb לשלוחה
עץ foldersListGETעץ השלוחות
folderCopyGETהעתקה רקורסיבית
folderMoveGETהעברה
folderDeleteGETמחיקה
קבצים filesListGETקבצים בשלוחה
uploadFilePOST multipartהעלאה (עד 60MB)
uploadInitPOST/GETפתיחת סשן העלאה-בחתיכות
uploadChunkPOST multipartשליחת חתיכה
uploadCompletePOST/GETהרכבה + אימות + אחסון
uploadStatusGETאילו חתיכות התקבלו (לחידוש)
uploadAbortPOST/GETביטול סשן
fileDeleteGETמחיקה רכה
fileRenameGETשינוי שם
fileTaggingGETתיוג
fileOrderSetGETשינוי מיקום
fileCopy / fileMoveGETהעתקה/העברה לשלוחה אחרת
הגדרות folderSettingsGETטעינת שלוחה
extensionSetPOSTשמירה / יצירה
הרשאותsecuritySetPOSTשמירת תנאים
הודעות מערכת systemMessagesListGETכל הקודים + התאמות
getCustomMessagesGETרצף לקוד
saveCustomMessagesBetaPOST JSONשמירת רצף
updateSystemMessagePOSTשמירה בודדת (ישן)
deleteSystemMessagePOSTמחיקה
DropdownsgetOptions / getOptions2GETתוכן דינמי ל-options:"GET"
המלצה: בטעינת הממשק הראשונה — תבצעו קריאה אחת ל-getUiSchema ו-foldersList במקביל (Promise.all), ותאחסנו ב-cache. כל יתר הפעולות ממשיכות בדרישה לפי צורך (הגדרת שלוחה, קובץ וכו').