מדריך מלא לכל הפעולות של מנוע ניהול השלוחות, הקבצים, ההרשאות והודעות המערכת
ה-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", "קלט לא תקין") שכל שלוחה יכולה לדרוס בטקסט או הקלטה. |
apiKey=YOUR_API_KEY (כפרמטר GET או שדה POST). את המפתח מקבלים משירות הלקוחות.
application/x-www-form-urlencoded. חריגים: saveCustomMessagesBeta מצפה ל-JSON body, uploadFile ו-uploadChunk ל-multipart/form-data. כל תגובה מוחזרת כ-JSON, בד"כ עם "status": "OK" או "status": "ERROR" + note.
כשמציגים טופס עבור שלוחה: שולפים את forms[type], מיטרים על הפריטים, ולכל פריט מחפשים את הגדרת השדה ב-fields[input]. כל פריט יכול להכיל:
| מאפיין | השפעה |
|---|---|
size | 1 = רוחב מלא (2 עמודות ב-grid), 2 = חצי (תא יחיד). |
startLine | "yes" → שורת grid חדשה. |
view_if |
DSL להצגה מותנית: field:val / field:val1*val2 (OR לאותו שדה) / A&B (AND) / A|B (OR בין שדות). |
input_id | override ל-id — שימושי לרינדור של אותו שדה מספר פעמים (למשל digits1, digits2…). |
errorExit | אם ה-dropdown (options: GET) ריק — מציגים את המחרוזת הזו במקום הטופס. |
html | רק כשהפריט הוא type:"html" — בלוק HTML חופשי להזרקה. |
options שלו שווה למחרוזת "GET" — יש להבעיר את optionsKey ל-getOptions2. ניתן לבקש כמה מפתחות בקריאה אחת: list=a,b,c.
כל המטא-דאטה הסטטית של המערכת (סוגי שלוחות, הגדרות שדות, מבני טפסים, רשימות תפוצה והגדרות חשבון) זמינה דרך קבוצת endpoints מסומנים בחדש.
טוען בקריאה אחת את כל הסכמה — מומלץ בטעינה ראשונית של הממשק.
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]| מאפיין | תפקיד |
|---|---|
| type | input / html |
| input | מפתח ל-fields |
| input_id | אופציונלי — override ל-id של ה-input (לשימוש חוזר באותו שדה, למשל digits1…digits9) |
| title | אופציונלי — override לכותרת |
| view_if | תנאי הצגה: field:val / field:val1*val2.
חיבורים: & (AND), | (OR) |
| startLine | "yes" → שורת grid חדשה |
| size | 1 = span על 2 עמודות; 2 = תא יחיד |
| default | ערך ברירת מחדל לשדה הזה |
| errorExit | הודעה שתוצג במקום הטופס כשאין אפשרויות |
| html | (רק כאשר type=html) — מחרוזת HTML חופשי |
מחזיר רק את types + accountSettings. שימושי לרשימה הראשונה של "בחר סוג שלוחה" בזמן יצירה.
accountSettings.use_rh = "yes" מפעיל את הסוגים runRingHangup, rhAdd, rhRemove.מחזיר רק את מערך השדות (colls_array). לאחסון ב-cache בקליינט.
החזרת מבנה הטופס של סוג שלוחה בודד. ללא type — מחזיר את כל הטפסים.
| מפתח | הסבר | חובה |
|---|---|---|
| type | מפתח סוג שלוחה (למשל menu, simpleRouting, audioPlayer) |
אופציונלי |
| שדה | הסבר | ערכים |
|---|---|---|
| use_rh | האם סוגי צינתוק (runRingHangup / rhAdd / rhRemove) פעילים לחשבון | yes / no |
| rh_max | מקסימום טלפונים לרשימת צינתוק (0 = ללא הגבלה) | מספר שלם |
| ivrSystemPhone | מספר מערכת המרכזיה | מחרוזת |
מחזיר את רשימות התפוצה של המשתמש כ-JSON נקי (במקום <option> כמו שהיה קודם).
מחזיר breadcrumb מהשלוחה הראשית עד לשלוחה המבוקשת (כולל עצמה).
מחזיר את כל עץ השלוחות של המשתמש.
| מפתח | הסבר | חובה |
|---|---|---|
| project | ברירת מחדל: MAIN | אופציונלי |
העתקה רקורסיבית של שלוחה — כולל תת-שלוחות וקבצים.
| מפתח | הסבר | חובה |
|---|---|---|
| extensionId | ID אחד או מספר IDs מופרדים בפסיק | חובה |
| target | ID של שלוחת היעד (ההורה החדש) | חובה |
newExtensionIds מוחזר באותו סדר של הבקשה (פחות אלו שדולגו).מעביר שלוחה (או מספר) להורה חדש — מעדכן רק belowExtension, הצאצאים עוברים אוטומטית.
| מפתח | הסבר | חובה |
|---|---|---|
| extensionId | ID / IDs מופרדים בפסיק | חובה |
| target | ID של הורה חדש | חובה |
מחיקת שלוחה. הקבצים תחתיה מסומנים ב-trash=time() (soft).
| מפתח | הסבר | חובה |
|---|---|---|
| extensionId | ID / IDs מופרדים בפסיק | חובה |
belowExtension = null) לא ניתנת למחיקה.| מפתח | הסבר | חובה |
|---|---|---|
| extensionId | ID של השלוחה | חובה |
העלאת קובץ-שמע בודד לשלוחה. הקובץ עובר שער-אבטחה: גודל עד 10MB (וגם חייב להיכנס למגבלת-הבקשה של השרת — upload_max_filesize/post_max_size; בשרת הנוכחי ~2MB, ולכן מעבר לכך חובה uploadInit למטה), סיומת מרשימת פורמטי-שמע מאושרים, ובדיקת-תוכן אמיתית ב-ffprobe (קובץ שאינו אודיו שמשנים לו את הסיומת — נדחה). קבצי-הביניים נשמרים מחוץ ל-document-root (ספרייה פרטית 0700) ונמחקים מיד עם העלייה ל-R2 — שום קובץ לא נשאר על השרת. לאחר אימות הקובץ מומר ל-opus ונשמר ב-R2.
| מפתח | הסבר | חובה |
|---|---|---|
| extensionId | יעד (חייב להיות שלך) | חובה |
| file | קובץ שמע (multipart) | חובה |
| name | שם להצגה (ברירת מחדל — שם הקובץ). מחוטא: תווי-בקרה ומפרידי-נתיב מוסרים, עד 120 תווים | אופציונלי |
| checkDuplicate | STOP (שגיאה אם קיים) / 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 | קובץ שמע לא תקין / לא ניתן לפענוח |
4 | extensionId חסר |
5 | extensionId לא שייך למשתמש |
6 | שגיאה בקבלה/המרה/אחסון |
8 | כפילות + checkDuplicate=STOP |
9 | קובץ גדול מדי (מעל 60MB) |
10 | סוג-קובץ לא נתמך |
11 | אודיו ארוך מדי |
בכל כשל מוחזר גם reason קריא-מכונה.
לקבצים מעל מגבלת-ההעלאה-הרגילה (ולעמידות מול ניתוקים) — מעלים בחתיכות. כל חתיכה היא בקשת multipart/form-data קטנה שנשארת מתחת למגבלת-הבקשה של השרת — וזה בדיוק מה שמאפשר לשרת חסום-2MB לקלוט קבצים גדולים כרצונך. כל הסשן נעול ל-apiKey שלך: ה-uploadId שייך לחשבון שלך בלבד. מגבלות: קובץ עד 512MB, סשן חי 24 שעות, וגודל-החתיכה נחתך אוטומטית למה שהשרת מקבל — uploadInit מחזיר chunkSize (השתמשו בו) ו-maxRequestBytes (אל תשלחו חתיכה גדולה מזה). קבצי-הביניים נשמרים מחוץ ל-document-root ונמחקים אחרי ההרכבה.
uploadInit (POST/GET — פותח סשן)| מפתח | הסבר | חובה |
|---|---|---|
| extensionId | יעד (חייב להיות שלך) | חובה |
| fileName | שם-הקובץ המקורי כולל סיומת (לבדיקת הרשימה-המאושרת) | חובה |
| totalSize | גודל הקובץ המלא בבייטים | חובה |
| name | שם להצגה (ברירת מחדל — fileName בלי סיומת) | אופציונלי |
| chunkSize | גודל-חתיכה מבוקש בבייטים (אופציונלי). נחתך אוטומטית לתקרת-הבקשה של השרת; ברירת-מחדל 1MB. תמיד השתמשו ב-chunkSize שחוזר מ-uploadInit | אופציונלי |
| sha256 | SHA-256 (hex) של הקובץ המלא — מאומת ב-uploadComplete | אופציונלי |
| checkDuplicate | כמו ב-uploadFile | אופציונלי |
מחזיר: {"status":"OK","uploadId":"<64-hex>","chunkSize":n,"totalChunks":n,"expiresAt":unix,"received":[]}. חותכים את הקובץ ל-totalChunks חלקים בגודל chunkSize (האחרון — השארית).
uploadChunk (POST multipart — שולחים כל חתיקה)| מפתח | הסבר | חובה |
|---|---|---|
| uploadId | מתוך uploadInit | חובה |
| chunkIndex | אינדקס החתיכה (מבוסס-0) | חובה |
| chunk | הבייטים של החתיכה (שדה multipart) | חובה |
| chunkSha256 | SHA-256 (hex) של החתיכה — מאומת אם נשלח | אופציונלי |
הסדר לא משנה, ושליחה-חוזרת של אותה חתיכה בטוחה (idempotent) — כך החידוש פשוט. מחזיר: {"status":"OK","received":count,"total":n,"complete":bool}.
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 |
Soft delete — מסמן trash=time(). תומך במחיקה מרובה.
| מפתח | הסבר | חובה |
|---|---|---|
| fileId | ID / IDs מופרדים בפסיק | חובה |
| belowExtension | ID של השלוחה — לחזרה עם filesList מעודכן | חובה |
| מפתח | הסבר | חובה |
|---|---|---|
| fileId | ID של הקובץ | חובה |
| newName | שם חדש | חובה |
| belowExtension | ID של השלוחה — לחזרה עם filesList מעודכן | חובה |
| מפתח | הסבר | חובה |
|---|---|---|
| fileId | ID של הקובץ | חובה |
| extensionId | ID של השלוחה הנוכחית | חובה |
| type | SAVE | חובה |
| tags | IDs מופרדים בפסיק, או טקסטים חדשים (ייווצרו כתגיות חדשות) | חובה |
שינוי מיקום (סדר השמעה) של הקובץ בשלוחה.
| מפתח | הסבר | חובה |
|---|---|---|
| fileId | ID של הקובץ | חובה |
| extensionId | ID של השלוחה | חובה |
| type | END / TOP / AFTER / RAPLACE |
חובה |
| val | מספר קובץ יעד (ל-AFTER / RAPLACE) |
אופציונלי |
fileMove מעתיק לשלוחה חדשה ומסמן את המקור כ-trash — זוהי הסמנטיקה של "גזירה והדבקה".
| מפתח | הסבר | חובה |
|---|---|---|
| fileId | ID / IDs מופרדים בפסיק | חובה |
| target | ID שלוחה יעד | חובה |
מחזיר { status:"OK", note:"" } או { status:"ERROR", note } אם target לא קיים. הקבצים מוכנסים בסדר הבקשה, כל אחד מקבל runningOrder חדש (תוספות של 1000 מ-RO האחרון של היעד).
fileMove, ולשלוחות ב-folderMove.מפעיל את audio.php להזרמת הקובץ. הממשק הקיים עוקף את זה עם לינק ישיר ל-audio.php?type=ivr&audio=<ivrName>.
מחזיר את כל המידע על שלוחה: name, extension, belowExtension, type, settings (JSON מפוענח), security (JSON מפוענח), project.
| מפתח | הסבר | חובה |
|---|---|---|
| extensionId | ID של השלוחה | חובה |
שמירה או יצירה של שלוחה.
| מפתח | הסבר | חובה |
|---|---|---|
| extensionId | ID קיים, או NEW ליצירה | חובה |
| belowExtension | ID הורה (ב-NEW) | חובה |
| name | שם השלוחה | אופציונלי |
| extension | מספר השלוחה (להקשה) | אופציונלי |
| type | מפתח מתוך types | חובה |
| settings[*] | מפת המפתחות מה-fields הרלוונטיים לסוג (לפי forms[type]) | אופציונלי |
type=menu עם פריטי תפריט דינמיים (menuItems) —
שלוחת תת-אוסף settings[menuItems][i][menuItem]=upload|file|text,
ו-settings[menuItems][i][uploadAudio]=<tmpFileName> אחרי שימוש ב-?ivrFileUploader=audioTmp.
שומר רשימה של תנאי גישה על השלוחה. כל שדה שמכיל securityType
במקום כלשהו במערך נכנס ל-security של השלוחה בסדר רציף
(S1, S2, …).
| מפתח | הסבר | חובה |
|---|---|---|
| extensionId | ID של השלוחה | חובה |
| belowExtension | ID הורה (לעדכון עץ) | אופציונלי |
| S{i}[*] | שדות תנאי (חייב להכיל securityType) | חובה |
מחזיר את כל קודי הודעות המערכת + ההתאמות שכבר הוגדרו לשלוחה.
| מפתח | הסבר | חובה |
|---|---|---|
| extensionId | ID השלוחה | חובה |
מחזיר רצף הודעות מותאמות לקוד מסוים (לעריכה).
| מפתח | הסבר | חובה |
|---|---|---|
| code | קוד הודעה (למשל sys-5) | חובה |
| extensionId | ID השלוחה | חובה |
updateSystemMessage — גרסה ישנה של שמירה בודדת (TEXT או FILE). deleteSystemMessage — מוחק את כל ההתאמות לקוד נתון בשלוחה.
| מפתח | הסבר | חובה |
|---|---|---|
| code | קוד הודעה | חובה |
| extensionId | ID השלוחה | חובה |
משמש לטעינת תוכן של כל שדה שהוגדר ב-fields עם options:"GET"
ו-optionsKey:"<key>".
| מפתח | הסבר | חובה |
|---|---|---|
| list | מפתח אחד או כמה מפתחות מופרדים בפסיק | חובה |
streamId, templateId, musicOnHold,
ivrForms, mailingLists, creditCardId,
routerId, filesList, kesherPhone,
playTemplate, fileTags.
| קבוצה | action | method | תיאור |
|---|---|---|---|
| Schema חדש | getUiSchema | GET | bootstrap יחיד לכל הנתונים |
getExtensionTypes | GET | סוגי שלוחות | |
getFieldsSchema | GET | הגדרות שדות | |
getFormLayout | GET | מבנה טופס לפי סוג | |
getAccountSettings | GET | use_rh, rh_max, ivrSystemPhone | |
getMailingLists | GET | רשימות תפוצה כ-JSON | |
getExtensionPath | GET | breadcrumb לשלוחה | |
| עץ | foldersList | GET | עץ השלוחות |
folderCopy | GET | העתקה רקורסיבית | |
folderMove | GET | העברה | |
folderDelete | GET | מחיקה | |
| קבצים | filesList | GET | קבצים בשלוחה |
uploadFile | POST multipart | העלאה (עד 60MB) | |
uploadInit | POST/GET | פתיחת סשן העלאה-בחתיכות | |
uploadChunk | POST multipart | שליחת חתיכה | |
uploadComplete | POST/GET | הרכבה + אימות + אחסון | |
uploadStatus | GET | אילו חתיכות התקבלו (לחידוש) | |
uploadAbort | POST/GET | ביטול סשן | |
fileDelete | GET | מחיקה רכה | |
fileRename | GET | שינוי שם | |
fileTagging | GET | תיוג | |
fileOrderSet | GET | שינוי מיקום | |
fileCopy / fileMove | GET | העתקה/העברה לשלוחה אחרת | |
| הגדרות | folderSettings | GET | טעינת שלוחה |
extensionSet | POST | שמירה / יצירה | |
| הרשאות | securitySet | POST | שמירת תנאים |
| הודעות מערכת | systemMessagesList | GET | כל הקודים + התאמות |
getCustomMessages | GET | רצף לקוד | |
saveCustomMessagesBeta | POST JSON | שמירת רצף | |
updateSystemMessage | POST | שמירה בודדת (ישן) | |
deleteSystemMessage | POST | מחיקה | |
| Dropdowns | getOptions / getOptions2 | GET | תוכן דינמי ל-options:"GET" |
getUiSchema
ו-foldersList במקביל (Promise.all), ותאחסנו ב-cache.
כל יתר הפעולות ממשיכות בדרישה לפי צורך (הגדרת שלוחה, קובץ וכו').