getlead — לכידת ליד מהאתר
יוצר שורה חדשה ב‑Accounts עם IsAccount: false, כלומר ליד. לטופס שלוכד איש קשר בלבד. צריך גם רשומה מקושרת: web2table, טבלת ההחלטה.
אין Master Key, אין סשן ואין SDK: הכותרת היחידה היא ה‑Application Id, מזהה ציבורי. השערים הם דגל ההפעלה בצד השרת והוולידציה שהפונקציה מבצעת, לא סודיות המזהה.
הכותרות והגוף
Section titled “הכותרות והגוף”curl -X POST "https://api.mbapps.co.il/functions/{appId}/getlead" \ -H "Content-Type: application/json" \ -H "X-Parse-Application-Id: {appId}" \ -d '{ "Name": "ישראל ישראלי", "PhoneNumber": "0501234567", "Email": "israel@example.co.il", "City": "תל אביב" }'const res = await fetch(`https://api.mbapps.co.il/functions/${appId}/getlead`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Parse-Application-Id': appId, }, body: JSON.stringify({ Name: 'ישראל ישראלי', PhoneNumber: '0501234567', Email: 'israel@example.co.il', City: 'תל אביב', }),});import requests
res = requests.post( f"https://api.mbapps.co.il/functions/{appId}/getlead", headers={ "Content-Type": "application/json", "X-Parse-Application-Id": appId, }, json={ "Name": "ישראל ישראלי", "PhoneNumber": "0501234567", "Email": "israel@example.co.il", "City": "תל אביב", },)<?php$ch = curl_init();curl_setopt_array($ch, [ CURLOPT_URL => "https://api.mbapps.co.il/functions/{$appId}/getlead", CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Content-Type: application/json", "X-Parse-Application-Id: {$appId}", ], CURLOPT_POSTFIELDS => json_encode([ "Name" => "ישראל ישראלי", "PhoneNumber" => "0501234567", "Email" => "israel@example.co.il", "City" => "תל אביב", ], JSON_UNESCAPED_UNICODE),]);$response = curl_exec($ch);curl_close($ch);חובה: לפחות אחד מ‑PhoneNumber או Email.
שמות שדות: ללא קידומת, בדיוק כמו בסכימת Accounts: Name, F_name, L_name, PhoneNumber, Email, Address, City, CompanyId, וכל שדה מותאם. מיפוי שדות.
תשובות
Section titled “תשובות”| סטטוס | הגוף | המשמעות |
|---|---|---|
200 |
{ "result": { "success": true, "leadId": "<objectId>" } } |
הליד נוצר |
400 |
{"error":"missing \"PhoneNumber\" or \"Email\""} |
חסרים PhoneNumber וגם Email, או ששניהם לא תקינים כש‑ValidatePhoneOrEmail דלוק |
400 |
{"error":"AcceptWebLeads is Disabled"} |
דגל ה‑Config כבוי — ראו דגלי Config |
400 |
{"error":"User function not found"} |
שם פונקציה שגוי, למשל השם הישן web2lead |
500 |
— | תקלת שרת |
שדות מוגנים — אל תשלחו אותם
Section titled “שדות מוגנים — אל תשלחו אותם”| השדה | מי קובע אותו |
|---|---|
IsAccount |
השרת — תמיד false |
fromWeb2lead |
השרת — תמיד true על ליד שנוצר מהפונקציה |
LeadStatusId |
מנגנון זיהוי הכפילויות (ניתן לעקוף עבור ליד חדש בלבד) |
objectId, createdAt, updatedAt, ACL, createdBy, updatedBy |
שדות מערכת |
זיהוי כפילויות
Section titled “זיהוי כפילויות”- הטלפון מנורמל: מסירים תווים שאינם ספרות, ו‑
972…הופך ל‑0…. - השרת מריץ שאילתה על
Accounts.PhoneNumberמול כל הווריאציות:05XXXXXXXX,9725XXXXXXX,+9725XXXXXXX,05X-XXXXXXX,+972-5X-XXXXXXXומקבילותיהן לקווי נייח, ב‑OR עםAccounts.Email == <האימייל>. - כפילות לא חוסמת יצירה. תמיד נוצרת שורה חדשה:
- נמצאה התאמה → הליד החדש מקבל את סטטוס “ליד כפול”, ברירת המחדל בתבנית
QYvLV9xHE1. - לא נמצאה → הוא מקבל את ה‑
LeadStatusIdשנשלח בבקשה, ואם לא נשלח, את סטטוס “ליד חדש”, ברירת המחדלe9TwcETDGq.
- נמצאה התאמה → הליד החדש מקבל את סטטוס “ליד כפול”, ברירת המחדל בתבנית
הפורמטים שנסרקים וההבדל מול web2table: זיהוי כפילויות.
טיפוסים — הפורמט של שכבת הטפסים
Section titled “טיפוסים — הפורמט של שכבת הטפסים”חל גם על web2table, אותה שכבת המרה.
| טיפוס בסכימה | מה שולחים | הערות |
|---|---|---|
| String | מחרוזת | מחרוזת ריקה לא נשמרת — השדה כלל אינו נכתב |
| Number | מספר או מחרוזת מספרית | "1,500" ו‑"abc" נשמרים כ‑null, לא נזרקים |
| Boolean | true / false (בוליאני) — מומלץ. המחרוזת "true" / "false" מתקבלת ברוב השדות |
חריג: ב‑IsAccount מחרוזת מפילה את כל הבקשה ב‑400 (code 111, “expected Boolean but got String”) — רק בוליאני אמיתי עובד. מספר (1 / 0) נדחה ב‑400 בכל שדה בוליאני |
| Date | מחרוזת ISO שטוחה מרופדת: "2026-06-10" |
גם ISO מלא וגם {"__type":"Date","iso":…} עובדים. "2026-6-1" (לא מרופד) מפיל את כל הבקשה ב‑400 (code 111). זהירות: "10/06/2026" מתקבל — אבל נקרא כ‑6 באוקטובר (חודש/יום אמריקאי). שלחו ISO בלבד |
| Pointer | מחרוזת objectId חשופה, 10 תווים: "vOZLqOWnQf" |
גם {"__type":"Pointer",…} עובד. אורך אחר מפיל את כל הבקשה ב‑400 (code 111). מחרוזת ריקה — 200 והשדה לא נכתב |
| בחירה מרובה | מערך של אובייקטי Pointer | מערך של אובייקטי Pointer — {"__type":"Pointer","className":…,"objectId":…} — הפורמט שה‑CRM עצמו שומר בשדה array_*_Pointer_*. מערך של מזהים חשופים נשמר גם הוא, אבל בכרטיס יוצגו צ’יפים ריקים וקריטריון containedIn בטריגר לא יתאים לו (נבדק ב‑web2table, 10.2026) |
| File | ב‑web2table: אובייקט File של קובץ שהועלה קודם; ב‑getlead — אין | מעלים קודם את הקובץ — POST /parse/files/<name> (כותרת App ID בלבד, הגוף הוא הקובץ) — ושולחים את אובייקט ה‑File שחזר: {"__type":"File","name":…,"url":…} → 200 ושורה אחת עם הקובץ (נבדק 10.2026). אובייקט File של קובץ שלא הועלה מחזיר 400 {"code":1} אחרי כ‑5 שניות ומשאיר בצד השרת איש קשר ו‑5 שורות יעד כפולות; מחרוזת URL מחזירה 400 (code 111), אבל איש הקשר כבר נוצר. |
מיפוי שדה Pointer מטופס
Section titled “מיפוי שדה Pointer מטופס”<select> שולח טקסט, ה‑API רוצה objectId. שלפו פעם אחת את טבלת ה‑lookup והטמיעו מפה סטטית:
// נשלף פעם אחת מטבלת LeadSource — עדכנו כשמוסיפים מקור חדשconst SOURCE_MAP = { 'פייסבוק': 'vOZLqOWnQf', 'גוגל': 'fHG8Rgy8Hr', 'אתר אינטרנט': 'yOTdl4L99Q',};ערך שנבחר ואינו במפה: השמיטו את השדה מהגוף. לא undefined, לא מחרוזת ריקה.
קוד מוכן — טופס בדף נחיתה
Section titled “קוד מוכן — טופס בדף נחיתה”<form id="lead-form" novalidate> <input name="fullName" placeholder="שם מלא" /> <input name="phone" type="tel" placeholder="טלפון" required /> <input name="email" type="email" placeholder="אימייל" /> <input name="city" placeholder="עיר" /> <select name="source"> <option value="">איך הגעתם אלינו?</option> <option>פייסבוק</option> <option>גוגל</option> <option>אתר אינטרנט</option> </select>
<!-- מלכודת דבש: בוט ימלא אותה, אדם לא יראה אותה כלל --> <input name="company_website" tabindex="-1" autocomplete="off" style="position:absolute;left:-9999px" aria-hidden="true" />
<button type="submit">שליחה</button> <p class="form-msg" role="status" aria-live="polite"></p></form>
<script>const APP_ID = 'הדביקו-כאן-את-ה-Application-Id';
const SOURCE_MAP = { 'פייסבוק': 'vOZLqOWnQf', 'גוגל': 'fHG8Rgy8Hr', 'אתר אינטרנט': 'yOTdl4L99Q',};
const form = document.getElementById('lead-form');const msg = form.querySelector('.form-msg');
form.addEventListener('submit', async (e) => { e.preventDefault(); const f = Object.fromEntries(new FormData(form));
// מלכודת דבש מלאה → זה בוט. מציגים "הצלחה" ולא שולחים כלום. if (f.company_website) { msg.textContent = 'תודה! נחזור אליכם בהקדם.'; return; }
const data = { Name: f.fullName, PhoneNumber: f.phone, Email: f.email, City: f.city, LeadSourceId: SOURCE_MAP[f.source], // objectId חשוף, או undefined };
// ניקוי ערכים ריקים — כדי לא לשלוח מחרוזות ריקות למערכת Object.keys(data).forEach((k) => { if (!data[k]) delete data[k]; });
if (!data.PhoneNumber && !data.Email) { msg.textContent = 'נא למלא טלפון או אימייל'; return; }
const btn = form.querySelector('button'); btn.disabled = true;
try { const res = await fetch(`https://api.mbapps.co.il/functions/${APP_ID}/getlead`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Parse-Application-Id': APP_ID }, body: JSON.stringify(data), });
if (res.ok) { const body = await res.json(); // { result: { success: true, leadId: "..." } } window.dataLayer?.push({ event: 'form_submit', lead_id: body.result?.leadId }); window.location.href = '/thank-you/'; return; } // כל שגיאה עסקית חוזרת כ-400 — ההבחנה היא לפי הגוף, לא לפי הסטטוס const err = await res.json().catch(() => ({})); if (/Disabled/.test(err.error || '')) msg.textContent = 'קבלת פניות מהאתר אינה מופעלת כרגע'; else if (/missing/.test(err.error || '')) msg.textContent = 'נא למלא טלפון או אימייל תקינים'; else msg.textContent = 'אירעה שגיאה, נסו שוב'; } catch { msg.textContent = 'אין חיבור לרשת, נסו שוב'; } finally { btn.disabled = false; }});</script>הפעלה חד‑פעמית לכל מערכת
Section titled “הפעלה חד‑פעמית לכל מערכת”נקודת הקצה חסומה עד שמוקמת שורה בטבלת המערכת Config:
| שדה | ערך |
|---|---|
Name |
AcceptWebLeads (String) |
Value |
{ "AcceptWebLeads": true } (Object — שם הדגל חוזר בתוך האובייקט) |
הפונקציה קוראת את המפתח הפנימי. ערך בוליאני חשוף ("Value": true) לא ניתן אפילו לשמירה: Config.Value מוגדר Object בסכימה, ו‑REST מחזיר 400 code 111 כבר בכתיבה. המפתח הפנימי נבדק לפי truthiness, כך שגם המחרוזת "false" נקראת כדלוק; כיבוי אמין הוא false בוליאני.
בממשק ה‑CRM אין עמוד Config. עורכים דרך סביבת הפיתוח (סביבת פיתוח ← Databases ← המערכת ← Tables ← Config) או דרך REST עם Master Key, כי הטבלה חסומה לשאר השכבות:
curl -X POST "https://api.mbapps.co.il/parse/classes/Config" \ -H "X-Parse-Application-Id: {appId}" \ -H "X-Parse-Master-Key: {masterKey}" \ -H "Content-Type: application/json" \ -d '{ "Name": "AcceptWebLeads", "Value": { "AcceptWebLeads": true } }'const res = await fetch("https://api.mbapps.co.il/parse/classes/Config", { method: 'POST', headers: { 'X-Parse-Application-Id': appId, 'X-Parse-Master-Key': masterKey, 'Content-Type': 'application/json', }, body: JSON.stringify({ Name: 'AcceptWebLeads', Value: { AcceptWebLeads: true }, }),});import requests
res = requests.post( "https://api.mbapps.co.il/parse/classes/Config", headers={ "X-Parse-Application-Id": appId, "X-Parse-Master-Key": masterKey, "Content-Type": "application/json", }, json={ "Name": "AcceptWebLeads", "Value": {"AcceptWebLeads": True}, },)<?php$ch = curl_init();curl_setopt_array($ch, [ CURLOPT_URL => "https://api.mbapps.co.il/parse/classes/Config", CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "X-Parse-Application-Id: {$appId}", "X-Parse-Master-Key: {$masterKey}", "Content-Type: application/json", ], CURLOPT_POSTFIELDS => json_encode([ "Name" => "AcceptWebLeads", "Value" => ["AcceptWebLeads" => true], ]),]);$response = curl_exec($ch);curl_close($ch);החזיקו שורה אחת בלבד לכל דגל. הקוד לוקח query.first() ללא מיון, והשורה שנוצרה ראשונה מנצחת תמיד: שורה ישנה עם false תשתק שורה חדשה עם true. דגלי Config.
מה עוד יושב בתוך Value
Section titled “מה עוד יושב בתוך Value”ה‑Value הוא גם ההגדרות של נקודת הקצה, לא רק מתג.
| המפתח | מה הוא עושה |
|---|---|
AcceptWebLeads |
המתג עצמו |
ValidatePhoneOrEmail |
מפעיל את בדיקת התקינות. כשהוא דלוק, השרת דוחה ב‑400 בקשה שבה גם הטלפון וגם האימייל אינם תקינים. תקין אחד מהם — הבקשה עוברת. הגבולות: טלפון — מסירים תווים שאינם ספרות ואז 7–14 ספרות; אימייל — 6–80 תווים, מכיל @ וגם . |
DefaultValues.Account |
ערכי ברירת מחדל שהשרת ממלא באיש הקשר שנוצר, כשהבקשה לא שלחה אותם. עובד רק ב‑web2table — ראו האזהרה למטה |
{ "Name": "AcceptWebLeads", "Value": { "AcceptWebLeads": true, "ValidatePhoneOrEmail": true, "DefaultValues": { "Account": { "LeadSourceId": "yOTdl4L99Q" } } }}כללי מיפוי שדות חלים גם על DefaultValues: Pointer כמזהה חשוף בן 10 תווים, בוליאני כמחרוזת.
CAPTCHA ואנטי‑ספאם
Section titled “CAPTCHA ואנטי‑ספאם”נקודת הקצה לא מאמתת reCAPTCHA, Turnstile או מלכודות דבש.
- מלכודת דבש: כמו בקוד למעלה. חינם, ללא חיכוך, מסננת בוטים פשוטים.
- טוקן CAPTCHA אמיתי: אמתו בשרת שלכם ורק אז העבירו ל‑
getlead. ה‑secret לעולם לא בדפדפן. מודל האבטחה.
// Cloudflare Worker / Express — שרת ביניים שמאמת Turnstile ואז מעביר הלאהexport async function onRequestPost({ request, env }) { const body = await request.json();
const verify = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ secret: env.TURNSTILE_SECRET, response: body.token }), }).then((r) => r.json());
if (!verify.success) return new Response('captcha failed', { status: 400 });
delete body.token; return fetch(`https://api.mbapps.co.il/functions/${env.APP_ID}/getlead`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Parse-Application-Id': env.APP_ID }, body: JSON.stringify(body), });}רשימת בדיקה לפני עלייה לאוויר
Section titled “רשימת בדיקה לפני עלייה לאוויר”- סכימת
Accountsנשלפה, וכל שדה בטופס אומת מולה - כל שדה Pointer מופה מטבלת ה‑lookup ונשלח כ‑objectId חשוף
- בוליאנים אמיתיים, תאריכים ISO מרופד, אין שדה File
- ערכים ריקים מוסרים מהגוף
-
AcceptWebLeadsדלוק, שורה אחת בלבד - טיפול השגיאות מסתעף על גוף התשובה
- יש מלכודת דבש או CAPTCHA דרך שרת ביניים
- אירוע המרה נשלח ל‑GTM/Analytics אחרי הצלחה בלבד
- web2table — כשצריך גם רשומה בטבלת יעד
- דגלי Config — ההפעלה, ולמה
… is Disabledהוא כמעט תמיד זה - מיפוי שדות · זיהוי כפילויות · מודל האבטחה
- הטמעה בפועל — WordPress, Wix, HTML ושרת ביניים
- אבחון תקלות בטפסים · שגיאות ופתרון תקלות
- דוגמאות קוד — PHP, Python, Node, C#