מגבלות ומכסות
עמוד ייחוס. כל מספר כאן שינה כבר ארכיטקטורה של מישהו.
הטבלה המרכזית
Section titled “הטבלה המרכזית”| המגבלה | הערך | ההשלכה על התכנון |
|---|---|---|
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 משלכם בכל אורך והוא מתקבל (api-a-01) — אל תעשו זאת |
| אורך מזהה עמוד / תפריט / אתר | 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 — הבלבול היקר ביותר”MCP Get-Data ──> default 5 · max 2000
אותה טבלה, שתי שכבות, פי 20 הבדל בברירת המחדל.
הכיוון המסוכן יותר הוא MCP: סוכן ששאל “כמה לקוחות מתל אביב” וקיבל 5 שורות עלול לדווח “5”. התשובה האמיתית הייתה 340.
הכלל: ציינו limit תמיד ובמפורש, בכל שכבה. ולספירות — אל תשלפו בכלל:
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'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();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$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 · דוח core-api-03.
שרשרת טריגרים — 3 רמות
Section titled “שרשרת טריגרים — 3 רמות”כתיבה מפעילה טריגר, שכותב, שמפעיל טריגר… ונעצר בעומק 3.
מה שעוזר:
| הכלי | ההגבלה |
|---|---|
| כיבוי זמני בממשק | דורש תיאום; אל תשכחו להדליק בחזרה |
POST /parse/batch |
אין דגל השתקה כלל — skipTriggers: true ברמת הבקשה מתעלמים ממנו (אומת: השרשרת רצה) |
Create-Many של MCP עם skipTriggers: true |
✔ עובד באימות Master Key — אומת על שרשרת טריגרים: הרשומה נוצרה ואף טריגר לא רץ. (עד 23.08.2026 הכלי דרש מפתח מדומה "fieldName": null בכל אובייקט — mcp-data-01, נסגר בשרת; ראו כלי נתונים) |
skipTimeline: true באותו כלי |
אותו מעקף; פער ביקורת מכוון — השורה לא תופיע ב‑_Timeline |
מזהים — שני מרחבים שאינם מתערבבים
Section titled “מזהים — שני מרחבים שאינם מתערבבים”| מה | הפורמט | דוגמה |
|---|---|---|
רשומת נתונים (objectId) |
10 תווים אלפאנומריים | xK9mP2qRsT |
הגדרת טריגר · פעולת טריגר (triggerId / actionId) |
10 תווים — אותו פורמט כמו objectId, מרחב אחר | Cs8PxstHJO |
עמוד · פריט תפריט · אתר (siteId) |
24 תווים hex (MongoDB) | 6a8a95b93cd0a41edaebef84 |
הזנת מזהה ממרחב אחד לממשק שמצפה לשני נכשלת, או — גרוע יותר — מתקבלת ולא עושה כלום.
בשכבת הטפסים: ערך Pointer שאינו באורך 10 נזרק בשקט, והתשובה עדיין 200 (start-b-01).
גדלים טיפוסיים של סכימה
Section titled “גדלים טיפוסיים של סכימה”| הסביבה | טבלאות | שדות |
|---|---|---|
| מערכת חדשה ונקייה (נמדד 2026‑08, ברגע ההקמה) | 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 בלבד מספיק (core-api-05) |
| מחיקת קובץ | ✔ עובדת: DELETE /parse/files/<name> עם Master Key או API Key. אנונימי — 403 unauthorized: master key is required. אין כלי מחיקה ב‑MCP (67 כלים, אף אחד מהם אינו מוחק קבצים או רשומות) |
| מכסת אחסון לכל מערכת | קיימת (מוצגת בסביבת הפיתוח), עם דגל outOfStorage. הקריאה והשינוי הם פעולות תפעוליות מצד הספק ואינן חשופות ב‑API |
קבצים ב‑getlead / web2table |
לא נתמכים |
פירוט: קבצים.
מגבלות קצב
Section titled “מגבלות קצב”חתכו והאטו מרצון. דפוס שעובד:
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 ממיר מספר בשקט במקום להיכשל (core-api-12) |
| אין שינוי שם שדה | “תיקון” = שדה חדש + מיגרציה + עדכון כל עמוד וטריגר |
אין אכיפת ייחודיות על PhoneNumber / Email |
חיפוש‑לפני‑יצירה הוא באחריותכם |
| טבלה חדשה נולדת חסרת הרשאות | “השדות ריקים” — התקלה מספר 1 אחרי הקמה |
| אין כלי מחיקת רשומה ב‑MCP | מחיקה = REST/Master Key או ממשק |
אין אגרגציה ב‑/parse/aggregate/ |
הנתיב מחזיר 404; השתמשו ב‑/parse/classes-aggregate/ (core-api-01) |
טבלת Config — הייתה חסומה מ‑MCP עד 25.08.2026 |
בשרת מלפני 25.08.2026, דגל טופס כבוי (400 … is Disabled) אינו ניתן לאבחון דרך MCP; מאז 25.08.2026 כלי הנתונים קוראים וכותבים את הטבלה בחיבור Master Key (אומת 2026-08-25). ב‑REST היא נגישה גם עם API Key וגם עם Session Token של ה‑owner |
_Timeline אינה מוגנת מפני Master Key |
היומן אינו ראיה מול מי שמחזיק את המפתח (core-api-08). _syslogTriggers — הוספה כן, מחיקה לא (api-c-05) |
_RequestLog רושם כתיבות בלבד |
GET אינו נרשם; במערכת חדשה המחלקה עלולה לא להיראות ב‑REST עד רישום הסכימה (api-c-01). משתמש שנרשם בו אינו ניתן למחיקה (api-c-02) |
| משתמש אינו יכול לעדכן את עצמו | מסך “הפרופיל שלי” דורש שרת ביניים (core-api-10) |
| אין סביבת staging | כל כתיבה היא בייצור |
| אין כלי חוצה‑מערכות | חיבור אחד = מערכת אחת |
צ’קליסט תכנון
Section titled “צ’קליסט תכנון”לפני שאתם כותבים קוד לטעינה גדולה:
- כמה רשומות? ספרו קודם (
limit=0&count=1). - באיזו שכבה אני? REST (ברירת מחדל 100) או MCP (5, מקסימום 2000). ציינו
limitבמפורש בשתיהן. batch? חתכו ל‑50 ובדקו כל איבר — האכיפה עליכם, לא על השרת.- מי מחזיק את הטריגרים של הטבלה? שאלו לפני, לא אחרי.
- צריך השתקה?
Create-Manyב‑MCP עםskipTriggers: true(Master Key), או תיאום / כיבוי זמני בממשק. ב‑batchאין השתקה. - קצב — הוסיפו השהיה ונסיגה אקספוננציאלית, גם בלי מגבלה מתועדת.
- חוזרים? שמרו סמן
createdAtכדי שהריצה הבאה תמשיך ולא תתחיל.
המשך מכאן
Section titled “המשך מכאן”- שאילתות — עימוד שעומד בטבלה שמשתנה
- batch — גודל האצווה והתשובה שחייבים לקרוא
- קבצים — סוגי קבצים, מחיקה ומה שאין
- יומנים וראיות — מה מתועד ומה לא
- שגיאות ופתרון תקלות