Skip to main content
מדריך זה הוא דוגמה מקצה לקצה לקריאת /v1 אל תוך Power BI. הוא מכסה את תבנית הקישוריות של Power Query (M), מודל סמנטי בסכמת כוכב (star-schema) שנבנה על /v1/activities, רענון מצטבר, ואת המקרים שבהם יש להשתמש במערכי הנתונים reporting בגרסת התצוגה המקדימה עבור תוצאות פישינג ברמת אדם. הדוגמאות משתמשות במארח הייצור של ארה”ב (https://api.us-east-1.livingsecurity.ai/v1). עבור ארגון באיחוד האירופי, השתמשו ב- https://api.eu-west-1.livingsecurity.ai/v1 הן ב-Fn_FetchAll והן ב- Fn_GetJson, ולאחר מכן קשרו את פרטי הזיהוי של מקור הנתונים למארח זה. ראו אזורים. מדריך זה משתמש בפרטי זיהוי Basic שמורים עם מפתח API. אין צורך בלקוח OAuth. ראו אימות לבחירת פרטי הזיהוי, ו-Developer Hub לגישה והגדרה.

למה מיועדת דוגמה זו

השתמשו בה כאשר אתם צריכים:
  • לטעון נקודות קצה מסוג רשימה של /v1 אל מערך נתונים של Power BI עם עימוד מבוסס סמן (cursor) תקין וניסיון חוזר במקרה של הגבלת קצב.
  • לבנות מודל סמנטי שבו המדדים (“ישויות פעילות”, “פעילויות לכל ישות פעילה”) הם ממדיים ולא נספרים מתוך טבלה שטוחה.
  • להפחית רענון מתוזמן של Power BI מסריקה מלאה של ההיסטוריה לחלון יומי קטן באמצעות רענון מצטבר.
  • לבחור את רמת הפירוט הנכונה עבור פישינג: סיכומי קמפיין (תפעולי) לעומת תוצאות ברמת אדם ואירועים מוטיפוסים (reporting בגרסת תצוגה מקדימה).

דרישות מוקדמות

  • מפתח API עם ההרשאות הנדרשות לשאילתות שלכם:
    • דוגמה תפעולית: activity:read, entity:read ו- simulation:read.
    • פישינג ברמת אדם באמצעות מערכי נתונים לדיווח: reporting:read. ראו מפתחות API.
  • Power BI Desktop, או סביבת עבודה של Power BI / Fabric שבה ניתן ליצור מודל סמנטי ולתזמן רענון.

בחירת רמת הפירוט המתאימה

/v1 חושף שני משטחים קשורים עבור פישינג. הם אינם ניתנים להחלפה. שאילתות הדוגמה של Power BI שלהלן קוראות לנתיבים התפעוליים (/v1/simulations, /v1/simulations/{id}/results, /v1/activities, /v1/entities). עבור דיווח פישינג ברמת אדם, מומלץ להעדיף את משפחת ה-reporting בגרסת התצוגה המקדימה שלהלן. מפתח שהוענקה לו רק ההרשאה reporting:read אינו יכול לקרוא ל-/v1/simulation_results התפעולי (ה-API מחזיר 403).

סולם קושי

קושי הסימולציה הוא מספר שלם בין 1 ל-5 בשדה /v1/simulations (difficulty_level), /v1/simulation_results (difficulty_level), במאפייני /v1/activities (difficulty_tier), וב-/v1/reporting/simulation_events (difficulty_tier). 1 הוא הקל ביותר ו-5 הוא הקשה ביותר. לסימולציות אדפטיביות ופרוגרסיביות אין ערך יחיד ברמת הקמפיין, ולכן /v1/simulations.difficulty_level הוא null בעוד ש-difficulty_level לכל נמען בתוצאות עדיין יכול להיות מוגדר. כדי למפות לייצואים ישנים של נמוך/בינוני/גבוה, התייחסו ל-1–2 כנמוך, ל-3 כבינוני ול-4–5 כגבוה.
אל תבנו אינטגרציות BI חדשות על קריאות רשת לא מתועדות של לוח מחוונים או על סקירת ה-Public API הישנה והמובחרת של /api/v1. בצעו אימות מול מארח /v1 האזורי של הארגון באמצעות מפתח API של Developer Hub. ראו אזורים.

תבנית קישוריות (Power Query)

ארבעה כללים עומדים בבסיס כל שאילתה בדוגמה. כל אחד מהם נאכף על ידי שירות Power BI ואינו עניין של העדפה סגנונית.
העבירו כל דבר דינמי ב-RelativePath וב-Query. הארגומנט הראשון של Web.Contents חייב להיות מחרוזת מילולית שמסתיימת בשורש /v1 האזורי של הארגון:
  • ארה”ב: https://api.us-east-1.livingsecurity.ai/v1
  • האיחוד האירופי: https://api.eu-west-1.livingsecurity.ai/v1
הקוראים מעבירים לאחר מכן את המשאב בלבד ("simulations", ולא "v1/simulations"). אל תדביקו מארח של ארה”ב עבור ארגון באיחוד האירופי.אם הארגומנט הראשון נבנה באמצעות שרשור מחרוזות, שירות Power BI אינו יכול לזהות סטטית את מקור הנתונים והרענון המתוזמן נכשל עם שגיאת “dynamic data source”, אף על פי שהשאילתה פועלת ב-Power BI Desktop.
כאשר Power BI מבקש פרטי זיהוי עבור מקור הנתונים /v1, בחרו Basic והדביקו את מפתח ה-API כ-שם משתמש. הזינו מציין מקום כגון x בשדה סיסמא. שירות Power BI דוחה סיסמא ריקה אף על פי שה-API מתעלם משדה זה. גם מפתח כסיסמא עם שם משתמש כמציין מקום פועל.אל תוסיפו כותרת Authorization ב-M. היא פועלת בשולחן העבודה שלכם, אך משבצת את המפתח בקובץ השאילתה ומתנגשת עם רענון מתוזמן.
GET /v1 מחייב אימות: הוא מחזיר 200 עם מפתח תקף ו-401 ללא מפתח. כוונו את מקור הנתונים אל …/v1 ואל תדלגו על הבדיקה — מפתח תקין נשמר, ומפתח שבוטל או פגום נכשל מיד.דוגמאות ישנות יותר השתמשו במארח החשוף כמקור הנתונים והורו לדלג על הבדיקה משום ש-GET / הוא תמיד 404. כוונו מחדש את המודלים הללו אל …/v1.
גודל העמוד ברירת המחדל בכל נקודת קצה מסוג רשימה של /v1 הוא 25. השארתו כברירת מחדל מכפילה את מספר הבקשות עבור אותם נתונים. ערכי שאילתה חייבים להיות טקסט — limit = "500" ב-M, ולא limit = 500.

פונקציית עימוד משותפת

כל שאילתה בדוגמה קוראת ל-Fn_FetchAll יחידה שעוברת על next_page_token עד שהוא null (ראו עימוד). המאפיינים הבולטים שלה:
  • כתובת בסיס /v1 סטטית, ‏RelativePath ו-Query דינמיים. נדרש לרענון מתוזמן ולבדיקת פרטי הזיהוי.
  • ‏ManualStatusHandling = {429} עם ניסיון חוזר מוגבל. הפונקציה קוראת את Retry-After כאשר Power Query חושף אותו, אחרת ממתינה 30 שניות, ומוותרת לאחר 5 תגובות 429 רצופות עם שגיאה מפורשת במקום להמשיך בלולאה עד שהרענון נכשל בשל חריגה מזמן. על 5xx אין ניסיון חוזר במכוון — שגיאת שרת צריכה לצוף ולא לייצר בשקט מערך נתונים חלקי.
  • ‏Timeout של 60 שניות. עמודים בדרך כלל מגיבים בפחות משנייה, ולכן דקה של שתיקה פירושה שהבקשה מתה.
  • ‏Binary.Buffer לפני Json.Document. ללא חציצה (buffering), מנוע ה-mashup עשוי לבקש מחדש את זרם התגובה אם הוא קורא אותו יותר מפעם אחת.
  • ‏baseQuery מועבר ללא שינוי בכל איטרציה. אסימוני עמוד הם סמנים אטומים וחתומים הקשורים לארגון, לפרטי הזיהוי, לגרסת החוזה ולטביעת האצבע של המסננים והמיון. שינוי מסנן באמצע הסריקה נדחה כאסימון לא תקין ואינו מתחיל מחדש מהעמוד הראשון.
Fn_FetchAll.pq — base and call shape

שאילתות מוטיפוסות לכל נקודת קצה

כל צרכן של Fn_FetchAll פועל באותה תבנית: קריאה לנקודת הקצה, הקרנה של רשימת עמודות קבועה, הסרת המבחין object, והגדרת סוג חותמות הזמן כ-datetimezone כדי שמדדי תאריך לא יוסטו בשקט לפי אזור הזמן של קיבולת הרענון.
רשימת עמודות מפורשת ב-Table.FromRecords שומרת על יציבות הסכמה כאשר נקודת קצה מחזירה אפס שורות. ‏Table.FromRecords({}) חשוף מניב טבלה ללא עמודות וכל שלב מאוחר יותר נכשל בשל שדות חסרים.

Excel

אותו Power Query (M) פועל ב-Get & Transform של Excel — זהו אותו מנוע כמו ב-Power BI Desktop. השתמשו בכך כשאתם רוצים טבלת גיליון במקום מודל סמנטי. ב-Excel ל-Windows (‏Microsoft 365, ‏Excel 2024, 2021, 2019 או 2016):
  1. Data → Get Data → From Other Sources → Blank Query.
  2. ב-Power Query Editor, בית → עורך מתקדם. הדביקו תחילה את Fn_FetchAll, ולאחר מכן שנו את שם השאילתה ל-Fn_FetchAll (Query Settings → Name, או לחיצה ימנית בחלונית Queries → Rename).
  3. חזרו על הפעולה עבור Fn_GetJson, ולאחר מכן עבור כל שאילתת דוח.
  4. בית → Close & Load → Close & Load To… פותח את תיבת הדו-שיח Import Data. בחרו Only Create Connection עבור Fn_FetchAll ו- Fn_GetJson (אלו פונקציות, לא טבלאות). בחרו Table עבור כל שאילתת דוח שברצונכם להציג בגיליון.
  5. ברענון הראשון, בחרו Basic: מפתח ה-API כ-User name, מציין מקום כגון x כ-סיסמא. Excel שומר פרטי זיהוי אחד לכל כתובת מקור נתונים; שאילתות מאוחרות יותר שפונות לאותו מארח /v1 ישתמשו בהם.
Close & Load To… עשוי להיות מושבת בפעם הראשונה שבה יוצרים שאילתה בחוברת עבודה. השתמשו ב-Close & Load, ולאחר מכן ב-Excel בחרו Data → Queries & Connections, לחצו לחיצה ימנית על השאילתה ובחרו Load To. נתיב זה מתועד על ידי Microsoft עבור מקרה זה.
לא ניתן לשלוח Living-Security-Version מתוך Power Query על מקור מאומת — אותה מגבלה כמו ב-Power BI. נעצו את חשבון השירות או העבירו את api_version ברשומת השאילתה. ראו גרסאות חוזה ופרטי זיהוי שמורים. שאילתות דוח מוכנות (מיפויי עמודות וסטיות מייצוא של ספק קודם):

עמידה בדרישות ברמת אדם

רישומי הדרכה ברמת פירוט של אדם × הקצאה.

יומן פישינג בדואר אלקטרוני

אינטראקציות פישינג ברמת אירוע, 12 החודשים האחרונים.

המשתמשים הפגיעים ביותר

סיכום ל-12 חודשים ברמת אדם של לחיצות, פרטי זיהוי ודיווחים.

מערכי נתונים לדיווח בגרסת תצוגה מקדימה (פישינג ברמת אדם)

משפחת מערכי הנתונים לדיווח בגרסת תצוגה מקדימה מספקת מערכי נתונים עבור פישינג ברמת אדם. היא דורשת ‏reporting:read וגישה לדיווח עבור הארגון שלכם. השתמשו בקטלוג מערכי הנתונים שלהלן כדי לבחון את הסכמות ואת מדיניות הנתונים שלהם. גילוי הקטלוג החי:
כל מערך נתונים מצהיר על רמת פירוט, מפתח ראשי, צירופים, סימן מים, מדיניות תיקון ומדיניות מחיקה.

simulation_results

  • נתיב: GET /v1/reporting/simulation_results
  • רמת פירוט: ישות × סימולציה
  • מסנני: ‏simulation, ‏entity, ‏updated_after, בנוסף ל-limit / page_token
  • אובייקט wire: ‏reporting.simulation_result
  • מפתחות צירוף: ‏entity_id, ‏simulation_id
ReportingSimulationResults.pq (sketch)
השתמשו ב-updated_after כסימן המים התחתון הכולל בעת רענון מחיצות אחרונות. ממדי תוצאה הניתנים לשינוי נכתבים מחדש במקום תחת אותו id.

simulation_events

  • נתיב: GET /v1/reporting/simulation_events
  • רמת פירוט: עובדה מוטיפוסת אחת לכל אינטראקציה שנצפתה
  • מסנני: ‏simulation, ‏entity, ‏event_type, ‏occurred_after, בנוסף ל- limit / page_token
  • אובייקט wire: ‏reporting.simulation_event
  • סוגי אירועים: אסימונים ציבוריים סגורים כגון simulation.delivered, ‏simulation.opened, ‏simulation.link_clicked, ‏simulation.credentials_submitted, ‏simulation.reported — ולא סוגי פעילות גולמיים של ClickHouse ‏phishing.simulation.*
  • מכשיר: ‏device_type הוא הסיווג הנגזר (האסימונים שנצפו כוללים desktop, mobile, tablet, unknown). ‏user_agent גולמי אינו קיים ב- /v1. כתובת IP גולמית אינה קיימת לעולם ב-/v1 (אינה נשמרת לעולם; רק ip_hash מומלח).
ReportingSimulationEvents.pq (sketch)
השתמשו ב-occurred_after לטעינות אירועים מצטברות. העובדות הן לצירוף בלבד (append-only); הגעות מאוחרות הן שורות חדשות.

entities

  • נתיב: GET /v1/reporting/entities
  • רמת פירוט: שורה נוכחית אחת לכל ישות
  • מסנני: ‏type, ‏updated_after, בנוסף ל-limit / page_token
  • אובייקט wire: ‏reporting.entity
  • מפתח צירוף: ‏id / entity_id (אותו ערך)
צרפו עובדות פישינג לאנשים באמצעות reporting.simulation_results.entity_id = reporting.entities.id. ‏GET /v1/entities התפעולי נשאר ב-entity:read והוא הרשאה שונה.
ReportingEntities.pq

entity_versions ו-cohort_memberships

שני מערכי נתונים אלה כוללים חריג בשם, של נוכחי בלבד:
אין טבלת היסטוריית גרסאות או חברויות סמכותית. מערך נתונים זה מקרין את השורה הנוכחית כמרווח פתוח אחד (valid_to הוא null, ‏is_current הוא true). ‏valid_from הוא created_at ואם לא קיים אז updated_at עבור גרסאות ישות, וזמן התצפית של הבקשה עבור חברויות בקבוצות. מרווחים היסטוריים סגורים אינם מפוברקים.
  • entity_versions: ‏GET /v1/reporting/entity_versions. אותם מסננים כמו ב- entities. ‏valid_from הוא created_at ואם לא קיים אז updated_at. ישות ששתי חותמות הזמן שלה null מושמטת.
  • cohort_memberships: ‏GET /v1/reporting/cohort_memberships. מסננים: cohort, entity, updated_after. ‏updated_at הוא העדכון האחרון של הקבוצה כדי שהרענון המצטבר יישאר מהימן. ‏valid_from הוא זמן התצפית של הבקשה. צרפו את entity_id אל reporting.entities.id.
ReportingEntityVersions.pq
ReportingCohortMemberships.pq

מודל סמנטי בסכמת כוכב על /v1/activities

‏/v1/activities הוא זרם האירועים המתוזמן של הארגון. אין בו מדדים מספריים — כל כמות בדוח היא ספירת שורות — ולכן סכמת כוכב מתאימה לו באופן טבעי.
  • ‏Activities היא טבלת העובדות של האירוע ברמת הפירוט האמיתית. שורה אחת לכל פעילות. המשתתפים מוסרים ממנה ונבנים מחדש כטבלה נפרדת.
  • ‏ActivityParticipants קיימת משום שהמשתתפים הם באמת אחד-לרבים, עם תפקידים כגון actor ו-target. שיטוח אל Activities היה משכפל שורות פעילות (ומנפח כל ספירה) או מאבד משתתפים נוספים. הקשר אל Activities הוא הקשר הדו-כיווני היחיד במודל, ולכן חותך (slicer) של ישות מגיע לטבלת העובדות.
  • ‏Entities הוא הממד שנותן שמות למשתתפים. שורות משתתפים בפעילות נושאות entity_id ותפקיד אך לא שם תצוגה.
  • ‏Dates נוצר ב-M (אפס קריאות API) ומסומן כטבלת התאריכים של המודל. זה מה שהופך את מודיעין הזמן של DAX (DATESINPERIOD, DATEADD) לחוקי. עמודות שמות חודשים וימי שבוע מצהירות על sortByColumn בעמודות המספריות התאומות שלהן כדי שהוויזואליזציות לא ימיינו חודשים לפי סדר אלפביתי.
כל המדדים מפורשים (המודל מגדיר discourageImplicitMeasures): סך הפעילויות, ישויות פעילות, פעילויות לכל ישות פעילה, ימים עם פעילות, וממוצע יומי נגרר של 7 ימים.

מבנה טבלת הגשר

‏ActivityParticipants עוברת על /v1/activities ומפרקת את מערך participants לשורה אחת לכל משתתף:
ActivityParticipants.pq
‏ActivityParticipants עוברת על /v1/activities באופן בלתי תלוי במקום להפנות לשאילתה Activities. ב-Power BI, שתי שאילתות שנטענות כשתי טבלאות שולפות כל אחת בנפרד בזמן הרענון. שמירתן כבלתי תלויות מאפשרת לשירות לרענן את המחיצות של שתי הטבלאות במקביל.

רענון מצטבר

שתי טבלאות רמת העובדות (Activities ו-ActivityParticipants) מצהירות על מדיניות רענון מצטבר של Power BI: שמירת 5 שנים של מחיצות שנתיות, וייבוא מחדש של 14 הימים האחרונים בכל רענון. המנגנון הוא זוג פרמטרים מסוג DateTime, ‏RangeStart ו-RangeEnd, ששירות Power BI קושר מחדש לכל מחיצה בזמן הרענון. כל שאילתת עובדות משלבת את הפרמטרים הללו במסנני start_date ו-end_date של ה-API, כך שנפח הבקשות ברמת המחיצה פרופורציוני למחיצה ולא להיסטוריה הכוללת. השאילתה מרחיבה את חלון ה-API בדקה אחת מכל צד ומחילה מחדש מקומית את הגבול החצי-פתוח המדויק של [RangeStart, RangeEnd), כך שנכונות המחיצה אינה תלויה בשאלה אם השרת מתייחס לגבולותיו ככוללים או כבלעדיים.
Activities.pq — the fold that makes incremental refresh work
הרענון הראשון לאחר פריסה מחיל את המדיניות: טעינה היסטורית מלאה, איטית. כל רענון לאחר מכן נוגע רק בחלון המצטבר. נמדד על מערך נתונים של כ-158,000 פעילויות וכ-2,300 ישויות:
נקודת הקצה הקלאסית של Power BI לרענון ב-REST (‏POST .../refreshes עם notifyOption בלבד) מתעלמת בשקט ממדיניות רענון ומבצעת סריקה מלאה בכל פעם. כדי להחיל את המדיניות דרך ה-REST API, השתמשו ברענון משופר (enhanced refresh): שלחו את type, commitMode ו-applyRefreshPolicy בגוף הבקשה. רענונים שמופעלים על ידי מתזמן שירות Power BI תמיד מחילים מדיניות — תכונה מוזרה זו ייחודית לקריאת ה-REST.
חלון 14 הימים נדיב במכוון. קליטת פעילות אינה מסוג append-only-at-now: השלמות רטרואקטיביות של מחברים מכניסות אירועים עם חותמות זמן מהעבר. חלון של 1-2 ימים היה מפספס אותם לצמיתות.

הרחבת חלון הרענון אל ה-API

‏GET /v1/activities מקבל את המסננים start_date ו-end_date שאליהם פרמטרי Power BI משתלבים, ומסנן את event_ts בין הגבולות. ‏Entities הוא ממד, ולכן דוגמה זו מרעננת אותו במלואו בכל פעם ולא באופן מצטבר. מערכי נתונים לדיווח משתמשים בסימני המים שלהם (updated_after, occurred_after) במקום בחלון התאריכים של הפעילויות.

הגבלות קצב במהלך רענון

‏/v1 אוכף תקציבים נפרדים לכל מפתח ולכל IP (ראו הגבלות קצב). כבדו את 429 + Retry-After; אל תקבעו תקציב בקשות בקוד הקשיח של המודל. שני מאפיינים של רענוני Power BI חשובים:
  • סריקת טבלה אחת היא סדרתית. כל בקשת עמוד זקוקה לאסימון העמוד הקודם, ולכן טבלה אחת מוגבלת על ידי זמן השהיה ללא תלות בגודל העמוד.
  • רענוני טבלאות במקביל מכפילים את העומס. כמה טבלאות גדולות שמתרעננות במקביל הן המקרה שפוגע בתקרה, ולכן נתיב הניסיון החוזר ל-429 ב-Fn_FetchAll חשוב. העדיפו פחות טבלאות במקביל על פני הנחה של מקביליות בלתי מוגבלת.
הניסיון החוזר נבדק מול מגביל רווי אמיתי. רענון שרץ בזמן שעומס עבודה מקביל החזיק במכוון את המפתח בתקרה שלו הושלם בכל זאת והפיק את אותם מספרי שורות כמו קו בסיס ללא תחרות — הניסיונות החוזרים החזירו עמודים שלמים, ללא פערים.

גרסאות חוזה ופרטי זיהוי שמורים

‏/v1 מקבל כותרת בקשה Living-Security-Version כדי לנעוץ גרסת חוזה שפורסמה (ראו מדריך התחלה מהירה ל-API). Power Query אינו יכול לשלוח כותרת זו כאשר מקור הנתונים משתמש בפרטי זיהוי שמורים — רק מקורות נתונים אנונימיים מאפשרים כותרות מותאמות אישית. הוספתה גורמת לכישלון הרענון עם:
שמרו את המפתח בפרטי הזיהוי השמורים של Power BI והשמיטו את הכותרת המותאמת. כאשר אין גרסה מפורשת בבקשה, ה-API משתמש ב-contract_version הננעץ של חשבון השירות, או בגרסה האחרונה שפורסמה אם לא הוגדרה נעיצה. אשרו את גרסת החוזה של החשבון מול מנהל ה-API שלכם לפני פרסום רענון. ראו את יומן השינויים של ה-API לגרסאות הנתמכות. אם רענון מתחיל להתנהג באופן בלתי צפוי, בדקו את כותרת התגובה Living-Security-Version של ה-API כדי לראות איזה חוזה שירת בפועל את הבקשה.

רענון ואימות המודל שלכם

פרסמו את המודל הסמנטי לסביבת העבודה שלכם ב-Power BI, קשרו את פרטי הזיהוי השמורים שלו למקור /v1 האזורי, והריצו רענון לפני הפעלת תזמון. בדקו את היסטוריית הרענונים לאיתור כשלים או קריאות חלקיות. בדקו את ספירות השורות מול קריאת API עצמאית עם אותם מסננים. מדריך העימוד כולל דוגמאות Python ו-cURL לקריאת קבוצת תוצאות מלאה. רענון שקורא רק את העמוד הראשון עשוי להיראות מוצלח במערך נתונים קטן; השוו ספירות לפני שאתם מסתמכים על הדוח.

בחירות במודל

  • לסיכומי קמפיין ולתוצאות ברמת אדם יש רמות פירוט שונות. ‏SimulationResults קורא ל-GET /v1/simulations/{id}/results (GET אחד לכל הרצה). עבור פישינג ברמת אדם, הוסיפו שאילתות עבור GET /v1/reporting/simulation_results ו- GET /v1/reporting/simulation_events (או GET /v1/simulation_results התפעולי אם כבר יש ברשותכם simulation:read).
  • ‏vectors ב-/v1/simulations משוטח למחרוזת מחוברת בפסיקים. עמודה מסוג רשימה אינה יכולה לשמש לחיתוך כממד אמיתי. אם עמוד בדוח צריך לסנן לפי וקטור, הוסיפו טבלת גשר בין סימולציה לווקטור.

השלבים הבאים

Developer Hub

צרו חשבון שירות ומפתח API עבור Power BI.

מדריך התחלה מהירה ל-API

בצעו אימות של בקשות /v1 באמצעות אימות Basic.

עימוד

מעטפת הרשימה, אסימוני סמן ויציבות המסננים לאורך סריקה.

הגבלות קצב

תקציבים לכל מפתח ולכל IP, חוזה ה-429 והנחיות לניסיון חוזר.