Employee breach exposure console for your security team

See every company email caught in a data breach, who still works here, and what your team has already fixed, all on one board.

App
Have I Been PwnedOktaSlack BotEngineeringOperationsResearch & MonitoringAI Reports
PromptCreate

Build me an employee breach exposure console that my security team opens every morning. It is a single standing board, not a scheduled report: one row for every email alias on our verified company domain that Have I Been Pwned has seen in a breach, with enough identity context and triage state that the team can work the list top to bottom and pick up where they left off the next day.

On load, call Have I Been Pwned Get Subscribed Domains to find the domains our subscription has verified, and if there is more than one, show a domain picker at the top with the first selected by default. For the selected domain, call Get Breached Email Addresses for a Domain, which returns each breached alias on the domain along with the list of breach names that alias appeared in. That response is the spine of the board: one row per alias.

The domain response only gives breach names, so resolve the details with Get a Single Breach for each distinct breach name across the whole result set, and cache those lookups so a breach shared by fifty people is fetched once. From the resolved breach records fill in each row's breach count, the most recent breach date, and the union of exposed data classes such as passwords, email addresses, phone numbers, or physical addresses.

Add a stealer log column. Call Get Stealer Logs by Email Domain once for the selected domain to find the aliases whose credentials were captured in infostealer logs, and flag those rows prominently, since a captured credential is a live password problem rather than a historical one.

Enrich every row from Okta. Pull the directory once with List Users using a SCIM search rather than making a call per row, and match rows to Okta users on login email. Show whether the person is still active, when they last signed in, and which groups they belong to, using Retrieve User for the per person detail view and List User Groups for group membership. Aliases with no matching Okta user, plus users whose Okta status is deprovisioned or suspended, count as dead accounts.

Separate dead accounts from live ones visually. A breached alias for someone who left the company two years ago is not the same emergency as a breached alias for an active admin, so put dead accounts in their own collapsed section below the live list or clearly de-emphasize them, and keep them out of the default risk ranking.

The app has to hold triage state itself, in its own storage, keyed by email alias so it survives reloads and page navigation and is shared across everyone on the team. Each row carries a status of New, Investigating, Password Reset, or Dismissed, an owner, and a free text notes field. Status and owner are editable inline from the row, notes from the row detail panel. Rows that appear for the first time on a later refresh default to New, and refreshing breach data must never overwrite triage state a teammate has already set.

Let people act straight from the row. Give each live row an Okta Expire User Password action that forces a password change at next sign in, and a Suspend User action that blocks sign in, both behind a confirmation step that names the person, and both disabled for dead accounts. After a successful password expiry, offer to move that row's status to Password Reset. Add multi select checkboxes and a button that pushes a summary of the selected rows into our security channel with the Slack Bot Send a Message operation, formatted as a readable list showing each person's alias, risk level, breach count, stealer log flag, Okta status, and current triage status and owner.

Put a Build remediation brief button on each person that kicks off a background agent for that one alias. The agent pulls their full history with Get Breaches for Account, Get Pastes for Account, and Get Stealer Logs by Email, reads the underlying breach records with Get a Single Breach so it can say exactly what was exposed in each one, then checks their Okta status, last sign in, and group membership with Retrieve User and List User Groups to work out whether they hold privileged access. It writes a ranked, plain English remediation brief back into the app on that person's row, stored with the row so the whole team can read it later and it survives reloads. The brief should lead with the single most urgent action, then list the specific exposures that justify it, then note anything reassuring such as the account already being deactivated. Show a pending state on the row while the agent runs, and show the finished brief in the row detail panel with the time it was generated and a re-run option.

Rank the default view by real risk rather than raw breach count. A recent stealer log capture is the strongest signal and should float to the top, followed by recent breaches whose exposed data classes include passwords. Weight recency so a password exposure from this year outranks one from 2013. Membership in a privileged Okta group raises the score. Old marketing or mailing list leaks that only exposed email addresses should sink to the bottom even when one person has a dozen of them. Show the computed risk level on each row with a short reason so the ranking is explainable, and let the team re-sort by breach count, most recent breach date, or triage status.

