Account
Read your plan limits, live usage counters, and your own exposure.
GET /site/access
Read public preview and dashboard protection status
Reports marketing preview and dashboard bot protection state without exposing signup controls or private configuration. No authentication is required. The response is not cacheable.
What comes back.
200 Current preview mode, dashboard protection state and preview search ceiling.
success boolean required
data object
marketing_mode boolean
dashboard_bot_protection boolean
Enables session-only dashboard verification independently of preview. Does not challenge API-key clients.
searches_per_minute integer
503 This surface is disabled or unreachable.
success boolean required
error string required
code string
Machine-readable error tag. Omitted whenever it is empty, which is most generic errors, so branch on status too.
One of quota_exceeded, hourly_limit, file_access_limit, plan_upgrade_required, upgrade_required, feature_not_enabled, marketing_mode, dashboard_verification_required, dashboard_verification_unavailable, bot_check_failed, email_verification_required, monitor_limit, monitor_surface_not_allowed, monitor_first_seen_not_allowed, monitor_webhook_invalid, monitor_webhook_not_allowed, monitor_webhook_key_required
POST /results/export
Authorize saving already-returned results
Requires an active paid entitlement, including covered team seats and custom deals. No per-account flag is needed for ordinary result exports. The user DTO's can_export reports this entitlement. Free accounts and admin roles alone do not qualify. Marketing preview disables every export surface, including for paid users, admins and explicit grants. No request body is needed and no result data is uploaded. This endpoint does not fetch, unmask, format or return search records and consumes no search quota. The web client saves its held results locally as JSON or CSV after authorization succeeds.
Export scope is the records already returned, not unseen search pages. Bulk exports include all records in the active term filter, including records on other local pages and unsuccessful terms. JSON preserves nested data; CSV expands bulk records into individual rows, uses JSON Pointer column paths, retains arrays as JSON cells, and puts common query/graph context on the first row only. Spreadsheet formula cells are escaped. Wide CSV exports exceeding 512 columns must use JSON. Social JSON and CSV omit unavailable-platform lists, including nested graph metadata; matched profiles and availability counts are retained. Export does not change the data's existing masking or filtering. This action grant cannot recall data already sent to a browser.
In the URL.
surface in query string required
The search surface whose held results will be saved.
One of breaches, bulk, social, devices, people
What comes back.
200 Current account may use result export; private, no-store.
success boolean required
data object
allowed boolean
One of true
400 A recognized surface query parameter is required.
401 Valid authentication is required.
403 Active paid entitlement required (plan_upgrade_required), or all exports are disabled during marketing preview (marketing_mode).
GET /me/exposure
Your own breach and stealer exposure
Breach and stealer hit counts for the authenticated account's own email address. The counts are computed once and then persisted on the account, so later calls read the stored figures rather than hitting upstream again. This endpoint consumes no quota.
What comes back.
200 Exposure counts. Also returned, with `has_email: false` and zero counts, when the account has no email address on file.
success boolean required
data object
breach_count integer
stealer_count integer
checked_at string, date-time
Omitted until both the breach leg and the stealer leg have completed; a leg that failed is retried on the next call.
has_email boolean
GET /search/stats
Live usage and plan limits
What comes back.
200 Usage counters plus the ceilings they reset against. Read `metering` first: it decides whether `lookups` is a pool shared by every surface or a breach-and-device figure. Then read the two clocks: `period` and `resets_at` govern the search counters, while `unlocks_period` and `unlocks_reset_at` govern `unlocks`.
success boolean required
data object
plan string
Starter is a retired legacy id and is not a checkout target.
One of free, basic, starter, professional, premium, team
marketing_mode boolean
True when temporary marketing access is active. Your search usage draws from the 10-search minute allowance, not paid counters.
metering string
Read this before any counter below, because it decides what
lookupsactually counts.pooled- every paid tier (Pro, Premium, Team) and any custom plan an admin authors. Onelookupspool is spent by breach search, device search, people search and API requests alike, and it resets daily.per_surface- the free tier only. Each surface holds its own small allowance:lookupsnarrows to mean breach and device searches only,people_searchesis its own counter,social_resolvesis its own, andunlocksexists. The three search counters reset daily, 10 apiece;unlocksholds 5 and resets weekly.During marketing preview,
pooledalso includes social resolves and the allowance resets every UTC calendar minute.One of pooled, per_surface
period string
The search reset cadence. Normal plans use
daily; marketing preview usesminute. It does not govern the separateunlocks_periodclock.One of minute, daily, weekly, monthly
unlocks_period string
The cadence the
unlockscounter resets on, deliberately not the search cadence: it readsweeklywhileperiodreadsdaily. Branch on this field rather than assuming the unlock balance refills alongside the searches.One of daily, weekly, monthly
lookups integer
lookups_limit integer
-1 = unlimited
people_searches integer
People searches spent in the current search period. It only moves under
per_surfacemetering; a pooled plan charges people search tolookupsand leaves this at zero.people_limit integer
0on every pooled plan, and there it means people search spends thelookupspool - not that the surface is locked. Underper_surfacemetering it is the real cap for the search period (10 a day on free).-1= unlimited.social_resolves integer
social_limit integer
-1 = unlimited
unlocks integer
Record unlocks spent in the current unlock period.
unlocks_limit integer
0on every paid plan, and there it means the plan has no unlock mechanism at all - not that unlocks are unlimited. Paid rows are not censored, so there is nothing to reveal. The free tier gets 2 a week, on the weekly clockunlocks_periodnames.-1= unlimited.monitors_limit integer
Saved-monitor ceiling, a hard cap rather than a counter that resets on either clock.
wildcard boolean
Whether this account may pass
wildcard: true.full_results boolean
Whether breach and device row values are unmasked. It says nothing about people search, which is uncensored on every plan. Access to values inside the per-device file browser is reported separately by
file_browser.people_full_profile boolean
Whether this account may resolve a
profile_idinto the full profile document. The drill-in is metered rather than plan-gated: it spends one unit of the people allowance, which is thelookupspool underpooledmetering andpeople_searchesunderper_surface.bulk_max_terms integer
0 = bulk disabled
social_max_depth integer
A capability rather than a counter: how many levels the recursive social resolver may expand for this account,
1on the free tier and3on paid. It bounds the reach of a single resolve instead of holding an allowance, so it never depletes and never resets on either clock. One submitted resolve spends one unit againstsocial_limithowever many levels it reaches.file_browser string
Empty means the per-device browser returns full structure with masked values.
fullmeans the values are returned.One of , full
raw_search boolean
monitor_webhooks boolean
api_access boolean
last_reset string, date-time
resets_at string, date-time
The last second of the current search period, the cadence
periodnames. It governs the search counters only. It is authoritative: use it as given rather than recomputing a boundary from it.unlocks_reset_at string, date-time
The last second of the current unlock period, the cadence
unlocks_periodnames, and so the instant the unlock allowance returns. It is a different instant fromresets_atand is authoritative in the same way.
GET /stealer/limits
Stealer-specific limits and usage
What comes back.
200 Plan + counter snapshot.
success boolean required
data object
plan string
Starter is a retired legacy id and is not a checkout target.
One of free, basic, starter, professional, premium, team
hourly_cap integer
0 = no per-hour cap
results_per_search integer
file_browser string
''= working browser with masked values, used by Free and Pro.full= real values, used by Premium and Team.One of , full
raw_search boolean