/v1 läses in i Power BI. Den omfattar
anslutningsmönstret i Power Query (M), en semantisk stjärnschemamodell byggd
på /v1/activities, inkrementell uppdatering samt när de reporting-
förhandsdatauppsättningarna ska användas för nätfiskeresultat per person.
Exemplen använder produktionsvärden för USA
(https://api.us-east-1.livingsecurity.ai/v1). För en organisation i EU använder du
https://api.eu-west-1.livingsecurity.ai/v1 i både Fn_FetchAll och
Fn_GetJson och binder sedan datakällans autentiseringsuppgifter till den värden. Se
Regioner.
Den här guiden använder lagrade Basic-autentiseringsuppgifter med en API-nyckel. Du behöver ingen
OAuth-klient. Se Autentisering för
alternativen för autentiseringsuppgifter och Developer Hub
för åtkomst och konfiguration.
Vad det här exemplet är till för
Använd det när du behöver:- Läsa in listslutpunkter i
/v1i en Power BI-datauppsättning med korrekt markörbaserad paginering och nytt försök vid hastighetsbegränsning. - Bygga en semantisk modell där mått (”aktiva entiteter”, ”aktiviteter per aktiv entitet”) är dimensionella i stället för att räknas från en platt tabell.
- Gå från en schemalagd Power BI-uppdatering som läser hela historiken till ett litet dagligt fönster med hjälp av inkrementell uppdatering.
- Välja rätt nivå för nätfiskedata: kampanjtotaler (operativt) jämfört med resultat per person och typade händelser (förhandsversion för rapportering).
Förutsättningar
- En API-nyckel med de behörigheter som dina frågor kräver:
- Operativt exempel:
activity:read,entity:readochsimulation:read. - Nätfiske per person via rapporteringsdatauppsättningar:
reporting:read. Se API-nycklar.
- Operativt exempel:
- Power BI Desktop, eller en Power BI-/Fabric-arbetsyta där du kan skapa en semantisk modell och schemalägga uppdatering.
Välj rätt detaljnivå
/v1 erbjuder två relaterade gränssnitt för nätfiske. De är inte utbytbara.
Power BI-exempelfrågorna nedan anropar de operativa vägarna
(
/v1/simulations, /v1/simulations/{id}/results, /v1/activities,
/v1/entities). För nätfiskerapportering per person bör du i stället använda
förhandsfamiljen för rapportering nedan. En nyckel som endast har beviljats reporting:read kan inte
anropa operativa /v1/simulation_results (API:et returnerar 403).
Svårighetsskala
Simuleringens svårighetsgrad är ett heltal mellan 1 och 5 på/v1/simulations (difficulty_level),
/v1/simulation_results (difficulty_level), egenskaperna för /v1/activities
(difficulty_tier) och /v1/reporting/simulation_events (difficulty_tier).
1 är lättast och 5 är svårast. Adaptiva och progressiva simuleringar saknar
ett enskilt värde på kampanjnivå, så /v1/simulations.difficulty_level är null
medan difficulty_level per mottagare i resultaten ändå kan vara angivet. För att mappa mot
äldre exporter med låg/medel/hög behandlar du 1–2 som låg, 3 som medel och 4–5 som
hög.
Anslutningsmönster (Power Query)
Fyra regler ligger till grund för varje fråga i exemplet. Var och en upprätthålls av Power BI-tjänsten och är inte en fråga om stilpreferenser.Håll bas-URL:en för Web.Contents statisk och avsluta den vid /v1
Håll bas-URL:en för Web.Contents statisk och avsluta den vid /v1
Lägg allt dynamiskt i
RelativePath och Query. Det första argumentet till
Web.Contents måste vara en bokstavlig sträng som slutar vid organisationens
regionala /v1-rot:- USA:
https://api.us-east-1.livingsecurity.ai/v1 - EU:
https://api.eu-west-1.livingsecurity.ai/v1
"simulations", inte
"v1/simulations"). Klistra inte in en USA-värd för en EU-organisation.Om det första argumentet byggs med strängsammanfogning kan Power BI-tjänsten
inte statiskt identifiera datakällan, och den schemalagda uppdateringen misslyckas med
ett fel om ”dynamic data source”, trots att frågan fungerar i Power BI
Desktop.Ange API-nyckeln som lagrade Basic-autentiseringsuppgifter, inte i frågetexten
Ange API-nyckeln som lagrade Basic-autentiseringsuppgifter, inte i frågetexten
När Power BI ber om autentiseringsuppgifter för datakällan
/v1 väljer du
Basic och klistrar in API-nyckeln som användarnamn. Ange en platshållare som
x i fältet Lösenord. Power BI-tjänsten avvisar ett tomt
lösenord trots att API:et ignorerar det fältet. Nyckeln som lösenord med ett
platshållaranvändarnamn fungerar också.Lägg inte till en Authorization-rubrik i M. Det fungerar på din dator, men
bäddar sedan in nyckeln i frågefilen och krånglar med schemalagd uppdatering.Låt anslutningstestet i dialogrutan för autentiseringsuppgifter köras
Låt anslutningstestet i dialogrutan för autentiseringsuppgifter köras
GET /v1 är autentiserad: den returnerar 200 med en giltig nyckel och 401
utan. Peka datakällan mot …/v1 och hoppa inte över testet –
en giltig nyckel sparas, en återkallad eller felformad nyckel misslyckas omedelbart.Äldre exempel använde enbart värden som datakälla och uppmanade dig att hoppa över
testet eftersom GET / alltid är 404. Peka om dessa modeller mot …/v1.Ange limit=500 uttryckligen i varje listfråga
Ange limit=500 uttryckligen i varje listfråga
Standardstorleken för sidor på varje listslutpunkt i
/v1 är 25. Om du lämnar standardvärdet
ökar antalet begäranden för samma data. Frågevärden måste vara text –
limit = "500" i M, inte limit = 500.Delad pagineringsfunktion
Varje fråga i exemplet anropar en endaFn_FetchAll som går igenom
next_page_token tills den är null (se
paginering). Dess viktigaste egenskaper:
- Statisk bas-URL för
/v1, dynamiskaRelativePathochQuery. Krävs för schemalagd uppdatering och för autentiseringstestet. ManualStatusHandling = {429}med ett begränsat antal nya försök. Funktionen läserRetry-Afternär Power Query exponerar den, väntar annars 30 sekunder och ger upp efter 5 på varandra följande429-svar med ett uttryckligt fel i stället för att loopa tills uppdateringen får timeout.5xxgörs avsiktligt inte om – ett serverfel ska synas och inte i tysthet ge en ofullständig datauppsättning.Timeoutpå 60 sekunder. Sidor svarar vanligtvis på långt under en sekund, så en minuts tystnad innebär att begäran är död.Binary.BufferföreJson.Document. Utan buffring kan mashup- motorn begära svarsströmmen på nytt om den läser den mer än en gång.baseQueryskickas oförändrad i varje iteration. Sidtokens är ogenomskinliga, signerade markörer som är bundna till organisationen, autentiseringsuppgifterna, kontraktsversionen och fingeravtrycket för filter och sortering. Om ett filter ändras under genomgången avvisas det som en ogiltig token i stället för att starta om från sida ett.
Fn_FetchAll.pq — base and call shape
Typade frågor per slutpunkt
Varje konsument avFn_FetchAll följer samma mönster: anropa slutpunkten,
projicera en fast kolumnlista, ta bort diskriminatorn object och typa
tidsstämplar som datetimezone så att datummått inte i tysthet förskjuts av
uppdateringskapacitetens tidszon.
Excel
Samma Power Query (M) körs i Excels Hämta och transformera – det är samma motor som i Power BI Desktop. Använd detta när du vill ha en kalkylbladstabell i stället för en semantisk modell. I Excel för Windows (Microsoft 365, Excel 2024, 2021, 2019 eller 2016):- Data → Hämta data → Från andra källor → Tom fråga.
- I Power Query-redigeraren väljer du Hem → Avancerad redigerare. Klistra in
Fn_FetchAllförst och byt sedan namn på den frågan tillFn_FetchAll(Query Settings → Name, eller högerklicka i fönstret Queries → Rename). - Upprepa för
Fn_GetJsonoch sedan för varje rapportfråga. - Hem → Stäng och läs in → Stäng och läs in till… öppnar dialogrutan Importera data.
Välj Skapa endast anslutning för
Fn_FetchAllochFn_GetJson(de är funktioner, inte tabeller). Välj Tabell för varje rapportfråga som du vill ha i ett kalkylblad. - Vid första uppdateringen väljer du Basic: API-nyckeln som Användarnamn, en
platshållare som
xsom Lösenord. Excel lagrar en uppsättning autentiseringsuppgifter per datakälls-URL; senare frågor som använder samma/v1-värd återanvänder dem.
Stäng och läs in till… kan vara nedtonat första gången du skapar en fråga i
en arbetsbok. Använd Stäng och läs in, välj sedan i Excel Data →
Frågor och anslutningar, högerklicka på frågan och välj Läs in till.
Den vägen är dokumenterad av Microsoft för det här fallet.
Living-Security-Version från Power Query på en
autentiserad källa – samma begränsning som i Power BI. Fäst tjänstkontot eller skicka
api_version i frågeposten. Se
Kontraktsversioner och lagrade autentiseringsuppgifter.
Färdiga rapportfrågor (kolumnmappningar och avvikelser från en
tidigare leverantörs export):
Efterlevnad per person
Utbildningsregistreringar på nivån person × tilldelning.
Logg över e-postnätfiske
Nätfiskeinteraktioner på händelsenivå, senaste 12 månaderna.
Mest mottagliga användare
Sammanställning per person av klick, inloggningsuppgifter och rapportering under 12 månader.
Förhandsdatauppsättningar för rapportering (nätfiske per person)
Förhandsfamiljen för rapportering tillhandahåller datauppsättningar för nätfiske per person. Den kräverreporting:read och åtkomst till rapportering för din organisation.
Använd datauppsättningskatalogen nedan för att granska scheman och datapolicyer.
Upptäck den aktuella katalogen:
simulation_results
- Sökväg:
GET /v1/reporting/simulation_results - Detaljnivå: entitet × simulering
- filter:
simulation,entity,updated_after, samtlimit/page_token - Wire-objekt:
reporting.simulation_result - Kopplingsnycklar:
entity_id,simulation_id
ReportingSimulationResults.pq (sketch)
updated_after som inkluderande nedre vattenstämpel när du uppdaterar senaste
partitioner. Föränderliga resultatdimensioner skrivs om på plats under samma id.
simulation_events
- Sökväg:
GET /v1/reporting/simulation_events - Detaljnivå: ett typat faktum per observerad interaktion
- filter:
simulation,entity,event_type,occurred_after, samtlimit/page_token - Wire-objekt:
reporting.simulation_event - Händelsetyper: slutna publika tokens som
simulation.delivered,simulation.opened,simulation.link_clicked,simulation.credentials_submitted,simulation.reported– inte råa aktivitetstyper för ClickHousephishing.simulation.* - Enhet:
device_typeär den härledda klassen (observerade tokens omfattardesktop,mobile,tablet,unknown). Råuser_agentfinns inte i/v1. Rå IP finns aldrig i/v1(lagras aldrig; endast saltadip_hash).
ReportingSimulationEvents.pq (sketch)
occurred_after för inkrementella händelseinläsningar. Fakta är endast tillägg;
sent anlända data blir nya rader.
entities
- Sökväg:
GET /v1/reporting/entities - Detaljnivå: en aktuell rad per entitet
- filter:
type,updated_after, samtlimit/page_token - Wire-objekt:
reporting.entity - Kopplingsnyckel:
id/entity_id(samma värde)
reporting.simulation_results.entity_id = reporting.entities.id.
Operativa GET /v1/entities finns kvar på entity:read och är en annan
behörighet.
ReportingEntities.pq
entity_versions och cohort_memberships
Dessa två datauppsättningar har ett namngivet undantag som endast gäller aktuella data:Ingen auktoritativ tabell för versions- eller medlemskapshistorik finns. Den här datauppsättningen projicerar den aktuella raden som ett öppet intervall (valid_toär null,is_currentär true).valid_fromärcreated_ateller annarsupdated_atför entitetsversioner, och tidpunkten då begäran observerades för Kohort-medlemskap. Stängda historiska intervall fabriceras inte.
- entity_versions:
GET /v1/reporting/entity_versions. Samma filter som entities.valid_fromärcreated_ateller annarsupdated_at. En entitet där båda tidsstämplarna är null utelämnas. - cohort_memberships:
GET /v1/reporting/cohort_memberships. filter:cohort,entity,updated_after.updated_atär den senaste uppdateringen av Kohort så att inkrementell uppdatering förblir korrekt.valid_fromär tidpunkten då begäran observerades. Kopplaentity_idtillreporting.entities.id.
ReportingEntityVersions.pq
ReportingCohortMemberships.pq
Semantisk stjärnschemamodell på /v1/activities
/v1/activities är organisationens tidsstämplade händelseström. Den har inga
numeriska mått – varje kvantitet i en rapport är ett radantal – vilket gör ett
stjärnschema till ett naturligt val.
Activitiesär händelsefaktatabellen på verklig detaljnivå. En rad per aktivitet. Deltagare tas bort här och byggs upp igen som en egen tabell.ActivityParticipantsfinns eftersom deltagare verkligen är en-till-många, med roller somactorochtarget. Att platta ut dem påActivitiesskulle antingen duplicera aktivitetsrader (och blåsa upp varje räkning) eller förkasta ytterligare deltagare. Relationen tillActivitiesär modellens enda dubbelriktade relation, så att en entitetsutsnitt når faktatabellen.Entitiesär dimensionen som namnger deltagare. Deltagarrader i en aktivitet innehållerentity_idoch en roll men inget visningsnamn.Datesgenereras i M (noll API-anrop) och markeras som modellens datumtabell. Det är det som gör DAX-tidsintelligens (DATESINPERIOD,DATEADD) tillåten. Kolumner för månads- och veckodagsnamn deklarerarsortByColumnpå sina nummertvillingar så att visuella objekt inte sorterar månader alfabetiskt.
discourageImplicitMeasures): totalt antal
aktiviteter, aktiva entiteter, aktiviteter per aktiv entitet, dagar med aktivitet
samt ett dagligt medelvärde över 7 dagar.
Bryggtabellens utformning
ActivityParticipants går igenom /v1/activities och expanderar arrayen participants
till en rad per deltagare:
ActivityParticipants.pq
ActivityParticipants går igenom /v1/activities oberoende i stället för att
referera till frågan Activities. I Power BI hämtar två frågor som läses in som två
tabeller data oberoende av varandra vid uppdateringen. Genom att hålla dem oberoende
kan tjänsten uppdatera båda tabellernas partitioner parallellt.
Inkrementell uppdatering
Båda tabellerna på faktanivå (Activities och ActivityParticipants) deklarerar en
inkrementell uppdateringspolicy i Power BI: behåll 5 år av årliga partitioner och
importera om de senaste 14 dagarna vid varje uppdatering.
Mekanismen är ett par DateTime-parametrar, RangeStart och RangeEnd,
som Power BI-tjänsten binder om per partition vid uppdateringen. Varje faktafråga
viker in dessa parametrar i API:ets filter start_date och end_date, så att
antalet begäranden per partition är proportionellt mot partitionen,
inte mot hela historiken. Frågan vidgar API-fönstret med en minut åt vardera
håll och tillämpar det exakta halvöppna [RangeStart, RangeEnd)-gränsvärdet
lokalt igen, så att partitionens korrekthet inte beror på om servern
behandlar sina gränser som inkluderande eller exkluderande.
Activities.pq — the fold that makes incremental refresh work
Fönstret på 14 dagar är avsiktligt generöst. Inläsningen av aktiviteter är inte enbart
tillägg vid aktuell tidpunkt: ifyllnad från kopplingar levererar händelser med tidsstämplar i det förflutna.
Ett fönster på 1–2 dagar skulle missa dem permanent.
Att vidga uppdateringsfönstret in i API:et
GET /v1/activities accepterar filtren start_date och end_date som
Power BI-parametrarna viks in i och filtrerar event_ts mellan gränserna.
Entities är en dimension, så i det här exemplet uppdateras den helt varje gång
i stället för inkrementellt.
Rapporteringsdatauppsättningar använder sina egna vattenstämplar (updated_after,
occurred_after) i stället för datumfönstret för aktiviteter.
Hastighetsbegränsningar under uppdatering
/v1 tillämpar separata budgetar per nyckel och per IP (se
hastighetsbegränsningar). Följ 429 + Retry-After; hårdkoda
inte en begäranbudget i din modell. Två egenskaper hos Power BI-
uppdateringar är viktiga:
- En enskild tabellgenomgång är sekventiell. Varje sidbegäran behöver föregående sidas token, så en tabell är latensbunden oavsett sidstorlek.
- Samtidiga tabelluppdateringar multipliceras. Flera stora tabeller som uppdateras
parallellt är det fall som når taket, vilket är anledningen till att återförsöket vid 429
i
Fn_FetchAllär viktigt. Föredra färre parallella tabeller framför att anta obegränsad samtidighet.
Kontraktsversioner och lagrade autentiseringsuppgifter
/v1 accepterar en begäranrubrik Living-Security-Version för att fästa en publicerad
kontraktsversion (se API-snabbstart). Power
Query kan inte skicka den rubriken när datakällan använder lagrade autentiseringsuppgifter –
endast anonyma datakällor tillåter anpassade rubriker. Om den läggs till misslyckas en uppdatering
med:
contract_version, eller den senast publicerade versionen om ingen fästning är angiven.
Bekräfta kontots kontraktsversion med din API-administratör innan du
publicerar en uppdatering. Se API-ändringsloggen för
versioner som stöds.
Om en uppdatering börjar bete sig oväntat kan du granska API:ets
svarsrubrik Living-Security-Version för att se vilket kontrakt som faktiskt
hanterade begäran.
Uppdatera och verifiera din modell
Publicera den semantiska modellen i din Power BI-arbetsyta, binda dess lagrade autentiseringsuppgifter till den regionala/v1-källan och kör en uppdatering innan du aktiverar ett
schema. Granska uppdateringshistoriken efter fel eller ofullständiga läsningar.
Kontrollera radantal mot en oberoende API-läsning med samma filter.
Pagineringsguiden innehåller Python- och cURL-exempel
för att läsa en fullständig resultatmängd. En uppdatering som bara läser den
första sidan kan se lyckad ut på en liten datauppsättning; jämför antal innan du
förlitar dig på rapporten.
Modellval
- Kampanjtotaler och resultat per person har olika detaljnivåer.
SimulationResultsanroparGET /v1/simulations/{id}/results(en GET per körning). För nätfiske per person lägger du till frågor förGET /v1/reporting/simulation_resultsochGET /v1/reporting/simulation_events(eller operativaGET /v1/simulation_resultsom du redan harsimulation:read). vectorspå/v1/simulationsplattas ut till en kommaseparerad sträng. En kolumn av listtyp kan inte användas som riktig dimension i utsnitt. Om en rapportsida behöver filtrera på vektor lägger du till en bryggtabell mellan simulering och vektor.
Nästa steg
Developer Hub
Skapa ett tjänstkonto och en API-nyckel för Power BI.
API-snabbstart
Autentisera
/v1-begäranden med Basic-autentisering.Paginering
Listkuvertet, markörtokens och filterstabilitet under en genomgång.
Hastighetsbegränsningar
Budgetar per nyckel och per IP, 429-kontraktet och vägledning om nya försök.

