/v1 को Power BI में पढ़ने का एक end-to-end उदाहरण है। इसमें
Power Query (M) कनेक्टिविटी पैटर्न, /v1/activities पर बना star-schema semantic मॉडल, incremental refresh, और प्रति-व्यक्ति phishing परिणामों के लिए reporting
preview datasets का उपयोग कब करना है, यह शामिल है।
उदाहरणों में US production host
(https://api.us-east-1.livingsecurity.ai/v1) का उपयोग किया गया है। EU संगठन के लिए, Fn_FetchAll और
Fn_GetJson दोनों में https://api.eu-west-1.livingsecurity.ai/v1 का उपयोग करें, फिर data-source credential को उसी host से बाइंड करें। देखें
Regions।
यह गाइड API key के साथ संग्रहीत Basic credentials का उपयोग करती है। आपको
OAuth क्लाइंट की आवश्यकता नहीं है। credential विकल्पों के लिए Authentication देखें, और एक्सेस तथा सेटअप के लिए Developer Hub देखें।
यह उदाहरण किसलिए है
इसका उपयोग तब करें जब आपको निम्नलिखित करना हो:/v1list endpoints को सही cursor pagination और rate-limit retry के साथ Power BI dataset में लोड करना।- ऐसा semantic मॉडल बनाना जिसमें measures (“active entities”, “activities per active entity”) किसी flat table से गिनने के बजाय dimensional हों।
- निर्धारित Power BI refresh को incremental refresh की सहायता से पूरे इतिहास के full walk से घटाकर छोटी दैनिक विंडो तक लाना।
- phishing के लिए सही grain चुनना: campaign totals (operational) बनाम प्रति-व्यक्ति परिणाम और typed events (reporting preview)।
पूर्वापेक्षाएं
- एक API key, जिसमें आपकी queries के लिए आवश्यक permissions हों:
- Operational उदाहरण:
activity:read,entity:read, औरsimulation:read। - reporting datasets के माध्यम से प्रति-व्यक्ति phishing:
reporting:read। देखें API keys।
- Operational उदाहरण:
- Power BI Desktop, या Power BI / Fabric workspace जहां आप semantic मॉडल बना सकें और refresh शेड्यूल कर सकें।
सही grain चुनें
/v1 phishing के लिए दो संबंधित surfaces प्रदान करता है। वे एक-दूसरे के स्थान पर उपयोग करने योग्य नहीं हैं।
नीचे दी गई Power BI उदाहरण queries operational routes
(
/v1/simulations, /v1/simulations/{id}/results, /v1/activities,
/v1/entities) को कॉल करती हैं। प्रति-व्यक्ति phishing reporting के लिए नीचे दिए गए
reporting preview family को प्राथमिकता दें। जिस key को केवल reporting:read दिया गया है, वह operational /v1/simulation_results को कॉल नहीं कर सकती (API 403 लौटाता है)।
Difficulty scale
Simulation difficulty एक 1–5 पूर्णांक है, जो/v1/simulations (difficulty_level),
/v1/simulation_results (difficulty_level), /v1/activities properties
(difficulty_tier), और /v1/reporting/simulation_events (difficulty_tier) पर होता है।
1 सबसे आसान और 5 सबसे कठिन है। Adaptive और progressive simulations का कोई एकल campaign-level मान नहीं होता, इसलिए /v1/simulations.difficulty_level का मान null होता है,
जबकि परिणामों पर प्रति-प्राप्तकर्ता difficulty_level फिर भी सेट हो सकता है। पुराने low/medium/high exports से मैप करने के लिए, 1–2 को low, 3 को medium, और 4–5 को
high मानें।
कनेक्टिविटी पैटर्न (Power Query)
उदाहरण की प्रत्येक query चार नियमों पर आधारित है। इनमें से प्रत्येक को Power BI Service लागू करता है, यह शैली की पसंद का विषय नहीं है।Web.Contents का base URL स्थिर रखें और उसे /v1 पर समाप्त करें
Web.Contents का base URL स्थिर रखें और उसे /v1 पर समाप्त करें
सभी गतिशील तत्वों को
RelativePath और Query में रखें। Web.Contents का पहला argument एक literal string होना चाहिए जो संगठन के क्षेत्रीय /v1 root पर समाप्त हो:- US:
https://api.us-east-1.livingsecurity.ai/v1 - EU:
https://api.eu-west-1.livingsecurity.ai/v1
"simulations", न कि
"v1/simulations")। EU संगठन के लिए US host न चिपकाएं।यदि पहला argument string concatenation से बनाया गया है, तो Power BI Service data source को स्थिर रूप से पहचान नहीं सकती और निर्धारित refresh “dynamic data source” त्रुटि के साथ विफल हो जाता है, भले ही query Power BI Desktop में काम करती हो।API key को संग्रहीत Basic credential के रूप में दें, query टेक्स्ट में नहीं
API key को संग्रहीत Basic credential के रूप में दें, query टेक्स्ट में नहीं
जब Power BI
/v1 data source पर credentials मांगे, तो
Basic चुनें और API key को username के रूप में पेस्ट करें। password फ़ील्ड में x जैसा कोई placeholder डालें। Power BI Service खाली password अस्वीकार कर देती है, भले ही API उस फ़ील्ड को अनदेखा करता हो। placeholder username के साथ key को password के रूप में देना भी काम करता है।M में Authorization header न जोड़ें। यह आपके डेस्कटॉप पर काम करता है, फिर key को query फ़ाइल में ही सम्मिलित कर देता है और निर्धारित refresh में बाधा डालता है।credential dialog की test connection को चलने दें
credential dialog की test connection को चलने दें
GET /v1 authenticated है: वैध key के साथ यह 200 लौटाता है और key के बिना 401।
data source को …/v1 पर इंगित करें और test को न छोड़ें —
सही key सेव हो जाती है, जबकि रद्द की गई या गलत प्रारूप वाली key तुरंत विफल हो जाती है।पुराने उदाहरणों में data source के रूप में केवल host का उपयोग किया जाता था और test छोड़ने को कहा जाता था क्योंकि GET / हमेशा 404 होता है। उन मॉडलों को फिर से …/v1 पर इंगित करें।प्रत्येक list query पर limit=500 स्पष्ट रूप से सेट करें
प्रत्येक list query पर limit=500 स्पष्ट रूप से सेट करें
प्रत्येक
/v1 list endpoint पर डिफ़ॉल्ट page size 25 है। इसे डिफ़ॉल्ट पर छोड़ने से उसी डेटा के लिए request की संख्या कई गुना बढ़ जाती है। Query मान टेक्स्ट होने चाहिए —
M में limit = "500", न कि limit = 500।साझा pagination function
उदाहरण की प्रत्येक query एक हीFn_FetchAll को कॉल करती है, जो next_page_token तब तक walk करता है जब तक वह null न हो जाए (देखें
pagination)। इसकी उल्लेखनीय विशेषताएं:
- स्थिर
/v1base URL, गतिशीलRelativePathऔरQuery। निर्धारित refresh और credential test के लिए आवश्यक। - सीमित retry के साथ
ManualStatusHandling = {429}। यह function Power Query द्वारा उपलब्ध कराए जाने परRetry-Afterपढ़ता है, अन्यथा 30 सेकंड प्रतीक्षा करता है, और लगातार 5429responses के बाद refresh के timeout होने तक लूप करने के बजाय स्पष्ट त्रुटि के साथ रुक जाता है।5xxको जानबूझकर retry नहीं किया जाता — server त्रुटि सामने आनी चाहिए, चुपचाप आंशिक dataset नहीं बनना चाहिए। - 60-सेकंड
Timeout। Pages आमतौर पर एक सेकंड से बहुत कम में उत्तर देते हैं, इसलिए एक मिनट की चुप्पी का अर्थ है कि request विफल हो चुकी है। Json.Documentसे पहलेBinary.Buffer। बफ़रिंग के बिना, यदि mashup engine response stream को एक से अधिक बार पढ़े तो वह उसे फिर से request कर सकता है।baseQueryप्रत्येक iteration में अपरिवर्तित पास किया जाता है। Page tokens अपारदर्शी, हस्ताक्षरित cursors हैं जो संगठन, credential, contract version, और filters तथा sort के fingerprint से बंधे होते हैं। walk के बीच में filter बदलने पर उसे पहले page से दोबारा शुरू करने के बजाय अमान्य token के रूप में अस्वीकार कर दिया जाता है।
Fn_FetchAll.pq — base and call shape
प्रति endpoint typed queries
Fn_FetchAll का प्रत्येक उपभोक्ता एक ही ढांचे का पालन करता है: endpoint को कॉल करें,
स्तंभों की एक निश्चित सूची चुनें, object discriminator हटाएं, और
timestamps को datetimezone के रूप में टाइप करें ताकि date measures refresh capacity के timezone के कारण चुपचाप न खिसकें।
Excel
वही Power Query (M) Excel के Get & Transform में चलता है — यह Power BI Desktop जैसा ही इंजन है। इसका उपयोग तब करें जब आपको semantic मॉडल के बजाय वर्कशीट table चाहिए। Windows के लिए Excel पर (Microsoft 365, Excel 2024, 2021, 2019, या 2016):- Data → Get Data → From Other Sources → Blank Query।
- Power Query Editor में, Home → Advanced Editor। पहले
Fn_FetchAllपेस्ट करें, फिर उस query का नाम बदलकरFn_FetchAllकरें (Query Settings → Name, या Queries pane में राइट-क्लिक करके Rename)। Fn_GetJsonके लिए यही दोहराएं, फिर प्रत्येक report query के लिए।- Home → Close & Load → Close & Load To… से Import Data
dialog खुलता है।
Fn_FetchAllऔरFn_GetJsonके लिए Only Create Connection चुनें (ये functions हैं, tables नहीं)। जिन report queries को वर्कशीट पर चाहते हैं उनके लिए Table चुनें। - पहले refresh पर Basic चुनें: API key को User name के रूप में, और
xजैसा कोई placeholder Password के रूप में दें। Excel प्रति data source URL एक credential संग्रहीत करता है; उसी/v1host तक पहुंचने वाली बाद की queries उसी का पुन: उपयोग करती हैं।
किसी वर्कबुक में पहली बार query बनाते समय Close & Load To… धूसर (dimmed) हो सकता है। Close & Load का उपयोग करें, फिर Excel में Data →
Queries & Connections चुनें, query पर राइट-क्लिक करें, और Load To चुनें।
इस स्थिति के लिए यही मार्ग Microsoft द्वारा प्रलेखित है।
Living-Security-Version नहीं भेज सकते — Power BI में भी यही प्रतिबंध है। service account को pin करें या query record में api_version पास करें। देखें
Contract versions और संग्रहीत credentials।
तैयार report queries (स्तंभ मैपिंग और पिछले प्रदाता के export से अंतर):
Per-person compliance
व्यक्ति × असाइनमेंट grain पर Training नामांकन।
Email phishing log
Event-स्तर की phishing interactions, पिछले 12 महीने।
Most susceptible users
प्रति-व्यक्ति 12-महीने का click, credential, और report rollup।
Reporting preview datasets (प्रति-व्यक्ति phishing)
Reporting preview family प्रति-व्यक्ति phishing के लिए datasets प्रदान करता है। इसके लिएreporting:read और आपके संगठन के लिए reporting एक्सेस आवश्यक है।
इसके schemas और data policies देखने के लिए नीचे दिए गए dataset catalog का उपयोग करें।
लाइव catalog खोजें:
simulation_results
- Path:
GET /v1/reporting/simulation_results - Grain: entity × simulation
- Filters:
simulation,entity,updated_after, साथ हीlimit/page_token - Wire object:
reporting.simulation_result - Join keys:
entity_id,simulation_id
ReportingSimulationResults.pq (sketch)
updated_after को inclusive निचले watermark के रूप में उपयोग करें। परिवर्तनशील result dimensions उसी id के अंतर्गत यथास्थान पुनः लिखी जाती हैं।
simulation_events
- Path:
GET /v1/reporting/simulation_events - Grain: प्रत्येक देखी गई interaction के लिए एक typed fact
- Filters:
simulation,entity,event_type,occurred_after, साथ हीlimit/page_token - Wire object:
reporting.simulation_event - Event types: बंद सार्वजनिक tokens जैसे
simulation.delivered,simulation.opened,simulation.link_clicked,simulation.credentials_submitted,simulation.reported— raw ClickHousephishing.simulation.*activity types नहीं - Device:
device_typeव्युत्पन्न class है (देखे गए tokens मेंdesktop,mobile,tablet,unknownशामिल हैं)। Rawuser_agent/v1पर नहीं है। Raw IP कभी/v1पर नहीं होता (कभी संग्रहीत नहीं किया जाता; केवल saltedip_hash)।
ReportingSimulationEvents.pq (sketch)
occurred_after का उपयोग करें। Facts केवल जोड़े जाते हैं (append-only);
देर से आने वाले डेटा नई पंक्तियों के रूप में आते हैं।
entities
- Path:
GET /v1/reporting/entities - Grain: प्रति entity एक वर्तमान पंक्ति
- Filters:
type,updated_after, साथ हीlimit/page_token - Wire object:
reporting.entity - Join key:
id/entity_id(समान मान)
reporting.simulation_results.entity_id = reporting.entities.id का उपयोग करें।
Operational GET /v1/entities entity:read पर ही रहता है और यह एक अलग permission है।
ReportingEntities.pq
entity_versions और cohort_memberships
ये दोनों datasets एक नामित केवल-वर्तमान अपवाद के साथ आते हैं:कोई प्रामाणिक version या membership-history table मौजूद नहीं है। यह dataset वर्तमान पंक्ति को एक open-ended अंतराल के रूप में प्रस्तुत करता है (valid_tonull है,is_currenttrue है)। entity versions के लिएvalid_fromका मानcreated_atहोता है, अन्यथाupdated_at, और cohort memberships के लिए request का observation समय। बंद ऐतिहासिक अंतराल गढ़े नहीं जाते।
- entity_versions:
GET /v1/reporting/entity_versions। entities जैसे ही filters।valid_fromका मानcreated_atहोता है, अन्यथाupdated_at। जिस entity के दोनों timestamps null हों, उसे शामिल नहीं किया जाता। - cohort_memberships:
GET /v1/reporting/cohort_memberships। Filters:cohort,entity,updated_after।updated_atCohort का अंतिम अपडेट है ताकि incremental refresh सटीक रहे।valid_fromrequest का observation समय है।entity_idकोreporting.entities.idसे join करें।
ReportingEntityVersions.pq
ReportingCohortMemberships.pq
/v1/activities पर Star-schema semantic मॉडल
/v1/activities संगठन की समय-चिह्नित event stream है। इसमें कोई संख्यात्मक measures नहीं हैं — किसी रिपोर्ट में प्रत्येक मात्रा पंक्तियों की गिनती होती है — जिससे star schema स्वाभाविक रूप से उपयुक्त बैठता है।
Activitiesवास्तविक grain पर event fact है। प्रति गतिविधि एक पंक्ति। Participants यहां हटा दिए जाते हैं और अलग table के रूप में पुनर्निर्मित किए जाते हैं।ActivityParticipantsइसलिए मौजूद है क्योंकि participants वास्तव में one-to-many होते हैं, जिनकी भूमिकाएंactorऔरtargetजैसी होती हैं।Activitiesपर flatten करने से या तो गतिविधि पंक्तियां डुप्लिकेट हो जातीं (हर गिनती बढ़ जाती) या अतिरिक्त participants छूट जाते।Activitiesसे संबंध मॉडल का एकमात्र bidirectional संबंध है, ताकि entity slicer fact table तक पहुंच सके।Entitiesवह dimension है जो participants को नाम देती है। किसी गतिविधि की participant पंक्तियों मेंentity_idऔर भूमिका होती है, लेकिन display name नहीं।DatesM में जनरेट की जाती है (शून्य API calls) और मॉडल की date table के रूप में चिह्नित की जाती है। इसी से DAX time intelligence (DATESINPERIOD,DATEADD) मान्य होता है। महीने और सप्ताह के दिन के नाम वाले स्तंभ अपने संख्यात्मक समकक्षों परsortByColumnघोषित करते हैं ताकि visuals महीनों को वर्णानुक्रम में क्रमबद्ध न करें।
discourageImplicitMeasures सेट करता है): कुल
गतिविधियां, active entities, प्रति active entity गतिविधियां, गतिविधि वाले दिन,
और 7-दिवसीय trailing दैनिक औसत।
Bridge table का स्वरूप
ActivityParticipants /v1/activities को walk करता है और participants array को प्रति participant एक पंक्ति में विस्तारित करता है:
ActivityParticipants.pq
ActivityParticipants /v1/activities को स्वतंत्र रूप से walk करता है, Activities query का संदर्भ लेने के बजाय। Power BI में, दो tables के रूप में लोड की गई दो queries प्रत्येक refresh के समय स्वतंत्र रूप से डेटा प्राप्त करती हैं। उन्हें स्वतंत्र रखने से service दोनों tables के partitions को समानांतर रूप से refresh कर पाती है।
Incremental refresh
दोनों fact-grain tables (Activities और ActivityParticipants) Power BI incremental refresh policy घोषित करती हैं: वार्षिक partitions के 5 वर्ष रखें,
प्रत्येक refresh पर पिछले 14 दिन पुनः import करें।
यह तंत्र DateTime parameters की एक जोड़ी, RangeStart और RangeEnd, पर आधारित है, जिन्हें Power BI service refresh के समय प्रत्येक partition के लिए पुनः बाइंड करती है। प्रत्येक fact query इन parameters को API के start_date और end_date filters में मिला देती है, इसलिए partition-स्तर पर request की मात्रा partition के अनुपात में होती है, कुल इतिहास के नहीं। Query API विंडो को प्रत्येक ओर एक मिनट चौड़ा करती है और सटीक half-open [RangeStart, RangeEnd) सीमा को स्थानीय रूप से पुनः लागू करती है, इसलिए partition की शुद्धता इस पर निर्भर नहीं करती कि server अपनी सीमाओं को inclusive मानता है या exclusive।
Activities.pq — the fold that makes incremental refresh work
14-दिवसीय विंडो जानबूझकर उदार रखी गई है। गतिविधि ingestion केवल “अभी” पर append-only नहीं है: connector backfills पिछले timestamps वाले events लाते हैं। 1-2 दिन की विंडो उन्हें स्थायी रूप से चूक जाएगी।
Refresh विंडो को API में विस्तृत करना
GET /v1/activities वे start_date और end_date filters स्वीकार करता है जिनमें Power BI parameters मिलते हैं, और सीमाओं के बीच event_ts को फ़िल्टर करता है।
Entities एक dimension है, इसलिए यह उदाहरण इसे हर बार incremental के बजाय पूरी तरह refresh करता है।
Reporting datasets गतिविधि date विंडो के बजाय अपने स्वयं के watermarks (updated_after,
occurred_after) का उपयोग करते हैं।
Refresh के दौरान rate limits
/v1 प्रति-key और प्रति-IP अलग-अलग budgets लागू करता है (देखें
rate limits)। 429 + Retry-After का पालन करें;
अपने मॉडल में request budget को hard-code न करें। Power BI refreshes की दो विशेषताएं महत्वपूर्ण हैं:
- एक table का walk क्रमिक होता है। प्रत्येक page request को पिछले page का token चाहिए, इसलिए page size चाहे जो हो, एक table latency-bound रहती है।
- समवर्ती table refreshes गुणित होते हैं। कई बड़ी tables का समानांतर रूप से refresh होना वह स्थिति है जो सीमा तक पहुंचती है, इसी कारण
Fn_FetchAllमें 429 retry पथ महत्वपूर्ण है। असीमित concurrency मानने के बजाय कम समानांतर tables को प्राथमिकता दें।
Contract versions और संग्रहीत credentials
/v1 प्रकाशित contract version को pin करने के लिए Living-Security-Version request header स्वीकार करता है (देखें API quickstart)। जब data source संग्रहीत credentials का उपयोग करता है, तब Power Query वह header नहीं भेज सकता — केवल anonymous data sources ही custom headers की अनुमति देते हैं। इसे जोड़ने पर refresh इस त्रुटि के साथ विफल होता है:
contract_version उपयोग करता है, या यदि कोई pin सेट नहीं है तो नवीनतम प्रकाशित version।
refresh प्रकाशित करने से पहले अपने API administrator से खाते के contract version की पुष्टि करें। समर्थित versions के लिए API changelog देखें।
यदि refresh अप्रत्याशित व्यवहार करने लगे, तो API के
Living-Security-Version response header का निरीक्षण करें ताकि पता चले कि request को वास्तव में किस contract ने सेवा दी।
अपने मॉडल को Refresh और सत्यापित करें
Semantic मॉडल को अपने Power BI workspace में प्रकाशित करें, उसके संग्रहीत credential को क्षेत्रीय/v1 स्रोत से बाइंड करें, और शेड्यूल सक्षम करने से पहले एक refresh चलाएं। विफलताओं या अधूरी रीडिंग के लिए refresh इतिहास की समीक्षा करें।
उन्हीं filters के साथ स्वतंत्र API रीड के विरुद्ध पंक्ति संख्या की जांच करें।
pagination गाइड में पूर्ण परिणाम सेट पढ़ने के लिए Python और cURL उदाहरण शामिल हैं। जो refresh केवल पहला page पढ़ता है, वह छोटे dataset पर सफल दिख सकता है; रिपोर्ट पर भरोसा करने से पहले संख्याओं की तुलना करें।
मॉडल संबंधी विकल्प
- Campaign totals और प्रति-व्यक्ति परिणामों का grain अलग-अलग होता है।
SimulationResultsGET /v1/simulations/{id}/resultsको कॉल करता है (प्रति run एक GET)। प्रति-व्यक्ति phishing के लिए,GET /v1/reporting/simulation_resultsऔरGET /v1/reporting/simulation_eventsके लिए queries जोड़ें (या यदि आपके पास पहले सेsimulation:readहै तो operationalGET /v1/simulation_results)। /v1/simulationsपरvectorsको comma-joined string में flatten किया जाता है। list-typed स्तंभ को वास्तविक dimension के रूप में slice नहीं किया जा सकता। यदि किसी रिपोर्ट पृष्ठ को vector के आधार पर फ़िल्टर करना हो, तो simulation-to-vector bridge table जोड़ें।
अगले चरण
Developer Hub
Power BI के लिए service account और API key बनाएं।
API quickstart
Basic auth के साथ
/v1 requests को authenticate करें।Pagination
List envelope, cursor tokens, और walk के दौरान filter की स्थिरता।
Rate limits
प्रति-key और प्रति-IP budgets, 429 contract, और retry मार्गदर्शन।

