דלגו לתוכן

או התחילו מנקודה בטוחה: אינדקס הכלים המלא · מפת הטבלאות המרכזיות

מערכת חדשה — 14 יום חינם

getlead — לכידת ליד מהאתר

עודכן 10.10.2026
POST https://api.mbapps.co.il/functions/{appId}/getlead

יוצר שורה חדשה ב‑Accounts עם IsAccount: false, כלומר ליד. לטופס שלוכד איש קשר בלבד. צריך גם רשומה מקושרת: web2table, טבלת ההחלטה.

אין Master Key, אין סשן ואין SDK: הכותרת היחידה היא ה‑Application Id, מזהה ציבורי. השערים הם דגל ההפעלה בצד השרת והוולידציה שהפונקציה מבצעת, לא סודיות המזהה.

Bash
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": "תל אביב" }'
JavaScript
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: 'תל אביב',
}),
});
Python
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
<?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, וכל שדה מותאם. מיפוי שדות.

סטטוס הגוף המשמעות
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 שדות מערכת
  1. הטלפון מנורמל: מסירים תווים שאינם ספרות, ו‑972… הופך ל‑0….
  2. השרת מריץ שאילתה על Accounts.PhoneNumber מול כל הווריאציות: 05XXXXXXXX, 9725XXXXXXX, +9725XXXXXXX, 05X-XXXXXXX, +972-5X-XXXXXXX ומקבילותיהן לקווי נייח, ב‑OR עם Accounts.Email == <האימייל>.
  3. כפילות לא חוסמת יצירה. תמיד נוצרת שורה חדשה:
    • נמצאה התאמה → הליד החדש מקבל את סטטוס “ליד כפול”, ברירת המחדל בתבנית 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), אבל איש הקשר כבר נוצר.

<select> שולח טקסט, ה‑API רוצה objectId. שלפו פעם אחת את טבלת ה‑lookup והטמיעו מפה סטטית:

JavaScript
// נשלף פעם אחת מטבלת LeadSource — עדכנו כשמוסיפים מקור חדש
const SOURCE_MAP = {
'פייסבוק': 'vOZLqOWnQf',
'גוגל': 'fHG8Rgy8Hr',
'אתר אינטרנט': 'yOTdl4L99Q',
};

ערך שנבחר ואינו במפה: השמיטו את השדה מהגוף. לא undefined, לא מחרוזת ריקה.

קוד מוכן — טופס בדף נחיתה

Section titled “קוד מוכן — טופס בדף נחיתה”
HTML
<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, כי הטבלה חסומה לשאר השכבות:

Bash
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 } }'
JavaScript
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 },
}),
});
Python
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
<?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 הוא גם ההגדרות של נקודת הקצה, לא רק מתג.

המפתח מה הוא עושה
AcceptWebLeads המתג עצמו
ValidatePhoneOrEmail מפעיל את בדיקת התקינות. כשהוא דלוק, השרת דוחה ב‑400 בקשה שבה גם הטלפון וגם האימייל אינם תקינים. תקין אחד מהם — הבקשה עוברת. הגבולות: טלפון — מסירים תווים שאינם ספרות ואז 7–14 ספרות; אימייל — 6–80 תווים, מכיל @ וגם .
DefaultValues.Account ערכי ברירת מחדל שהשרת ממלא באיש הקשר שנוצר, כשהבקשה לא שלחה אותם. עובד רק ב‑web2table — ראו האזהרה למטה
JSON
{
"Name": "AcceptWebLeads",
"Value": {
"AcceptWebLeads": true,
"ValidatePhoneOrEmail": true,
"DefaultValues": { "Account": { "LeadSourceId": "yOTdl4L99Q" } }
}
}

כללי מיפוי שדות חלים גם על DefaultValues: Pointer כמזהה חשוף בן 10 תווים, בוליאני כמחרוזת.

נקודת הקצה לא מאמתת reCAPTCHA, Turnstile או מלכודות דבש.

  • מלכודת דבש: כמו בקוד למעלה. חינם, ללא חיכוך, מסננת בוטים פשוטים.
  • טוקן CAPTCHA אמיתי: אמתו בשרת שלכם ורק אז העבירו ל‑getlead. ה‑secret לעולם לא בדפדפן. מודל האבטחה.
JavaScript
// 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 אחרי הצלחה בלבד