יצירת לקוח (עם בקשה) דרך ה‑API
מדריך אינטגרציה למפתחים: איך ליצור לקוח חדש — ובמידת הצורך גם בקשה באותה קריאה, וגם לשייך אותו לחברי צוות — דרך ה‑API החיצוני של Docly.
סקירה כללית
ה‑API החיצוני מאפשר ללקוחות המערכת (טננטים) ליצור לקוחות באופן תכנותי. אותה קריאה יכולה גם ליצור בקשה (Request) עבור הלקוח על בסיס תבנית קיימת, וגם לשייך את הלקוח לחברי צוות לפי כתובת אימייל.
| נושא | ערך |
|---|---|
| Endpoint | POST https://app.docly.co.il/api/v1/customers |
| אימות | מפתח API של הטננט בכותרת Authorization: Bearer <key> |
| Content‑Type | application/json |
| Rate limit | 30 קריאות לכל 60 שניות, לכל מפתח |
שמירה על המפתח: מפתח ה‑API נותן גישה מלאה ליצירת לקוחות בטננט שלך. אל תשתף אותו בצ’אטים, בלוגים או בקוד שמועלה ל‑Git. אם נחשף — יש להחליפו.
גוף הבקשה (Request Body)
| שדה | חובה | תיאור |
|---|---|---|
name | חובה | שם הלקוח |
email | חובה | כתובת אימייל תקינה |
phone | חובה | טלפון ישראלי. מנורמל אוטומטית (+972 ← 0, הסרת רווחים/מקפים) |
customerTypeName | חובה | שם סוג הלקוח, חייב להתאים במדויק לשם קיים בטננט |
externalId | רשות | מזהה חיצוני משלך. מונע כפילויות ומאפשר idempotency |
metadata | רשות | אובייקט חופשי — מטא‑דאטה ברמת הלקוח |
assignedTo | רשות | מערך של כתובות אימייל של חברי צוות לשיוך הלקוח (ראה בהמשך) |
request | רשות | בלוק ליצירת בקשה באותה קריאה (ראה בהמשך) |
מטא‑דאטה — שתי רמות
קיימות שתי רמות נפרדות של מטא‑דאטה, שתיהן אובייקטי JSON חופשיים (key: value):
- מטא‑דאטה ברמת הלקוח — שדה
metadataבראש הגוף. נשמר על רשומת הלקוח. משמש גם למתן שמות לתיקיות האחסון (למשל תבנית{metadata.national_id}). - מטא‑דאטה ברמת הבקשה — שדה
metadataבתוך בלוקrequest. נשמר על רשומת הבקשה. רלוונטי רק כשנשלח בלוק בקשה.
{
"name": "ישראל ישראלי",
"metadata": {
"national_id": "123456789"
},
"request": {
"templateName": "הלוואה לכל מטרה - לווה יחיד",
"metadata": {
"request_id": "2025"
}
}
}שיוך הלקוח לחברי צוות (assignedTo)
assignedTo הוא מערך אופציונלי של כתובות אימייל של חברי הצוות בטננט שלך. כשהוא נשלח, הלקוח משויך לחברי הצוות התואמים — בדיוק כמו “צוות מטפל” שאתה מגדיר בפאנל הניהול. השדה הוא אופציונלי לחלוטין: אם לא תשלח אותו, כלום לא משתנה.
מי נחשב חבר צוות שאפשר לשייך אליו? כל אימייל מושווה (ללא רגישות לאותיות גדולות/קטנות) מול המשתמשים בטננט שלך. חבר צוות ניתן לשיוך רק אם הוא:
- משתמש בטננט שלך, וגם
- פעיל (לא מושבת), וגם
- אינו מנהל‑על של הפלטפורמה (super‑admin).
כתובת שלא נמצאה לא מכשילה את הקריאה. אימייל שאינו תואם חבר צוות פעיל (שגיאת הקלדה, כתובת לא מוכרת, משתמש מושבת) פשוט יוחזר בשדה assignment.unmatched בתשובה — הלקוח עדיין נוצר בהצלחה.
התנהגות ללקוח חדש מול לקוח קיים:
ערך assignedTo | לקוח חדש | לקוח קיים (זוהה לפי אימייל ← טלפון ← externalId) |
|---|---|---|
| לא נשלח | ללא שיוך | השיוך הקיים נשאר ללא שינוי |
[] (מערך ריק) | ללא פעולה | השיוך הקיים נשאר ללא שינוי |
["a@…","b@…"] | משייך את החברים התואמים | מחליף את כל סט השיוך בחברים התואמים |
על לקוח קיים, assignedTo לא‑ריק הוא החלפה (Replace) ולא הוספה. חברי צוות ששויכו קודם אך אינם ברשימה — כולל כאלה ששויכו ידנית בפאנל הניהול — יוסרו מהשיוך. אם אתה שולח את השדה הזה, אתה הופך את ה‑API למקור האמת לשיוך. אם אינך רוצה לגעת בשיוך — פשוט אל תשלח את assignedTo.
מנגנוני הגנה (כדי שקריאה שגויה לא תמחק צוות):
"assignedTo": [](מערך ריק מפורש) נחשב כלא נשלח — ללא פעולה, לעולם לא “נקה הכול”.- אם
assignedToאינו ריק אך אף אחת מהכתובות אינה תואמת חבר צוות שאפשר לשייך — השיוך הקיים נשאר ללא שינוי (כל הכתובות חוזרות כ‑unmatched). מערך מלא בשגיאות הקלדה לעולם לא ימחק את הצוות המשויך.
כתובת אימייל בפורמט לא תקין נדחית מראש עם 400 לפני שנוצר משהו (ראה שגיאות נפוצות).
יצירת בקשה באותה קריאה
אם תכלול בלוק request, תיווצר בקשה עבור הלקוח החדש על בסיס תבנית. השדות בבלוק:
| שדה | תיאור |
|---|---|
templateId | מזהה תבנית (UUID). או זה או templateName |
templateName | שם תבנית — נפתר לפי שם בתוך הטננט |
metadata | מטא‑דאטה ברמת הבקשה |
reportingPeriod | לתבניות מבוססות‑תקופה: { months: [...], label: "..." } |
שים לב: customerTypeName (סוג הלקוח) ו‑templateName (שם התבנית) הם לרוב שני דברים שונים. ודא ששניהם תואמים בדיוק לערכים הקיימים בפאנל הניהול.
דוגמה מלאה — cURL
curl --location 'https://app.docly.co.il/api/v1/customers' \
--header 'Authorization: Bearer docly_xxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "ישראל ישראלי",
"email": "israel@example.com",
"phone": "0501234567",
"customerTypeName": "הלוואה לכל מטרה - לווה יחיד",
"externalId": "loan-req-12345",
"assignedTo": ["sarah@firm.co.il"],
"metadata": {
"national_id": "123456789"
},
"request": {
"templateName": "הלוואה לכל מטרה - לווה יחיד",
"metadata": {
"request_id": "2025"
}
}
}'תשובות (Responses)
הצלחה — 201 Created
{
"customer": { "id": "...", "guid": "...", "name": "..." },
"password": "839204",
"portalUrl": "https://app.docly.co.il/<tenant>/c/<guid>",
"request": { "id": "...", "guid": "..." }
}passwordמוחזר פעם אחת בלבד — סיסמת הכניסה החד‑פעמית של הלקוח.portalUrl— קישור הכניסה של הלקוח לפורטל.requestמופיע רק אם נשלח בלוקrequest.
סיכום השיוך — assignment (רק כששלחת assignedTo)
אם — ורק אם — שלחת assignedTo לא‑ריק, התשובה כוללת גם אובייקט assignment שמפרט אילו כתובות שויכו ואילו לא:
{
"customer": { "...": "..." },
"portalUrl": "https://app.docly.co.il/<tenant>/c/<guid>",
"assignment": {
"assigned": ["sarah@firm.co.il"],
"unmatched": ["dan@firm.co.il"]
}
}assigned— הכתובות שהותאמו לחבר צוות ושויכו.unmatched— הכתובות שלא נפתרו לחבר צוות שאפשר לשייך.- כש‑
assignedToלא נשלח (או נשלח ריק), אין שדהassignmentכלל — התשובה זהה בדיוק לקודם.
השיוך הוא מיטב‑מאמץ (best‑effort): הוא רץ אחרי יצירת הלקוח (והבקשה), וכשל בלתי‑צפוי בשלב השיוך נרשם ביומן ונבלע — הלקוח עדיין מוחזר בהצלחה, פשוט ללא שדה assignment. שיוך לעולם לא הופך ל‑4xx/5xx.
שגיאות נפוצות
| קוד | מתי | הודעה |
|---|---|---|
400 | טלפון לא תקין / אימייל לא תקין ב‑assignedTo / כשל אימות סכימה | מספר טלפון ישראלי לא תקין וכו’ (לא נוצר דבר) |
401 | מפתח API חסר/לא תקין | מפתח API לא תקין או שפג תוקפו |
404 | שם סוג הלקוח לא נמצא | סוג לקוח לא נמצא במערכת |
422 | תבנית הבקשה לא נמצאה / חסרה מטא‑דאטה נדרשת | תבנית הבקשה "..." לא נמצאה / חסרים שדות מטא‑דאטה |
500 | כשל פנימי (למשל אחסון לא מוגדר לטננט) | יצירת הלקוח נכשלה |
שגיאת 500 נפוצה: אם הטננט לא מחובר לספק אחסון (Google Drive / OneDrive), יצירת תיקיות האחסון נכשלת והקריאה מחזירה 500. הפתרון הוא חיבור ספק אחסון לטננט בפאנל הניהול — לא שינוי בגוף הבקשה.
בעיות נפוצות ופתרון
- קיבלתי 404 “סוג לקוח לא נמצא”: השם ב‑
customerTypeNameאינו תואם במדויק. העתק את השם מהפאנל (copy‑paste, לא הקלדה) כדי להימנע מהבדל במקף או ברווח. - קיבלתי 422 על התבנית: ודא ש‑
templateNameתואם בדיוק לשם תבנית קיימת, או השתמש ב‑templateId. - קיבלתי 500: בדוק שהטננט מחובר לאחסון. ללא חיבור אחסון, כל יצירת לקוח תיכשל באותו שלב.
- חבר צוות לא שויך (הופיע ב‑
unmatched): ודא שהאימייל תואם בדיוק לחבר צוות פעיל בטננט שלך, ושאינו מנהל‑על. שיוך לעולם לא מכשיל את הקריאה — בדוק את מערךunmatchedבתשובה. - למניעת כפילויות: שלח
externalIdייחודי לכל בקשה — קריאה חוזרת עם אותו מזהה תחזיר את הלקוח הקיים במקום ליצור כפילות.