A few API details to respect. The domain endpoints only work on domains verified inside our Have I Been Pwned subscription, so if Get Subscribed Domains comes back empty, show an explanatory empty state telling the admin to verify a domain rather than an error. Treat a 404 from Have I Been Pwned as a clean result meaning no breaches or pastes were found, never as a failure. Request the full breach model rather than the truncated one so the exposed data classes are actually present. The domain search and domain stealer log endpoints have their own lower rate limits, so fetch them once per refresh and cache the results, and surface a friendly retry message on a rate limit rather than a stack trace.

What does this prompt do?

  • Lists every email address on your company domain caught in a known data breach, one row per person, ranked by real risk instead of raw breach count.
  • Shows what was exposed and when, and flags anyone whose password was captured by password-stealing malware.
  • Checks each person against your company directory so departed employees are clearly separated from active staff, with their last sign-in and group access in view.
  • Holds your team's status, owner, and notes on every row, lets you force a password reset or suspend an account on the spot, and writes a full remediation brief for anyone with one click.

What do I need to use this?

  • A paid Have I Been Pwned subscription with your company domain verified, which is what unlocks the company-wide view. Seeing malware-captured passwords needs a plan that includes stealer log data.
  • An Okta account for your company directory, with admin access so the app can look people up and reset or suspend accounts.
  • A Slack workspace and a channel where your security team wants summaries posted.

How can I customize it?

  • Change the statuses on the board to match how your team works, for example adding On Hold or Escalated next to New, Investigating, Password Reset, and Dismissed.
  • Adjust how risk is scored, such as weighting captured passwords more heavily or treating finance and IT admin groups as privileged.
  • Point the Slack summary at a different channel, or change what each summary line includes.

FAQs

Do I need a paid Have I Been Pwned plan for this?
Yes. The company-wide view only works on a domain you have verified inside a paid Have I Been Pwned subscription, because that is what proves the domain is yours. The column showing passwords captured by malware also needs a plan that includes stealer log data.
Will this show breaches on my team's personal email addresses?
No. It only covers email addresses on the company domain you have verified, so personal accounts stay out of it. Anyone can check a personal address themselves on the Have I Been Pwned website.
Do the notes and statuses stay put when I close the app?
Yes. The status, owner, and notes on each row are stored by the app itself and shared across your team, so you can pick up the next morning exactly where you left off. Refreshing the breach data never wipes out triage work a teammate has already done.
What happens to people who have already left the company?
They are pulled into their own separate section and kept out of the main risk ranking. A breached login for someone who left two years ago still matters for the record, but it is not the same emergency as a breached login for an active administrator.
Can it reset passwords or suspend people on its own?
No. Nothing happens automatically. Forcing a password change or suspending an account is a button on the row that asks you to confirm the person's name first, and those buttons are turned off for accounts that are already inactive.

Related templates

Review desk for portal forms your team still fills in by hand

Stage a batch of filings overnight, then approve each completed form from a screenshot before anything is ever submitted.

Kernel
Google Sheets
Slack Bot
App
Client-by-client cold email pipeline review for agencies

Pick a client and a date range to see sent, replies, meetings booked and the real deal value your cold email produced, campaign by campaign.

Instantly
HubSpot
Slack Bot
App
Audit what Intercom's Fin AI actually resolved before you pay

Review every conversation Fin closed as resolved, judge which ones actually stuck, and see what the gap is worth against your bill.

Intercom
Google Sheets
Slack Bot
App
One triage console for every Jira service desk queue

Merge your IT, HR and Facilities queues into one list ranked by SLA time left, then reply, change status and escalate without ever opening Jira.

Jira Service Management
Jira
Slack Bot
App
Run your Webflow site translations from one review desk

See every page's translation status at a glance, edit translations side by side with the English, and publish only what your team has actually approved.

Webflow
JigsawStack
Slack Bot
+1
App
Legal contract intake desk your teams use instead of email

One place for sales and ops to request an NDA or vendor agreement, watch its status, and let legal launch the contract in a single click.

Ironclad
Slack Bot
General Input Database
App

Stop chasing breached employee logins in a spreadsheet.

Give your security team one board that shows who is exposed, who still works here, and what has already been fixed.