דלגו לתוכן

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

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

מגבלות ומכסות

עודכן 30.08.2026

עמוד ייחוס. כל מספר כאן שינה כבר ארכיטקטורה של מישהו.

המגבלה הערך ההשלכה על התכנון
limit ברירת מחדל — REST 100 לא ציינתם limit? קיבלתם 100 ולא את הטבלה
limit מרבי — REST אין תקרה נאכפת על טבלה בת 2,101 שורות: limit=2000 מחזיר 2000, limit=5000 מחזיר 2,101. עמדו בעימוד מרצון
limit ברירת מחדל — MCP Get-Data 5 קל מאוד לטעות בתוצאה חלקית כאילו היא המלאה
limit מרבי — MCP Get-Data 2000, נאכף בסכימת הכלי 2001 נדחה עוד לפני השרת
limit מרבי — MCP Aggregate-Data 2000 ברירת המחדל שם היא “כל השורות”
פעולות ב‑batch יחיד 50 — המלצה, לא אכיפה 1,000 פעולות עוברות בפועל (200, 1,000 איברי success). חתכו בכל זאת: כל פעולה מפעילה טריגרים
עומק שרשרת טריגרים 3 רמות חריגה נרשמת ב‑_syslogTriggers.error כ‑blocked! trigger step is to deep -3. source trigger: <id>
גודל קובץ בהעלאה אין תקרה נאכפת 15MB עולה בהצלחה (201), גם בלי שום אישור מעבר ל‑Application Id. יש לעומת זאת ולידציית סוג קובץ — ראו למטה
אורך objectId 10 תווים — כשהשרת מייצר אותו ערך באורך אחר בשכבת הטפסים נזרק בשקט. אזהרה: עם Master Key אפשר לשלוח objectId משלכם בכל אורך והוא מתקבל — אל תעשו זאת
אורך מזהה עמוד / תפריט / אתר 24 תווים hex מרחב מזהים אחר לגמרי. מזהי טריגרים ופעולות הם דווקא 10 תווים (כמו objectId)
מדיניות סיסמה 8 תווים · אות קטנה · אות גדולה · ספרה נאכף בשרת — {"code":142,…}
Get-all-Users (MCP) 100 ראשונים 106 משתמשים במערכת → הכלי מחזיר 100. לרשימה מלאה — REST על _User
טבלאות עם ציר זמן מהקופסה 11 כל השאר לא מתעד עד שמדליקים
מחלקות במערכת חדשה 111 בהקמה, וגדל מעצמו מחלקות מערכת נרשמות בעצלנות אחרי השימוש הראשון (_RequestLog, _GeneralLogs, _Dictionary, _DynamicQueries…), ופונקציות כמו web2sale מוסיפות עמודות. אל תקודדו רשימות
מגבלות קצב ל‑api.mbapps.co.il לא מתועדות, ולא נצפו אלפי קריאות רצופות בלי 429 ובלי כותרות RateLimit/Retry-After. ראו למטה

שתי מגבלות ה‑limit — הבלבול היקר ביותר

Section titled “שתי מגבלות ה‑limit — הבלבול היקר ביותר”
REST  /parse/classes/…    ──>  default 100  ·  max —  (לא נאכף)
MCP   Get-Data            ──>  default   5  ·  max 2000

אותה טבלה, שתי שכבות, פי 20 הבדל בברירת המחדל.

הכיוון המסוכן יותר הוא MCP: סוכן ששאל “כמה לקוחות מתל אביב” וקיבל 5 שורות עלול לדווח “5”. התשובה האמיתית הייתה 340.

הכלל: ציינו limit תמיד ובמפורש, בכל שכבה. ולספירות — אל תשלפו בכלל:

Bash
curl -sS -G "https://api.mbapps.co.il/parse/classes/Accounts" \
-H "X-Parse-Application-Id: $APP_ID" -H "X-Parse-API-Key: $API_KEY" \
--data-urlencode 'where={"City":"תל אביב"}' \
--data-urlencode 'limit=0' --data-urlencode 'count=1'
JavaScript
const APP_ID = process.env.APP_ID, API_KEY = process.env.API_KEY;
const params = new URLSearchParams({
where: '{"City":"תל אביב"}',
limit: '0',
count: '1',
});
const res = await fetch(`https://api.mbapps.co.il/parse/classes/Accounts?${params}`, {
headers: {
'X-Parse-Application-Id': APP_ID,
'X-Parse-API-Key': API_KEY,
},
});
const data = await res.json();
Python
import os, requests
APP_ID = os.environ["APP_ID"]
API_KEY = os.environ["API_KEY"]
res = requests.get(
"https://api.mbapps.co.il/parse/classes/Accounts",
headers={
"X-Parse-Application-Id": APP_ID,
"X-Parse-API-Key": API_KEY,
},
params={
"where": '{"City":"תל אביב"}',
"limit": "0",
"count": "1",
},
)
data = res.json()
PHP
<?php
$appId = getenv('APP_ID');
$apiKey = getenv('API_KEY');
$query = http_build_query([
'where' => '{"City":"תל אביב"}',
'limit' => '0',
'count' => '1',
]);
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://api.mbapps.co.il/parse/classes/Accounts?$query",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Parse-Application-Id: $appId",
"X-Parse-API-Key: $apiKey",
],
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);

batch — 50 היא המלצה, לא תקרה

Section titled “batch — 50 היא המלצה, לא תקרה”

המוצר מתעד 50 פעולות לבקשה (ברירת המחדל הגנרית של Parse היא 20), אבל השרת אינו אוכף שום מספר: בפועל עוברות בקשות של 60, 200, 500 ו‑1,000 פעולות, כולן 200 עם מערך תשובות מלא.

חתכו בכל זאת — לא בגלל שגיאה שתחזור, אלא כי כל פעולה מפעילה טריגרים ובקשה ארוכה שנופלת באמצע משאירה אתכם בלי מושג מה נכתב. ובדיקת כל איבר בתשובה בנפרד היא חובה בכל מקרה. פירוט: batch.

כתיבה מפעילה טריגר, שכותב, שמפעיל טריגר… ונעצר בעומק 3.

מה שעוזר:

הכלי ההגבלה
כיבוי זמני בממשק דורש תיאום; אל תשכחו להדליק בחזרה
POST /parse/batch אין דגל השתקה כללskipTriggers: true ברמת הבקשה מתעלמים ממנו, והשרשרת רצה
Create-Many של MCP עם skipTriggers: true עובד באימות Master Key: הרשומה נוצרת ואף טריגר לא רץ. בגרסאות שרת ישנות הכלי דרש מפתח מדומה "fieldName": null בכל אובייקט — ראו כלי נתונים
skipTimeline: true באותו כלי אותו מעקף; פער ביקורת מכוון — השורה לא תופיע ב‑_Timeline

מזהים — שני מרחבים שאינם מתערבבים

Section titled “מזהים — שני מרחבים שאינם מתערבבים”
מה הפורמט דוגמה
רשומת נתונים (objectId) 10 תווים אלפאנומריים xK9mP2qRsT
הגדרת טריגר · פעולת טריגר (triggerId / actionId) 10 תווים — אותו פורמט כמו objectId, מרחב אחר Cs8PxstHJO
עמוד · פריט תפריט · אתר (siteId) 24 תווים hex (MongoDB) 6a8a95b93cd0a41edaebef84

הזנת מזהה ממרחב אחד לממשק שמצפה לשני נכשלת, או — גרוע יותר — מתקבלת ולא עושה כלום. בשכבת הטפסים: ערך Pointer שאינו באורך 10 נזרק בשקט, והתשובה עדיין 200.

גדלים טיפוסיים של סכימה

Section titled “גדלים טיפוסיים של סכימה”
הסביבה טבלאות שדות
מערכת חדשה ונקייה (ברגע ההקמה) 111 Sales: 25 · Accounts: 39 · Cases: 25
אותה מערכת אחרי יום אחד של שימוש ב‑API ובטפסים 115 מחלקות מערכת (+ טבלאות שנוצרו תוך כדי שימוש) Sales: 31 · Accounts: 39 · Cases: 29 — web2sale/web2case הוסיפו בעצמן IsFirst, AccountNotExist, CampaignName, PageName, PhoneNumber, Email
סביבת ייחוס מותאמת ~196 ~2,592 · Sales: 133
המגבלה הערך
גודל מרבי אין תקרה נאכפת — 11MB ו‑15MB נשמרים
סוג הקובץ יש ולידציה: תוכן שאינו תואם לסיומת, או סוג שאינו נתמך, מוחזר ב‑403 {"error":"Invalid file type"}
אימות להעלאה אינו נדרשX-Parse-Application-Id בלבד מספיק
מחיקת קובץ עובדת: DELETE /parse/files/<name> עם Master Key או API Key. אנונימי — 403 unauthorized: master key is required. אין כלי מחיקה ב‑MCP (67 כלים, אף אחד מהם אינו מוחק קבצים או רשומות)
מכסת אחסון לכל מערכת קיימת (מוצגת בסביבת הפיתוח), עם דגל outOfStorage. הקריאה והשינוי הם פעולות תפעוליות מצד הספק ואינן חשופות ב‑API
קבצים ב‑getlead / web2table לא נתמכים

