One key, one gateway
Use a Dakidarts API key with read or write scopes and control which APIs that key can reach.
Have I Been Pwned and Pwned Passwords exposure checks for passwords, email/username identifiers, breach catalogs and paste data, with cached lookups and password k-anonymity.
0 of 14 endpoints have an upstream URL configured. Other routes return 503 before billing; only send live requests to configured routes. The gateway injects upstream credentials for you.
Live checkout opens after an API route has an upstream URL. Preview examples are available below.
https://api.dakidarts.com/dark-web-exposureX-API-Key: dk_live_...GET /passwordUse a Dakidarts API key with read or write scopes and control which APIs that key can reach.
Wallet credits, plan quotas and organization invoices are settled per request with transparent response headers.
Latency, upstream status and execution mode are logged so integration issues are visible before they spread.
Keep the direct Dakidarts gateway as your primary route, or use the RapidAPI listing when marketplace billing and key management fit your stack better.
The best API is the one your team can integrate, observe and then stop thinking about.
Designed as a composable building block for product teams, internal tooling and automation.
Designed as a composable building block for product teams, internal tooling and automation.
Designed as a composable building block for product teams, internal tooling and automation.
Selected facts about coverage, delivery and production readiness.
Access, billing and integration details for Dark Web Exposure API.
Credential and breach exposure signals associated with an identifier.
Email addresses and similar identifiers supported by the endpoint.
No. It returns exposure signals without exposing sensitive records.
It supports risk review, but your legal and compliance teams should define how results are used.
Subscribe on the Dakidarts dashboard, then call the gateway with an API key.
Plans are shown for reference. Live checkout opens after an API route has an upstream URL.
$0.00 / month
Start with a Dakidarts key, call the gateway, then monitor usage from the dashboard.
Choose the API scope, then copy the key into your server environment.
Send requests to https://api.dakidarts.com/dark-web-exposure with your key and JSON body.
Track calls, latency and spend from the API dashboard and wallet.
These routes include contracts imported from the product implementation. 0 of 14 endpoints have an upstream URL configured. Other routes return 503 before billing; saved examples are previews only. Configure an upstream URL in API Studio to enable those routes.
Operations endpoints sourced from the Dark Web Exposure API implementation.
/status
Health
SOURCE CONTRACT — UPSTREAM NEEDED
$0.0050 / call / 120 rpm
Upstream needed
Health check + service info. No parameters.
Snapshot from
docs/endpoints.mdfor source API version0.0.2. This is source documentation, not evidence that an upstream is deployed.
Health check + service info. No parameters.
Response 200
{
"ok": true,
"service": "Dark Web Exposure API",
"version": "0.0.2",
"time": "2026-08-09T07:23:06.000900",
"uptime_seconds": 1234,
"hibp_key_configured": true,
"cache": {
"scanned_identifiers": 312,
"password_hashes": 4091,
"hash_prefixes": 87,
"catalog_entries": 14
}
}
| Field | Meaning |
|---|---|
hibp_key_configured | Whether the server set HIBP_API_KEY |
cache.* | Row counts in the SQLite cache tables |
Source contract imported from dark web exposure/app.py. Handler: health. Reference: docs/endpoints.md.
{
"ok": true,
"time": "2026-08-09T07:23:06.000900",
"cache": {
"hash_prefixes": 87,
"catalog_entries": 14,
"password_hashes": 4091,
"scanned_identifiers": 312
},
"service": "Dark Web Exposure API",
"version": "0.0.2",
"uptime_seconds": 1234,
"hibp_key_configured": true
}curl -X GET https://api.dakidarts.com/dark-web-exposure/status -H 'X-API-Key: dk_live_...' -H 'Accept: application/json'
Cryptography endpoints sourced from the Dark Web Exposure API implementation.
/password
Check Password
SOURCE CONTRACT — UPSTREAM NEEDED
$0.0050 / call / 120 rpm
Upstream needed
Breach count for a single password (or pre-computed SHA-1). Cached 90 days.
Snapshot from
docs/endpoints.mdfor source API version0.0.2. This is source documentation, not evidence that an upstream is deployed.
Breach count for a single password (or pre-computed SHA-1). Cached 90 days.
GET — query params:
| Param | Type | Required | Meaning |
|---|---|---|---|
password | string | either | The plaintext password to check |
sha1_hash | string | either | 40-hex uppercase/lowercase SHA-1 |
include_hash | boolean | no | Also return the uppercase SHA-1 |
POST — JSON body:
{ "password": "testing 123", "include_hash": true }
include_hash defaults to false. If both password and sha1_hash are given, password wins. Never pass both to avoid ambiguity.
Response 200
{
"ok": true,
"breach_count": 33,
"breached": true,
"cached": false,
"checked_at": "2026-08-09T07:23:10.235727",
"sha1_hash": "B8DFB080BC33FB564249E34252BF143D88FC018F"
}
| Field | Meaning |
|---|---|
breach_count | How many times the password appears in breach dumps |
breached | breach_count > 0 |
cached | true = served from SQLite, no upstream call |
sha1_hash | Only present when include_hash: true |
Errors: missing_input 400, password_too_long 400, invalid_hash 400.
Security note:
GET /password?password=...places the password in the URL where
it may be logged by proxies. Prefer
POSTfor plaintext.
Source contract imported from dark web exposure/app.py. Handler: check_password. Reference: docs/endpoints.md.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
password | query | string | No | The plaintext password to check |
sha1_hash | query | string | No | 40-hex uppercase/lowercase SHA-1 |
include_hash | query | boolean | No | Also return the uppercase SHA-1 |
curl -X GET https://api.dakidarts.com/dark-web-exposure/password -H 'X-API-Key: dk_live_...' -H 'Accept: application/json'
/password
Check Password
SOURCE CONTRACT — UPSTREAM NEEDED
$0.0050 / call / 120 rpm
Upstream needed
Breach count for a single password (or pre-computed SHA-1). Cached 90 days.
Snapshot from
docs/endpoints.mdfor source API version0.0.2. This is source documentation, not evidence that an upstream is deployed.
Breach count for a single password (or pre-computed SHA-1). Cached 90 days.
GET — query params:
| Param | Type | Required | Meaning |
|---|---|---|---|
password | string | either | The plaintext password to check |
sha1_hash | string | either | 40-hex uppercase/lowercase SHA-1 |
include_hash | boolean | no | Also return the uppercase SHA-1 |
POST — JSON body:
{ "password": "testing 123", "include_hash": true }
include_hash defaults to false. If both password and sha1_hash are given, password wins. Never pass both to avoid ambiguity.
Response 200
{
"ok": true,
"breach_count": 33,
"breached": true,
"cached": false,
"checked_at": "2026-08-09T07:23:10.235727",
"sha1_hash": "B8DFB080BC33FB564249E34252BF143D88FC018F"
}
| Field | Meaning |
|---|---|
breach_count | How many times the password appears in breach dumps |
breached | breach_count > 0 |
cached | true = served from SQLite, no upstream call |
sha1_hash | Only present when include_hash: true |
Errors: missing_input 400, password_too_long 400, invalid_hash 400.
Security note:
GET /password?password=...places the password in the URL where
it may be logged by proxies. Prefer
POSTfor plaintext.
Source contract imported from dark web exposure/app.py. Handler: check_password. Reference: docs/endpoints.md.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
password | body | string | No | The plaintext password to check |
sha1_hash | body | string | No | 40-hex uppercase/lowercase SHA-1 |
include_hash | body | boolean | No | Also return the uppercase SHA-1 |
{
"ok": true,
"cached": false,
"breached": true,
"sha1_hash": "B8DFB080BC33FB564249E34252BF143D88FC018F",
"checked_at": "2026-08-09T07:23:10.235727",
"breach_count": 33
}curl -X POST https://api.dakidarts.com/dark-web-exposure/password -H 'X-API-Key: dk_live_...' -H 'Accept: application/json' -H 'Content-Type: application/json' -d '{"password": "example", "sha1_hash": "example", "include_hash": "example"}'
Batch operations endpoints sourced from the Dark Web Exposure API implementation.
/passwords/batch
Check Passwords Batch
SOURCE CONTRACT — UPSTREAM NEEDED
$0.0050 / call / 120 rpm
Upstream needed
Breach counts for up to **100** passwords in one request. Uses k-anonymity: passwords are grouped by SHA-1 prefix, each unique prefix is fetched from HIBP once, and counts are resolved locally — the full hash never leaves your server.
Snapshot from
docs/endpoints.mdfor source API version0.0.2. This is source documentation, not evidence that an upstream is deployed.
Breach counts for up to 100 passwords in one request. Uses k-anonymity: passwords are grouped by SHA-1 prefix, each unique prefix is fetched from HIBP once, and counts are resolved locally — the full hash never leaves your server.
Body
{
"passwords": ["password", "testing 123", "uniquepass_9x3z7q2"],
"include_hashes": true
}
| Field | Type | Required | Meaning |
|---|---|---|---|
passwords | array | yes | 1–100 strings, max 1024 chars each |
include_hashes | boolean | no | Include each password's SHA-1 |
Response 200
{
"ok": true,
"results": [
{ "index": 0, "breach_count": 52372427, "breached": true, "sha1_hash": "5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8" },
{ "index": 1, "breach_count": 33, "breached": true, "sha1_hash": "B8DFB080BC33FB564249E34252BF143D88FC018F" },
{ "index": 2, "breach_count": 0, "breached": false, "sha1_hash": "1E14F1610264EE9A05F26E0B59D2BC9732DEE8B9" }
],
"total": 3,
"upstream_calls": 2
}
results mirrors the input order; index is the position in passwords. upstream_calls reports how many actual HIBP requests were needed (helps you see cache efficiency).
Errors: missing_input 400, batch_too_large 400, invalid_input 400, password_too_long 400.
Source contract imported from dark web exposure/app.py. Handler: check_passwords_batch. Reference: docs/endpoints.md.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
passwords | body | array | Yes | 1–100 strings, max 1024 chars each |
include_hashes | body | boolean | No | Include each password's SHA-1 |
{
"ok": true,
"total": 3,
"results": [
{
"index": 0,
"breached": true,
"sha1_hash": "5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8",
"breach_count": 52372427
},
{
"index": 1,
"breached": true,
"sha1_hash": "B8DFB080BC33FB564249E34252BF143D88FC018F",
"breach_count": 33
},
{
"index": 2,
"breached": false,
"sha1_hash": "1E14F1610264EE9A05F26E0B59D2BC9732DEE8B9",
"breach_count": 0
}
],
"upstream_calls": 2
}curl -X POST https://api.dakidarts.com/dark-web-exposure/passwords/batch -H 'X-API-Key: dk_live_...' -H 'Accept: application/json' -H 'Content-Type: application/json' -d '{"passwords": "example", "include_hashes": "example"}'
/scan/batch
Scan Batch
SOURCE CONTRACT — UPSTREAM NEEDED
$0.0050 / call / 120 rpm
Upstream needed
Breach scans for up to **25** identifiers in one request. Results are returned per-identifier; one bad identifier does not fail the batch — it gets an `error` entry. Uncached identifiers are throttled at `SCAN_THROTTLE` (default 1.5 s, HIBP's rate limit), so a fully-uncached batch takes ~38 s max.
Snapshot from
docs/endpoints.mdfor source API version0.0.2. This is source documentation, not evidence that an upstream is deployed.
Breach scans for up to 25 identifiers in one request. Results are returned per-identifier; one bad identifier does not fail the batch — it gets an error entry. Uncached identifiers are throttled at SCAN_THROTTLE (default 1.5 s, HIBP's rate limit), so a fully-uncached batch takes ~38 s max.
Body
{
"identifiers": ["[email protected]", "[email protected]", "adobe.com"],
"include_pastes": true
}
| Field | Type | Required | Meaning |
|---|---|---|---|
identifiers | array | yes | 1–25 strings (emails, usernames, domains) |
include_hashes | boolean | no | Include password_hash/hash_alg in findings |
include_pastes | boolean | no | Include pastebin exposure for email/username items |
Response 200
{
"ok": true,
"results": [
{ "index": 0, "input": { "type": "email", "value": "[email protected]" },
"breach_status": "exposed", "breach_count": 3, "sources": ["Adobe", "LinkedIn"],
"findings": [ { "name": "Adobe", "..." : "..." } ], "pastes": [ ],
"cached": false, "checked_at": "2026-08-09T07:30:00.000000" },
{ "index": 1, "input": { "value": "[email protected]" },
"error": { "code": "hibp_key_required", "message": "HIBP_API_KEY env var is not set; account scans are unavailable." } },
{ "index": 2, "input": { "type": "domain", "value": "adobe.com" },
"breach_status": "exposed", "breach_count": 5, "sources": ["Adobe"], "findings": [ ], "pastes": null,
"cached": true, "checked_at": "2026-08-09T07:30:00.000000" }
],
"total": 3,
"upstream_calls": 2
}
Each results entry is the same shape as a single /scan response, or an error object when that identifier failed. upstream_calls reports how many HIBP requests were actually made.
Errors: missing_input 400, batch_too_large 400, invalid_input 400.
In production, gunicorn is configured with
--timeout 120so slow uncached
batches complete without being killed (see deployment.md).
Handler compatibility: The POST handler also accepts hibp_api_key as a query parameter; prefer the X-HIBP-API-Key header because query strings may be logged.
Source contract imported from dark web exposure/app.py. Handler: scan_batch. Reference: docs/endpoints.md.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
identifiers | body | array | Yes | 1–25 strings (emails, usernames, domains) |
include_hashes | body | boolean | No | Include `password_hash`/`hash_alg` in findings |
include_pastes | body | boolean | No | Include pastebin exposure for email/username items |
X-HIBP-API-Key | header | string | No | Optional Have I Been Pwned API key for premium breach/paste access. |
hibp_api_key | query | string | No | Compatibility fallback for the Have I Been Pwned key; prefer the X-HIBP-API-Key header to avoid exposing credentials in URLs. |
curl -X POST https://api.dakidarts.com/dark-web-exposure/scan/batch -H 'X-API-Key: dk_live_...' -H 'Accept: application/json' -H 'X-HIBP-API-Key: YOUR_X_HIBP_API_KEY' -H 'Content-Type: application/json' -d '{"identifiers": "example", "include_hashes": "example", "include_pastes": "example"}'
Passwords endpoints sourced from the Dark Web Exposure API implementation.
/passwords/range
Password Range
SOURCE CONTRACT — UPSTREAM NEEDED
$0.0050 / call / 120 rpm
Upstream needed
k-anonymity search: given a 5-character SHA-1 prefix, returns every matching hash suffix and its breach count. Enables clients to check passwords **without sending them** or their full hash.
Snapshot from
docs/endpoints.mdfor source API version0.0.2. This is source documentation, not evidence that an upstream is deployed.
k-anonymity search: given a 5-character SHA-1 prefix, returns every matching hash suffix and its breach count. Enables clients to check passwords **without sending them** or their full hash.
Query params (provide exactly one):
| Param | Type | Meaning |
|---|---|---|
prefix | string | 5 hex chars, e.g. B8DFB |
hash | string | 40-hex SHA-1; the first 5 chars are used |
Response 200
{
"ok": true,
"prefix": "B8DFB",
"suffixes": {
"0026A114E9A357BFB0D38916287208E2B81": 46,
"00878CA72A19BDAED187D554A45B5C46011": 8
},
"suffix_count": 1957,
"cached": true
}
suffixes — map of the remaining 35 hash chars → breach count.hash[5:], look it up in suffixes. 0 or missing means not breached.
Errors: invalid_hash 400, invalid_prefix 400.
Input rule: Supply either a five-character prefix or a full 40-character hash; the source derives the prefix from the hash.
Source contract imported from dark web exposure/app.py. Handler: password_range. Reference: docs/endpoints.md.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
prefix | query | string | No | 5 hex chars, e.g. `B8DFB` |
hash | query | string | No | 40-hex SHA-1; the first 5 chars are used |
{
"ok": true,
"cached": true,
"prefix": "B8DFB",
"suffixes": {
"0026A114E9A357BFB0D38916287208E2B81": 46,
"00878CA72A19BDAED187D554A45B5C46011": 8
},
"suffix_count": 1957
}curl -X GET https://api.dakidarts.com/dark-web-exposure/passwords/range -H 'X-API-Key: dk_live_...' -H 'Accept: application/json'
Analysis endpoints sourced from the Dark Web Exposure API implementation.
/scan
Scan
SOURCE CONTRACT — UPSTREAM NEEDED
$0.0050 / call / 120 rpm
Upstream needed
Breach scan for an **email**, **username**, or **domain**. Cached 90 days per identifier. Legacy params `email`/`username`/`domain` are also accepted in the POST body for backward compatibility.
Snapshot from
docs/endpoints.mdfor source API version0.0.2. This is source documentation, not evidence that an upstream is deployed.
Breach scan for an email, username, or domain. Cached 90 days per identifier. Legacy params email/username/domain are also accepted in the POST body for backward compatibility.
GET — query params:
| Param | Type | Required | Meaning |
|---|---|---|---|
identifier | string | yes | email, username, or domain |
include_hashes | boolean | no | Return password_hash/hash_alg fields |
include_pastes | boolean | no | Also return pastebin exposure (email/username only) |
POST — JSON body:
{ "identifier": "[email protected]", "include_pastes": true }
Type detection: [email protected] → email; example.com / sub.example.com → domain; alice_doe → username.
Response 200 (domain scan)
{
"ok": true,
"input": { "type": "domain", "value": "adobe.com" },
"breach_status": "exposed",
"breach_count": 5,
"sources": ["Adobe", "Adobe Creative Cloud"],
"findings": [
{
"name": "Adobe",
"title": "Adobe",
"domain": "adobe.com",
"first_seen": "2013-10-04",
"added_date": "2013-10-04T00:00:00Z",
"last_seen": "2013-10-04T00:00:00Z",
"pwn_count": 152445165,
"description": "In October 2013, 153 million Adobe accounts...",
"data_classes": ["Email addresses", "Password hints", "Passwords"],
"is_verified": true,
"is_fabricated": false,
"is_sensitive": false,
"is_retired": false,
"is_spam_list": false,
"is_malware": false
}
],
"pastes": null,
"cached": false,
"checked_at": "2026-08-09T07:30:00.000000"
}
| Field | Meaning |
|---|---|
breach_status | exposed, safe (email/username found nothing), or not_found (domain not in breach catalog) |
breach_count | Number of breach sources |
sources | Short list of breach names |
findings | Full breach records (see fields above) |
pastes | null unless include_pastes; then an array of paste records |
Without include_hashes, findings entries omit password_hash/hash_alg. (HIBP does not currently return password hashes in account responses; these fields exist for forward compatibility.)
Errors: missing_identifier 400, invalid_identifier 400, hibp_key_required 503, hibp_rate_limited 429, hibp_error/upstream_error 502.
The HIBP key is only required for email/username scans. Domain scans use
the public breach catalog.
Handler compatibility: The POST handler also accepts hibp_api_key as a query parameter; prefer the X-HIBP-API-Key header because query strings may be logged.
POST input rule: Supply one of identifier, email, username, or domain; the latter three are legacy alternatives.
Source contract imported from dark web exposure/app.py. Handler: scan. Reference: docs/endpoints.md.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
identifier | query | string | Yes | email, username, or domain |
include_hashes | query | boolean | No | Return `password_hash`/`hash_alg` fields |
include_pastes | query | boolean | No | Also return pastebin exposure (email/username only) |
X-HIBP-API-Key | header | string | No | Optional Have I Been Pwned API key for premium breach/paste access. |
hibp_api_key | query | string | No | Optional Have I Been Pwned API key supplied as a query parameter. |
curl -X GET https://api.dakidarts.com/dark-web-exposure/scan -H 'X-API-Key: dk_live_...' -H 'Accept: application/json' -H 'X-HIBP-API-Key: YOUR_X_HIBP_API_KEY'
/scan
Scan
SOURCE CONTRACT — UPSTREAM NEEDED
$0.0050 / call / 120 rpm
Upstream needed
Breach scan for an **email**, **username**, or **domain**. Cached 90 days per identifier. Legacy params `email`/`username`/`domain` are also accepted in the POST body for backward compatibility.
Snapshot from
docs/endpoints.mdfor source API version0.0.2. This is source documentation, not evidence that an upstream is deployed.
Breach scan for an email, username, or domain. Cached 90 days per identifier. Legacy params email/username/domain are also accepted in the POST body for backward compatibility.
GET — query params:
| Param | Type | Required | Meaning |
|---|---|---|---|
identifier | string | yes | email, username, or domain |
include_hashes | boolean | no | Return password_hash/hash_alg fields |
include_pastes | boolean | no | Also return pastebin exposure (email/username only) |
POST — JSON body:
{ "identifier": "[email protected]", "include_pastes": true }
Type detection: [email protected] → email; example.com / sub.example.com → domain; alice_doe → username.
Response 200 (domain scan)
{
"ok": true,
"input": { "type": "domain", "value": "adobe.com" },
"breach_status": "exposed",
"breach_count": 5,
"sources": ["Adobe", "Adobe Creative Cloud"],
"findings": [
{
"name": "Adobe",
"title": "Adobe",
"domain": "adobe.com",
"first_seen": "2013-10-04",
"added_date": "2013-10-04T00:00:00Z",
"last_seen": "2013-10-04T00:00:00Z",
"pwn_count": 152445165,
"description": "In October 2013, 153 million Adobe accounts...",
"data_classes": ["Email addresses", "Password hints", "Passwords"],
"is_verified": true,
"is_fabricated": false,
"is_sensitive": false,
"is_retired": false,
"is_spam_list": false,
"is_malware": false
}
],
"pastes": null,
"cached": false,
"checked_at": "2026-08-09T07:30:00.000000"
}
| Field | Meaning |
|---|---|
breach_status | exposed, safe (email/username found nothing), or not_found (domain not in breach catalog) |
breach_count | Number of breach sources |
sources | Short list of breach names |
findings | Full breach records (see fields above) |
pastes | null unless include_pastes; then an array of paste records |
Without include_hashes, findings entries omit password_hash/hash_alg. (HIBP does not currently return password hashes in account responses; these fields exist for forward compatibility.)
Errors: missing_identifier 400, invalid_identifier 400, hibp_key_required 503, hibp_rate_limited 429, hibp_error/upstream_error 502.
The HIBP key is only required for email/username scans. Domain scans use
the public breach catalog.
Handler compatibility: The POST handler also accepts hibp_api_key as a query parameter; prefer the X-HIBP-API-Key header because query strings may be logged.
POST input rule: Supply one of identifier, email, username, or domain; the latter three are legacy alternatives.
Source contract imported from dark web exposure/app.py. Handler: scan. Reference: docs/endpoints.md.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
identifier | body | string | No | Primary email, username, or domain input; POST also accepts one legacy alias field. |
include_hashes | body | boolean | No | Return `password_hash`/`hash_alg` fields |
include_pastes | body | boolean | No | Also return pastebin exposure (email/username only) |
X-HIBP-API-Key | header | string | No | Optional Have I Been Pwned API key for premium breach/paste access. |
email | body | string | No | Email address to check for breach exposure. |
username | body | string | No | Username/account identifier to check for exposure. |
domain | body | string | No | Domain name to search for matching breach records. |
hibp_api_key | query | string | No | Compatibility fallback for the Have I Been Pwned key; prefer the X-HIBP-API-Key header to avoid exposing credentials in URLs. |
{
"identifier": "adobe.com",
"include_pastes": false
}{
"ok": true,
"input": {
"type": "domain",
"value": "adobe.com"
},
"cached": false,
"pastes": null,
"sources": [
"Adobe",
"Adobe Creative Cloud"
],
"findings": [
{
"name": "Adobe",
"title": "Adobe",
"domain": "adobe.com",
"last_seen": "2013-10-04T00:00:00Z",
"pwn_count": 152445165,
"added_date": "2013-10-04T00:00:00Z",
"first_seen": "2013-10-04",
"is_malware": false,
"is_retired": false,
"description": "In October 2013, 153 million Adobe accounts...",
"is_verified": true,
"data_classes": [
"Email addresses",
"Password hints",
"Passwords"
],
"is_sensitive": false,
"is_spam_list": false,
"is_fabricated": false
}
],
"checked_at": "2026-08-09T07:30:00.000000",
"breach_count": 5,
"breach_status": "exposed"
}curl -X POST https://api.dakidarts.com/dark-web-exposure/scan -H 'X-API-Key: dk_live_...' -H 'Accept: application/json' -H 'X-HIBP-API-Key: YOUR_X_HIBP_API_KEY' -H 'Content-Type: application/json' -d '{"identifier": "adobe.com", "include_pastes": false}'
Breaches endpoints sourced from the Dark Web Exposure API implementation.
/breaches
List Breaches
SOURCE CONTRACT — UPSTREAM NEEDED
$0.0050 / call / 120 rpm
Upstream needed
Full breach catalog. Optional `?domain=` filter limits results to breaches involving that domain. Cached 1 day (per domain value).
Snapshot from
docs/endpoints.mdfor source API version0.0.2. This is source documentation, not evidence that an upstream is deployed.
Full breach catalog. Optional ?domain= filter limits results to breaches involving that domain. Cached 1 day (per domain value).
curl "http://localhost:8000/breaches"
curl "http://localhost:8000/breaches?domain=linkedin.com"
Response 200
{
"ok": true,
"count": 923,
"domain": null,
"cached": true,
"breaches": [
{ "Name": "Adobe", "Domain": "adobe.com", "BreachDate": "2013-10-04", "PwnCount": 152445165, "DataClasses": ["Email addresses", "Passwords"], "...": "..." }
]
}
Breach entries use HIBP's field names (Name, Title, Domain, BreachDate, AddedDate, ModifiedDate, PwnCount, Description, LogoPath, DataClasses, IsVerified, IsFabricated, IsSensitive, IsRetired, IsSpamList, IsMalware).
Errors: upstream_error 502.
Source contract imported from dark web exposure/app.py. Handler: list_breaches. Reference: docs/endpoints.md.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
domain | query | string | No | Domain name to search for matching breach records. |
curl -X GET https://api.dakidarts.com/dark-web-exposure/breaches -H 'X-API-Key: dk_live_...' -H 'Accept: application/json'
/breaches/latest
Latest Breaches
SOURCE CONTRACT — UPSTREAM NEEDED
$0.0050 / call / 120 rpm
Upstream needed
The most recently *added* breaches (sorted by HIBP `AddedDate`, newest first). Shares the same 1-day catalog cache as `/breaches`, so it costs nothing extra after a catalog fetch.
Snapshot from
docs/endpoints.mdfor source API version0.0.2. This is source documentation, not evidence that an upstream is deployed.
The most recently *added* breaches (sorted by HIBP AddedDate, newest first). Shares the same 1-day catalog cache as /breaches, so it costs nothing extra after a catalog fetch.
curl "http://localhost:8000/breaches/latest?limit=10"
Query params
| Param | Type | Required | Meaning |
|---|---|---|---|
limit | integer | no | 1–50, default 10 |
Response 200
{
"ok": true,
"count": 10,
"limit": 10,
"cached": true,
"breaches": [ { "Name": "NewBreach", "AddedDate": "2026-08-01T00:00:00Z", "...": "..." } ]
}
Errors: invalid_limit 400, upstream_error 502.
Source contract imported from dark web exposure/app.py. Handler: latest_breaches. Reference: docs/endpoints.md.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
limit | query | integer | No | 1–50, default 10 |
curl -X GET https://api.dakidarts.com/dark-web-exposure/breaches/latest -H 'X-API-Key: dk_live_...' -H 'Accept: application/json'
/breaches/{breach_name}
Single Breach
SOURCE CONTRACT — UPSTREAM NEEDED
$0.0050 / call / 120 rpm
Upstream needed
Details for a single named breach. Cached 1 day.
Snapshot from
docs/endpoints.mdfor source API version0.0.2. This is source documentation, not evidence that an upstream is deployed.
Details for a single named breach. Cached 1 day.
curl "http://localhost:8000/breaches/Adobe"
Response 200
{
"ok": true,
"cached": false,
"breach": { "Name": "Adobe", "Domain": "adobe.com", "PwnCount": 152445165, "...": "..." }
}
Errors: invalid_name 400, breach_not_found 404, upstream_error 502.
Source contract imported from dark web exposure/app.py. Handler: single_breach. Reference: docs/endpoints.md.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
breach_name | path | string | Yes | Breach name supplied in the URL path. |
curl -X GET https://api.dakidarts.com/dark-web-exposure/breaches/ExampleBreach -H 'X-API-Key: dk_live_...' -H 'Accept: application/json'
Pastes endpoints sourced from the Dark Web Exposure API implementation.
/pastes/{account}
Account Pastes
SOURCE CONTRACT — UPSTREAM NEEDED
$0.0050 / call / 120 rpm
Upstream needed
Pastebin exposure for an email address or username. Requires `HIBP_API_KEY`. Cached 1 day.
Snapshot from
docs/endpoints.mdfor source API version0.0.2. This is source documentation, not evidence that an upstream is deployed.
Pastebin exposure for an email address or username. Requires HIBP_API_KEY. Cached 1 day.
curl "http://localhost:8000/pastes/[email protected]"
Response 200
{
"ok": true,
"account": "[email protected]",
"count": 2,
"cached": false,
"pastes": [
{
"Id": "abcdef1234",
"Source": "Pastebin",
"Title": "dumps",
"Date": "2023-01-15T00:00:00Z",
"EmailCount": 34
}
]
}
Errors: hibp_key_required 503, invalid_account 400, hibp_error/upstream_error 502.
Input rule: Supply the HIBP key in either X-HIBP-API-Key or the compatibility hibp_api_key query parameter; prefer the header.
Source contract imported from dark web exposure/app.py. Handler: account_pastes. Reference: docs/endpoints.md.
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-HIBP-API-Key | header | string | No | Required for this endpoint; send the HIBP key using this header or the compatibility query parameter. |
hibp_api_key | query | string | No | Required for this endpoint; send the HIBP key using this header or the compatibility query parameter. |
account | path | string | Yes | Email address or account identifier to search for pastes. |
{
"ok": true,
"count": 2,
"cached": false,
"pastes": [
{
"Id": "abcdef1234",
"Date": "2023-01-15T00:00:00Z",
"Title": "dumps",
"Source": "Pastebin",
"EmailCount": 34
}
],
"account": "[email protected]"
}curl -X GET https://api.dakidarts.com/dark-web-exposure/pastes/dev%40example.com -H 'X-API-Key: dk_live_...' -H 'Accept: application/json' -H 'X-HIBP-API-Key: YOUR_X_HIBP_API_KEY'
Data Classes endpoints sourced from the Dark Web Exposure API implementation.
/data_classes
Data Classes
SOURCE CONTRACT — UPSTREAM NEEDED
$0.0050 / call / 120 rpm
Upstream needed
The fixed list of data classes HIBP uses (e.g. `Email addresses`, `Passwords`, `Dates of birth`). Cached 30 days. Useful for building filters in client apps.
Snapshot from
docs/endpoints.mdfor source API version0.0.2. This is source documentation, not evidence that an upstream is deployed.
The fixed list of data classes HIBP uses (e.g. Email addresses, Passwords, Dates of birth). Cached 30 days. Useful for building filters in client apps.
Response 200
{ "ok": true, "count": 53, "cached": true, "data_classes": ["Account balances", "..."] }
Source contract imported from dark web exposure/app.py. Handler: data_classes. Reference: docs/endpoints.md.
curl -X GET https://api.dakidarts.com/dark-web-exposure/data_classes -H 'X-API-Key: dk_live_...' -H 'Accept: application/json'
Stats endpoints sourced from the Dark Web Exposure API implementation.
/stats
Stats
SOURCE CONTRACT — UPSTREAM NEEDED
$0.0050 / call / 120 rpm
Upstream needed
Server-side usage analytics: per-endpoint request counters, cache sizes, uptime. Useful to watch from your own monitoring (RapidAPI's dashboard shows its own numbers).
Snapshot from
docs/endpoints.mdfor source API version0.0.2. This is source documentation, not evidence that an upstream is deployed.
Server-side usage analytics: per-endpoint request counters, cache sizes, uptime. Useful to watch from your own monitoring (RapidAPI's dashboard shows its own numbers).
Response 200
{
"ok": true,
"uptime_seconds": 86400,
"total_requests": 15403,
"endpoint_usage": [
{ "endpoint": "/password", "hits": 8200, "last_hit": "2026-08-09T07:30:00.000000" },
{ "endpoint": "/passwords/batch", "hits": 3121, "last_hit": "2026-08-09T07:29:00.000000" }
],
"cache_entries": { "breaches": 312, "passwords": 4091, "password_ranges": 87, "catalog": 14 }
}
Source contract imported from dark web exposure/app.py. Handler: stats. Reference: docs/endpoints.md.
{
"ok": true,
"cache_entries": {
"catalog": 14,
"breaches": 312,
"passwords": 4091,
"password_ranges": 87
},
"endpoint_usage": [
{
"hits": 8200,
"endpoint": "/password",
"last_hit": "2026-08-09T07:30:00.000000"
},
{
"hits": 3121,
"endpoint": "/passwords/batch",
"last_hit": "2026-08-09T07:29:00.000000"
}
],
"total_requests": 15403,
"uptime_seconds": 86400
}curl -X GET https://api.dakidarts.com/dark-web-exposure/stats -H 'X-API-Key: dk_live_...' -H 'Accept: application/json'
No endpoints match that search. Clear the search to see all routes.
Edit a JSON request to validate its syntax and preview the published sample response. This stays in your browser; it never calls the live API or uses credits.
The preview checks JSON syntax and shows the saved example response; it does not execute request values.
These are integration templates, not runnable sample calls. Configure an endpoint upstream in API Studio, then replace the placeholder path. Saved samples stay preview-only.
# Replace with a connected GET route and include any required parameters.
curl -X GET "https://api.dakidarts.com/dark-web-exposure/v1/your-connected-endpoint" \
-H "X-API-Key: dk_live_..." \
-H "Accept: application/json"
# Replace with a connected GET route and include any required parameters.
import requests
headers = {"X-API-Key": "dk_live_..."}
response = requests.get("https://api.dakidarts.com/dark-web-exposure/v1/your-connected-endpoint", headers=headers)
print(response.json())
// Replace with a connected GET route and include any required parameters.
const res = await fetch("https://api.dakidarts.com/dark-web-exposure/v1/your-connected-endpoint", {
headers: { "X-API-Key": "dk_live_..." }
});
const data = await res.json();
console.log(data);
<?php
// Replace with a connected GET route and include any required parameters.
$ch = curl_init("https://api.dakidarts.com/dark-web-exposure/v1/your-connected-endpoint");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["X-API-Key: dk_live_..."]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);