פירוט: קבצים.

חתכו והאטו מרצון. דפוס שעובד:

Python
import time, random, requests
def call_with_backoff(fn, attempts: int = 5):
"""מריץ קריאת HTTP עם נסיגה אקספוננציאלית על 429 / 5xx."""
delay = 0.5
for attempt in range(attempts):
r = fn()
if r.status_code < 500 and r.status_code != 429:
return r
if attempt == attempts - 1:
r.raise_for_status()
time.sleep(delay + random.random() * 0.3) # jitter
delay *= 2
return r
def load_in_chunks(rows, chunk=50, pause=0.3):
"""טעינה המונית: חיתוך ל-50, השהיה בין קבוצות, בדיקת כל איבר."""
for i in range(0, len(rows), chunk):
group = rows[i:i + chunk]
ops = [{"method": "POST", "path": "/parse/classes/Accounts", "body": r} for r in group]
res = call_with_backoff(
lambda: requests.post(f"{API}/batch", headers=H, json={"requests": ops}, timeout=60)
)
for item in res.json():
if "error" in item:
yield item["error"] # אל תבלעו כישלון פרטני
time.sleep(pause)

מגבלות תוכן שאינן מספריות

Section titled “מגבלות תוכן שאינן מספריות”
המגבלה ההשלכה
טיפוס שדה ננעל אחרי הערך הראשון תכננו שם וטיפוס לפני היצירה — אין תיקון. שדה String ממיר מספר בשקט במקום להיכשל
אין שינוי שם שדה “תיקון” = שדה חדש + מיגרציה + עדכון כל עמוד וטריגר
אין אכיפת ייחודיות על PhoneNumber / Email חיפוש‑לפני‑יצירה הוא באחריותכם
טבלה חדשה נולדת חסרת הרשאות “השדות ריקים” — התקלה מספר 1 אחרי הקמה
אין כלי מחיקת רשומה ב‑MCP מחיקה = REST/Master Key או ממשק
אין אגרגציה ב‑/parse/aggregate/ הנתיב מחזיר 404; השתמשו ב‑/parse/classes-aggregate/
טבלת Config — הייתה חסומה מ‑MCP בגרסאות שרת ישנות בגרסאות שרת ישנות, דגל טופס כבוי (400 … is Disabled) אינו ניתן לאבחון דרך MCP; בעדכון שרת עדכני כלי הנתונים קוראים וכותבים את הטבלה בחיבור Master Key. ב‑REST היא נגישה גם עם API Key וגם עם Session Token של ה‑owner
_Timeline אינה מוגנת מפני Master Key היומן אינו ראיה מול מי שמחזיק את המפתח. _syslogTriggers — הוספה כן, מחיקה לא
_RequestLog רושם כתיבות בלבד GET אינו נרשם; במערכת חדשה המחלקה עלולה לא להיראות ב‑REST עד רישום הסכימה. משתמש שנרשם בו אינו ניתן למחיקה
משתמש אינו יכול לעדכן את עצמו מסך “הפרופיל שלי” דורש שרת ביניים
אין סביבת staging כל כתיבה היא בייצור
אין כלי חוצה‑מערכות חיבור אחד = מערכת אחת

לפני שאתם כותבים קוד לטעינה גדולה:

  1. כמה רשומות? ספרו קודם (limit=0&count=1).
  2. באיזו שכבה אני? REST (ברירת מחדל 100) או MCP (5, מקסימום 2000). ציינו limit במפורש בשתיהן.
  3. batch? חתכו ל‑50 ובדקו כל איבר — האכיפה עליכם, לא על השרת.
  4. מי מחזיק את הטריגרים של הטבלה? שאלו לפני, לא אחרי.
  5. צריך השתקה? Create-Many ב‑MCP עם skipTriggers: true (Master Key), או תיאום / כיבוי זמני בממשק. ב‑batch אין השתקה.
  6. קצב — הוסיפו השהיה ונסיגה אקספוננציאלית, גם בלי מגבלה מתועדת.
  7. חוזרים? שמרו סמן createdAt כדי שהריצה הבאה תמשיך ולא תתחיל.