{"openapi":"3.1.0","info":{"title":"LeakRadar.io API","description":"Easily interact with the LeakRadar.io platform via its public API.\n\n- **Endpoint**: `https://api.leakradar.io`\n- **Python 3 wrapper**: [leakradar-wrapper](https://github.com/LeakRadar/leakradar-wrapper)\n- **API key**: generate yours from the [dashboard](https://members.leakradar.io/settings?tab=api-key) (paid plan required)\n\n---\n\n## Rate limits\n\nLeakRadar enforces **four layers** of rate limiting:\n\n1. **Edge**: 30 requests/second per IP (burst allowance of 30) and 30 simultaneous connections per IP, on every endpoint. Excess requests get a bare HTTP **429**, excess connections a bare HTTP **503**, neither with a JSON body.\n2. **Burst (per-second)**: anti-DDoS, fixed across all plans. Counted per account owner on `/search/*` when the request carries an API key, per IP everywhere else.\n3. **Daily request cap**: commercial quota, scaled per plan, counted per account owner.\n4. **Concurrent heavy searches**: protects the search backend, scaled per plan, counted per account owner.\n\nTeam members share the account owner's buckets on layers 2, 3 and 4.\n\nExceeding layer 2, 3 or 4 returns HTTP **429** with a `Retry-After` header and a JSON body.\n\n> ⚠️ **Error responses get your IP banned for 1 hour at the edge.** The trigger is 30 responses with status 403, 404, 405, 429 or 444 within 60 seconds from the same IP, across all endpoints: 429 is only one of the counted statuses, so a loop of 403 or 404 gets you banned just as fast. While banned, every request is blocked before reaching the API (a plain error page, no JSON response). Back off as soon as you receive a 429, and stop replaying calls that answer 403 or 404.\n\n### Burst (per-second)\n\n| Context | Limit | Counted by |\n|---------|-------|------------|\n| Any endpoint outside `/search` (global burst) | 60 req/sec | IP |\n| `/search/*`, account without an active paid plan, or anonymous | 5 req/sec | account owner (IP when anonymous) |\n| `/search/*`, account with an active paid plan | 30 req/sec | account owner |\n| `POST /search/email`, `GET /search/domain/{domain}/...`, `POST /search/dark-web`, `GET /password-range` | 30 req/sec | account owner |\n| `POST /search/advanced`, `POST /search/advanced/export`, `POST /search/advanced/export_urls` | 5 req/sec | account owner |\n| `POST /search/raw` | 5 req/sec | account owner |\n| `POST /search/email/unlock`, `POST /search/domain/{domain}/{leak_type}/unlock`, `POST /search/advanced/unlock` and their `/unlock/task` variants | 10 req/sec | account owner |\n| `POST /search/emails/locked-exists`, `POST /search/domains/locked-exists` | 1 req/sec | account owner |\n| `PUT /profile/unlocked/{leak_id}/list`, `PUT /profile/unlocked/{leak_id}/status` | 2 req/sec | account owner |\n\nThe lines are cumulative and the strictest one wins: a paid account calling `POST /search/domains/locked-exists` is capped at 1 req/sec even though `/search/*` allows 30, and the edge layer (30 req/sec per IP) applies on top of every line. `POST /unlock` carries no per-account burst of its own and falls back to the 60 req/sec global line.\n\n### Daily request cap\n\nA **rolling 24-hour** counter per account, shared across team members, rolling over hour by hour (no fixed midnight reset).\n\nIt counts more than searches. Every request served by one of these endpoints is counted:\n\n- the search endpoints: `POST /search/email`, the `GET /search/domain/{domain}/...` family, `POST /search/advanced`, `POST /search/raw`, `POST /search/raw/count`, `POST /search/dark-web` and the dark web helpers;\n- the batch checks `POST /search/emails/locked-exists` and `POST /search/domains/locked-exists`;\n- the export endpoints of those families: queuing an export is itself a counted request;\n- `GET /search/domain/{domain}/report/pdf`;\n- the raw browsing endpoints: `GET /search/raw/parts`, `GET /search/raw/part`, `GET /container/tree`, `GET /container/subfolders`, `GET /container/file_info`, `POST /container/tree/resolve_path`, `GET /raw/files`, `POST /raw/download`, `GET /raw/download/preview`;\n- `GET /password-range`.\n\nUnlock endpoints are not counted, and neither are `/profile/*`, `/notifications*`, `/notification_runs*`, `/exports`, `/stats` or `GET /search/domain/{domain}`.\n\n| Plan | Daily requests |\n|------|----------------|\n| Free (authenticated) | 500 |\n| Starter | 10 000 |\n| Enterprise | 50 000 |\n| Platinum | 200 000 |\n| Unlimited | no cap |\n\nThese are the **default caps of each plan**, not a contract: the cap is stored on your plan and can change without a release. The source of truth for your own account is `GET /profile/usage`, which returns your live caps and consumption and never consumes quota itself.\n\nWhen exceeded: HTTP **429** with `X-RateLimit-Daily-Limit`, `X-RateLimit-Daily-Remaining` (=0), `X-RateLimit-Daily-Reset` (epoch of the next hourly rollover) and `Retry-After` (seconds).\n\n### Concurrent heavy searches\n\nMax **in-flight** heavy searches per account at any given time.\n\n| Plan | Concurrent raw | Concurrent advanced |\n|------|----------------|---------------------|\n| Free (authenticated) | 1 | 1 |\n| Starter | 1 | 1 |\n| Enterprise | 2 | 2 |\n| Platinum | 3 | 3 |\n| Unlimited | 8 | 8 |\n\nScope: the `raw` slot is taken by `POST /search/raw` only, the `advanced` slot by `POST /search/advanced`, `POST /search/advanced/export` and `POST /search/advanced/export_urls`. Every other endpoint, including `POST /search/raw/count`, `POST /search/raw/export` and the raw browsing endpoints, is bound by the burst and the daily cap but takes no slot.\n\nLike the daily cap, these values are the defaults of each plan and can change without a release: `GET /profile/usage` reports the live caps and how many slots you are holding.\n\nWhen exceeded: HTTP **429** with `X-RateLimit-Inflight-Kind` (`raw` or `advanced`), `X-RateLimit-Inflight-Limit` (the cap), and `Retry-After` (typically 5 seconds, retry once the previous search completes).\n\n### Response headers\n\nSearch responses carry standard rate limit headers so clients can adapt programmatically:\n\n| Header | Description |\n|--------|-------------|\n| `X-RateLimit-Limit` | Requests allowed in the current per-second window, as seen by the limiter that answered. On `POST /search/email`, `GET /search/domain/{domain}/...` and `POST /search/dark-web` it reports the per-account limit of 30, while an account without an active paid plan is separately capped at 5 by the burst layer: your real budget is the lower of the two |\n| `X-RateLimit-Remaining` | Requests remaining in the current per-second window |\n| `X-RateLimit-Reset` | Seconds until the per-second window resets |\n| `X-RateLimit-Daily-Limit` | Daily request cap for your plan (absent on the Unlimited tier) |\n| `X-RateLimit-Daily-Remaining` | Daily requests remaining in the current rolling 24-hour window |\n| `X-RateLimit-Daily-Reset` | Unix epoch (seconds, UTC) of the next hourly rollover |\n| `X-RateLimit-Inflight-Kind` | (on 429 inflight only) `raw` or `advanced` |\n| `X-RateLimit-Inflight-Limit` | (on 429 inflight only) max concurrent searches for that kind |\n| `Retry-After` | Seconds to wait before retrying. Sent on every 429, and on the 503 that carries `code: search_unavailable` in its body |\n\n### Telling the three 429 apart\n\n| Cause | `detail` | What to read |\n|-------|----------|--------------|\n| Burst (per-second) | `Rate limit exceeded` | `Retry-After` (1 second) |\n| Daily request cap | `Daily request cap exceeded for your plan.` | `X-RateLimit-Daily-*` and `Retry-After` (seconds until the next hourly rollover) |\n| Concurrent heavy searches | `Too many concurrent raw searches for your plan.` (or `advanced`) | `X-RateLimit-Inflight-Kind`, `X-RateLimit-Inflight-Limit`, `Retry-After` (5 seconds) |\n| Concurrent unlock tasks | a message naming your active unlock tasks | no header: wait for one of your tasks to finish |\n\nA bare 429 with no JSON body comes from the edge layer, not from these three.\n\nNo mainstream HTTP client retries a 429 for you: httpx, axios and fetch have no retry mechanism at all, and `requests` only honors `Retry-After` when you explicitly mount `HTTPAdapter(max_retries=Retry(respect_retry_after_header=True))`. Read the header, sleep, replay, and give up after a few attempts:\n\n```python\nimport time\nimport httpx\n\ndef call(client, method, url, **kwargs):\n    for attempt in range(5):\n        response = client.request(method, url, **kwargs)\n        if response.status_code != 429:\n            return response\n        wait = float(response.headers.get('Retry-After', 1))\n        time.sleep(wait * (attempt + 1))\n    raise RuntimeError('still rate limited after 5 attempts')\n```\n\n### Concurrent exports\n\nYour account has a **single pool** of asynchronous export jobs in status `PENDING` or `IN_PROGRESS`, shared by every export type: email, domain, advanced, raw, unlocked leaks and notification runs. Queuing a new export returns HTTP **400** once the pool holds 5 jobs. There is no per-endpoint quota: five email exports block a raw export.\n\n`POST /search/advanced/export_urls` is stricter still: it refuses to start when the pool holds **any** job at all, whatever its type.\n\nTwo domain exports never touch this pool: `POST /search/domain/{domain}/urls/export` and `POST /search/domain/{domain}/subdomains/export` are synchronous, they stream the file back in the response and take no slot.\n\n**Row limits**\n\n| Export | Limit |\n|--------|-------|\n| Email, domain, advanced, unlocked leaks, notification run | 5 000 000 rows |\n| Advanced URLs (`POST /search/advanced/export_urls`) | 5 000 000 URLs |\n| Raw, mode `rows` | 500 000 lines |\n| Raw, mode `parts` | 50 000 parts |\n| Domain URLs (synchronous) | 100 000 URLs |\n\nHitting a row limit is **not** an error: the job stops writing and finishes as `COMPLETED`. Only the raw exports report it, in the `params.delivery` object returned by `GET /exports` (`state` is `exhaustive` or `cap_reached`). For the other families, compare the number of rows you receive with the `total` of the matching search.\n\n### Concurrent unlock tasks\n\n| Scope | Limit |\n|-------|-------|\n| Email | 5 tasks in status `QUEUED` or `RUNNING` |\n| Domain | 5 tasks in status `QUEUED` or `RUNNING` |\n| Advanced | 2 tasks in status `QUEUED` or `RUNNING` |\n| Raw | 1 `RUNNING` plus 1 `QUEUED` |\n\nEach scope has its own counter: five email tasks do not block an advanced task.\n\nRaw follows its own rule: one task may run while a second waits, and re-posting an identical request while it is still active returns the id of the existing task instead of creating a second one.\n\nExceeding a limit returns HTTP **429**.\n\n---\n\n## Points system\n\nSearching is free, unlocking is what costs **points**. Points are taken from your account balance (subscription points first, then extra points), and the balance belongs to the account owner: team members spend the owner's points. `GET /profile` returns `subscription_points` and `extra_points`.\n\n**What an unlock costs**\n\n- 1 point per leak record newly unlocked: `POST /unlock`, and the `/unlock` and `/unlock/task` endpoints of email, domain and advanced search.\n- 1 point per raw part newly unlocked: `POST /search/raw/unlock/task`, and `auto_unlock` on `GET /search/raw/part`.\n- 1 point per combolist pair newly unlocked: `POST /search/combolist/unlock`, `POST /search/combolist/unlock/task`, and `auto_unlock` on the four combolist search endpoints. Combolist points come from the same balance but are billed against the combolist dataset, and unlocked pairs are stored separately from unlocked leaks.\n- Records you already own are free: unlocking the same item twice never charges twice.\n\n**Plans that never spend points**\n\nOn plans where every record is already readable (Unlimited), the unlock endpoints then answer HTTP **400** (`unlock is not needed on your plan`), which is expected: read or export the data directly.\n\n**Auto-unlock on a search**\n\nWith `auto_unlock=true`, the locked items of the current page are unlocked and the points are deducted. If your balance is insufficient, a partial unlock is performed. The response field `auto_unlock_points_consumed` reports the amount spent on `POST /search/email`, `POST /search/advanced` and the four `GET /search/domain/{domain}/...` list endpoints. `GET /search/raw/part` also accepts `auto_unlock` but does not return that field: read your balance from `GET /profile` to reconcile.\n\n**Monitoring budget**\n\nA monitoring notification with auto-unlock enabled spends points on your behalf. Its `max_points` is a **daily** budget, tracked by the `daily_spent` counter the notification exposes. Leaving `max_points` unset means no budget limit: the run unlocks every new match, up to your balance.\n\nAvoid `max_points = 0`: it is read as no limit on raw monitoring, and as a zero budget (auto-unlock disabled) on email, domain and keyword monitoring. Send a positive value, or leave the field out.\n\n**A second currency: the raw download quota**\n\nDownloading a raw file costs no points, it consumes the **GB quota** of your plan, debited by the exact size of the file. Once debited, the file stays downloadable for 7 days without paying again; after that a new download debits the quota again. When the quota is exhausted, `POST /raw/download` answers HTTP **402**. `GET /profile` returns your remaining quota as `subscription_gb` and `extra_gb`, both in bytes.\n\n---\n\n## Pagination\n\nPaginated endpoints take `page` (starts at **1**) and `page_size`:\n\n| Endpoint | `page_size` range | Default |\n|----------|-------------------|---------|\n| `POST /search/email` | 1 – 100 | 100 |\n| `POST /search/advanced` | 1 – 1 000 | 100 |\n| `POST /search/dark-web` | 1 – 100 | 25 |\n| `GET /search/domain/{domain}/all` | 1 – 1 000 | 100 |\n| `GET /search/domain/{domain}/customers` | 1 – 1 000 | 100 |\n| `GET /search/domain/{domain}/employees` | 1 – 1 000 | 100 |\n| `GET /search/domain/{domain}/third_parties` | 1 – 1 000 | 100 |\n| `GET /search/domain/{domain}/subdomains` | 1 – 1 000 | 100 |\n| `GET /search/domain/{domain}/urls` | 1 – 1 000 | 100 |\n| `POST /search/raw` | 1 – 100 | 10 |\n| `GET /search/raw/parts` | 1 – 1 000 | 100 |\n| `GET /container/tree` | 1 – 1 000 | 200 |\n| `GET /container/subfolders` | 1 – 100 000 | 1 000 |\n| `GET /profile/unlocked` | 1 – 1 000 | 100 |\n| `GET /profile/unlocked/advanced` | 1 – 1 000 | 100 |\n| `GET /profile/raw/downloads` | 1 – 100 | 20 |\n| `GET /profile/raw/unlocked-parts` | 1 – 100 | 20 |\n| `GET /profile/activities/balance-logs` | 1 – 100 | 20 |\n| `GET /profile/activities/tasks` | 1 – 100 | 20 |\n| `GET /exports` | 1 – 100 | 20 |\n| `GET /notification_runs` | 1 – 1 000 | 20 |\n| `GET /notification_runs/{run_id}/items` | 1 – 1 000 | 100 |\n\n`GET /password-range` is not paginated: it takes a single `limit` (1 – 10 000, default 1 000).\n\n### Deep pagination cap\n\nInteractive paging is capped at `page * page_size <= 1,000,000`. Above this offset, requests return **400** with a hint to the bulk export endpoint. Affected endpoints:\n\n- `GET /search/domain/{domain}/all`\n- `GET /search/domain/{domain}/customers`\n- `GET /search/domain/{domain}/employees`\n- `GET /search/domain/{domain}/third_parties`\n- `POST /search/advanced`\n\nFor larger extractions, use the matching `/export` endpoint: it runs asynchronously and its own row limit is the one listed under Concurrent exports above (5 000 000 rows for these families, less for raw and for domain URLs).\n\n---\n\n## Date format\n\nDatetime parameters take **ISO 8601** (e.g. `2025-01-15T00:00:00Z`). Always send the timezone: a value without one is not rejected, it is read as UTC, which silently shifts your window if you meant local time.\n\nOne parameter is strict and returns HTTP **400** on a naive value: `unlocked_at_min` on `POST /profile/unlocked/advanced/export`.\n\n---\n\n## Password strength\n\nLeaked passwords are scored on an integer scale (0+). The API groups them into four categories:\n\n| Category | Score range |\n|----------|------------|\n| `too_weak` | 0 – 2 |\n| `weak` | 3 – 4 |\n| `medium` | 5 – 7 |\n| `strong` | 8+ |\n\nResponse fields return the raw integer score. Filter parameters accept the category name.\n","termsOfService":"https://leakradar.io/en/terms","contact":{"name":"LeakRadar Team","email":"contact@leakradar.io"},"version":"1.0.0"},"paths":{"/password-range":{"get":{"tags":["Password Range"],"summary":"Search password hashes by prefix","description":"Search leaked password hashes (SHA-1) by prefix or full hash and get the distinct matches with their occurrence counts.","operationId":"password_range_password_range_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"prefix","in":"query","required":true,"schema":{"type":"string","minLength":5,"maxLength":40,"description":"SHA-1 prefix or full hash to search for.","title":"Prefix"},"description":"SHA-1 prefix or full hash to search for."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Maximum number of matching hashes to return.","default":1000,"title":"Limit"},"description":"Maximum number of matching hashes to return."},{"name":"suffix_only","in":"query","required":false,"schema":{"type":"boolean","description":"If true, return only hash suffixes (after the first 5 chars) instead of full hashes.","default":false,"title":"Suffix Only"},"description":"If true, return only hash suffixes (after the first 5 chars) instead of full hashes."}],"responses":{"200":{"description":"Matching hashes returned successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordRangeResponse"}}}},"400":{"description":"Prefix must be hexadecimal.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/advanced":{"post":{"tags":["Search Advanced"],"summary":"Search leaks with advanced filters (JSON body)","description":"Search leaked credentials using any combination of fields defined in `LeakSearchFilters`.\n\n**Pagination:** `page` ≥ 1, `page_size` in [1, 1 000] (default 100).\n\n**Access:** If your plan includes `advanced_search`, full URLs and item IDs are returned; otherwise redacted.\n\n**Rate limit:** 5 requests per second per user.\n\n**Auto-unlock:**\nPass `auto_unlock=true` to automatically unlock locked items on the current page. Points are consumed per newly unlocked item. If insufficient points, partial unlock is performed. The response field `auto_unlock_points_consumed` indicates how many points were used.\n\n---\n\n**Filter limits:**\n\n| Constraint | Value |\n|------------|-------|\n| Max values per filter field | 50 |\n| Min characters per value (default) | 3 |\n| Min characters for `url_scheme`, `url_tld`, `email_tld` | 2 |\n| Min characters for `username_hash`, `password_hash` | 4 |\n| Max characters per string value | 100 |\n| Max characters for `url_scheme` | 20 |\n| Max characters for `url_tld`, `email_tld` | 10 |","operationId":"search_leaks_v2_search_advanced_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page (1–1000, default 100).","default":100,"title":"Page Size"},"description":"Items per page (1–1000, default 100)."},{"name":"auto_unlock","in":"query","required":false,"schema":{"type":"boolean","description":"Automatically unlock locked items on the current page using your points.","default":false,"title":"Auto Unlock"},"description":"Automatically unlock locked items on the current page using your points."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeakSearchFilters","description":"Advanced search filters."}}}},"responses":{"200":{"description":"Search results returned successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLeaksResponse"}}}},"400":{"description":"Pagination too deep (offset > 1,000,000 — use `/search/advanced/export`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error in filter parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded (5 req/sec). Response includes `Retry-After`, `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Advanced search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/search/advanced/unlock":{"post":{"tags":["Search Advanced"],"summary":"Unlock leaks for advanced search","description":"Unlock leaks returned by the same advanced search filters as `/search/advanced`. Provide filters in the JSON body. Optional query parameter `max` limits how many new leaks to unlock.\n\n**Behavior**\n- If `max` is omitted, the service unlocks as many as your available points allow (subscription + extra).\n- Only previously locked items are unlocked. Already unlocked items remain unchanged.\n- Only newly unlocked items consume points.\n- **Hard cap**: synchronous unlocks are limited to 10,000. Use `/search/advanced/unlock/task` for higher volumes.\n\n**Plan requirement**\nRequires a paid plan with `advanced_search` enabled.\n\n**Errors**\n- 400 Insufficient points, no matching data, all items already unlocked, more than 10,000 unlocks (use /search/advanced/unlock/task), unlock not needed on your plan.\n- 401 Authentication required, or invalid/expired API key.\n- 403 Advanced search not available on your plan, this search is blocked, account banned, or pending email verification.\n- 404 The provided list_id does not exist or is not yours.\n- 422 Request validation error.\n- 429 Rate limit exceeded.\n- 503 Advanced search under maintenance, or public API temporarily disabled.","operationId":"unlock_all_advanced_leaks_search_advanced_unlock_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"0 or omitted = use all your points","title":"Max"},"description":"0 or omitted = use all your points"},{"name":"list_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Assign this list id to new unlocks.","title":"List Id"},"description":"Assign this list id to new unlocks."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeakSearchFilters"}}}},"responses":{"200":{"description":"Unlocked leaks returned successfully.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LeakDetails"},"title":"Response Unlock All Advanced Leaks Search Advanced Unlock Post"}}}},"400":{"description":"Insufficient points, no matching data, all items already unlocked, more than 10,000 unlocks (use the /unlock/task endpoint), unlock not needed on your plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Advanced search not available on your plan, this search is blocked, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"The provided list_id does not exist or is not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded (10 req/sec). See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Advanced search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/advanced/unlock/task":{"post":{"tags":["Search Advanced"],"summary":"Queue an async mass unlock task for advanced search","description":"Creates an asynchronous unlock **Task** for the given advanced filters. Returns a `task_id` you can poll with the task-status endpoint.\n\n**Concurrency limit**\n- advanced / raw: max 2 concurrent tasks per user.\n- email / domain: max 5 concurrent tasks per user.\n- Returns 429 if limit exceeded.","operationId":"queue_advanced_unlock_task_search_advanced_unlock_task_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Optional cap of new unlocks.","title":"Max"},"description":"Optional cap of new unlocks."},{"name":"list_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Assign this list id to new unlocks.","title":"List Id"},"description":"Assign this list id to new unlocks."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeakSearchFilters","description":"Filters to apply to the advanced search."}}}},"responses":{"200":{"description":"Unlock task queued; returns a task_id to poll.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Queue Advanced Unlock Task Search Advanced Unlock Task Post"}}}},"400":{"description":"Insufficient points, or unlock not needed on your plan (all data already accessible).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Advanced search not available on your plan, this search is blocked, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"The provided list_id does not exist or is not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded, or too many concurrent unlock tasks (max 2 for advanced).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Advanced search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/advanced/export":{"post":{"tags":["Search Advanced"],"summary":"Export leaks to CSV/TXT/JSON","description":"Queue an export of all leaks that match the provided advanced search filters. At least one filter is required.\n\nRequest body\n- JSON payload following the `LeakSearchFilters` schema.\n\nQuery parameters\n- `format` optional output format: `csv` (default), `txt`, or `json`.\n\nLimits and plan requirement\n- You can have at most 5 exports with status PENDING or IN_PROGRESS per account.\n- Requires a paid plan with `advanced_search` enabled.\n\nResponse\n`ExportResponse` with `status`, `message`, and `export_id`.","operationId":"create_advanced_export_search_advanced_export_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"$ref":"#/components/schemas/ExportFormatEnum","description":"Output format: csv (default), txt, or json.","default":"csv"},"description":"Output format: csv (default), txt, or json."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeakSearchFilters"}}}},"responses":{"200":{"description":"Export queued successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportResponse"}}}},"400":{"description":"No filters provided, maximum concurrent exports reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Advanced search not available on your plan, search blocked, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"409":{"description":"An identical export is already queued or running.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Advanced search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/advanced/export_urls":{"post":{"tags":["Search Advanced"],"summary":"Export distinct URLs to CSV/TXT/JSON","description":"Queue an export of the distinct URLs from leaks that match the provided advanced search filters. Provide the filters in the JSON request body.\n\nRequest body\n- `filters` payload following `LeakSearchFilters` fields.\n\nQuery parameters\n- `format` optional output format: `csv` (default), `txt`, or `json`.\n\nLimits and plan requirement\n- At least one filter is required.\n- Capped at 5,000,000 distinct URLs. When a filter matches more, the file holds the alphabetically first 5,000,000 and the export is flagged as limited.\n- You can have at most 1 export with status PENDING or IN_PROGRESS per account.\n- Requires a paid plan with `advanced_search` enabled.\n\nResponse\n`ExportResponse` with `status`, `message`, and `export_id`.","operationId":"export_advanced_search_urls_search_advanced_export_urls_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"$ref":"#/components/schemas/ExportFormatEnum","description":"Output format: csv (default), txt, or json.","default":"csv"},"description":"Output format: csv (default), txt, or json."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeakSearchFilters"}}}},"responses":{"200":{"description":"Export queued successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportResponse"}}}},"400":{"description":"No filters provided, maximum concurrent exports reached (max 1 for URL exports).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Advanced search not available on your plan, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"409":{"description":"An identical export is already queued or running.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Advanced search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/dark-web/sources":{"get":{"tags":["Dark Web Search"],"summary":"Get available dark web sources","description":"Returns a list of all scraped forum sources with their post counts.","operationId":"get_dark_web_sources_search_dark_web_sources_get","responses":{"200":{"description":"List of sources (names censored on free plans).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DarkWebSourcesResponse"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Dark web index unavailable, under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}},"security":[{"BearerAuth":[]}]}},"/search/dark-web/stats":{"get":{"tags":["Dark Web Search"],"summary":"Get dark web statistics","description":"Returns overall statistics about the dark web index.","operationId":"get_dark_web_stats_search_dark_web_stats_get","responses":{"200":{"description":"Dark web statistics.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DarkWebStatsResponse"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Dark web index unavailable, under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}},"security":[{"BearerAuth":[]}]}},"/search/dark-web/post/{post_id}":{"get":{"tags":["Dark Web Search"],"summary":"Get a single dark web post by ID","description":"Returns the full content of a dark web post without truncation.","operationId":"get_dark_web_post_search_dark_web_post__post_id__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","description":"The post ID (document _id)","title":"Post Id"},"description":"The post ID (document _id)"}],"responses":{"200":{"description":"Post content (censored on free plans).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DarkWebItem"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Post not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Dark web index unavailable, under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/dark-web":{"post":{"tags":["Dark Web Search"],"summary":"Search dark web mentions","description":"Look for mentions of a company, domain, IP, or email across scraped dark web/forum posts.\n\n**Simple mode**: Use `query` to search across title + content.\n\n**Advanced mode**: Use specific fields (`title`, `content`, `author`, `source_url`) with AND/OR logic.\n\n- Pagination: `page` starts at 1, `page_size` max 100.\n- Fields: title, content, author, source, source_ref, target, published_at, ingested_at.","operationId":"search_dark_web_search_dark_web_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (1–100, default 25).","default":25,"title":"Page Size"},"description":"Items per page (1–100, default 25)."},{"name":"sources","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated list of sources to filter by","title":"Sources"},"description":"Comma-separated list of sources to filter by"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter posts published after this date","title":"Date From"},"description":"Filter posts published after this date"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter posts published before this date","title":"Date To"},"description":"Filter posts published before this date"},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","description":"Sort field: ingested_at or published_at","default":"ingested_at","title":"Sort By"},"description":"Sort field: ingested_at or published_at"},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","description":"Sort order: asc or desc","default":"desc","title":"Sort Order"},"description":"Sort order: asc or desc"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DarkWebSearchRequest"}}}},"responses":{"200":{"description":"Search results (censored on free plans).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DarkWebSearchResponse"}}}},"400":{"description":"Pagination limit exceeded (offset + page_size > 10,000).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Source filtering or source_url search requires a paid plan with dark web access; account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error in search parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Dark web index unavailable, under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/search/domain/{domain}/all":{"get":{"tags":["Search Domain"],"summary":"List all leaks for a domain (employees + customers + third parties)","description":"Return a paginated list of **all** leaks linked to a domain, regardless of\ncategory (employees, customers, third parties).\n\nEach item includes a `category` field indicating whether the leak belongs\nto employees, customers, or third parties.\n\n**Query parameters**\n- `page` starts at 1.\n- `page_size` is 1 to 1000 (default 100).\n- `search` optional term to narrow results.\n- `is_email` optional boolean to filter emails (true), usernames (false), or both (null).\n\n**Access and visibility**\n- If your plan includes `domain_search`, full URLs and item IDs are returned.\n- Otherwise URLs are redacted except for the first 10 items per page and IDs are omitted.\n- Credentials are included only for items with `unlocked=true` and if your plan includes `domain_search`.\n\n**Response**\n`PaginatedAllLeaksResponse` with `items`, `total`, `total_unlocked`, `page`, `page_size`.\n\n**Auto-unlock**\nPass `auto_unlock=true` to automatically unlock locked items on the current page. Points are consumed per newly unlocked item. If insufficient points, partial unlock is performed. The response field `auto_unlock_points_consumed` indicates how many points were used.","operationId":"get_all_domain_leaks_search_domain__domain__all_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","description":"Domain to list leaks for, e.g. `example.com`.","title":"Domain"},"description":"Domain to list leaks for, e.g. `example.com`."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Optional search term to filter results.","title":"Search"},"description":"Optional search term to filter results."},{"name":"is_email","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by identifier type: true=emails only, false=usernames only, null=both.","title":"Is Email"},"description":"Filter by identifier type: true=emails only, false=usernames only, null=both."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page (1–1000, default 100).","default":100,"title":"Page Size"},"description":"Items per page (1–1000, default 100)."},{"name":"auto_unlock","in":"query","required":false,"schema":{"type":"boolean","description":"Automatically unlock locked items on the current page using your points.","default":false,"title":"Auto Unlock"},"description":"Automatically unlock locked items on the current page using your points."}],"responses":{"200":{"description":"Leaks returned successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAllLeaksResponse"}}}},"400":{"description":"Pagination too deep (offset > 1,000,000 — use the matching `/export` endpoint).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. Response includes `Retry-After`, `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Domain search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/domain/{domain}/customers":{"get":{"tags":["Search Domain"],"summary":"List leaks for customers of a domain","description":"Return a paginated list of leaks linked to customers of the given domain.\n\n**Query parameters**\n- `page` starts at 1.\n- `page_size` is 1 to 1000 (default 100).\n- `search` optional term to narrow results.\n- `is_email` optional boolean to filter emails (true), usernames (false), or both (null).\n\n**Access and visibility**\n- If your plan includes `domain_search`, full URLs and item IDs are returned.\n- Otherwise URLs are redacted except for the first 10 items per page and IDs are omitted.\n- Credentials are included only for items with `unlocked=true` and if your plan includes `domain_search`.\n\n**Response**\n`PaginatedLeaksResponse` with `items`, `total`, `total_unlocked`, `page`, `page_size`.\n\n**Auto-unlock**\nPass `auto_unlock=true` to automatically unlock locked items on the current page. Points are consumed per newly unlocked item. If insufficient points, partial unlock is performed. The response field `auto_unlock_points_consumed` indicates how many points were used.","operationId":"get_customer_leaks_search_domain__domain__customers_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","description":"Domain whose customers' leaks to list, e.g. `example.com`.","title":"Domain"},"description":"Domain whose customers' leaks to list, e.g. `example.com`."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page (1–1000, default 100).","default":100,"title":"Page Size"},"description":"Items per page (1–1000, default 100)."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Optional search term to filter results.","title":"Search"},"description":"Optional search term to filter results."},{"name":"is_email","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by identifier type: true=emails only, false=usernames only, null=both.","title":"Is Email"},"description":"Filter by identifier type: true=emails only, false=usernames only, null=both."},{"name":"auto_unlock","in":"query","required":false,"schema":{"type":"boolean","description":"Automatically unlock locked items on the current page using your points.","default":false,"title":"Auto Unlock"},"description":"Automatically unlock locked items on the current page using your points."}],"responses":{"200":{"description":"Results returned successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLeaksResponse"}}}},"400":{"description":"Pagination too deep (offset > 1,000,000 — use the matching `/export` endpoint).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. Response includes `Retry-After`, `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Domain search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/domain/{domain}/employees":{"get":{"tags":["Search Domain"],"summary":"List leaks for employees of a domain","description":"Return a paginated list of leaks linked to employees of the given domain.\n\n**Query parameters**\n- `page` starts at 1.\n- `page_size` is 1 to 1000 (default 100).\n- `search` optional term to narrow results.\n- `is_email` optional boolean to filter emails (true), usernames (false), or both (null).\n\n**Access and visibility**\n- If your plan includes `domain_search`, full URLs and item IDs are returned.\n- Otherwise URLs are redacted except for the first 10 items per page and IDs are omitted.\n- Credentials are included only for items with `unlocked=true` and if your plan includes `domain_search`.\n\n**Response**\n`PaginatedLeaksResponse` with `items`, `total`, `total_unlocked`, `page`, `page_size`.\n\n**Auto-unlock**\nPass `auto_unlock=true` to automatically unlock locked items on the current page. Points are consumed per newly unlocked item. If insufficient points, partial unlock is performed. The response field `auto_unlock_points_consumed` indicates how many points were used.","operationId":"get_employee_leaks_search_domain__domain__employees_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","description":"Domain whose employees' leaks to list, e.g. `example.com`.","title":"Domain"},"description":"Domain whose employees' leaks to list, e.g. `example.com`."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Optional search term to filter results.","title":"Search"},"description":"Optional search term to filter results."},{"name":"is_email","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by identifier type: true=emails only, false=usernames only, null=both.","title":"Is Email"},"description":"Filter by identifier type: true=emails only, false=usernames only, null=both."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page (1–1000, default 100).","default":100,"title":"Page Size"},"description":"Items per page (1–1000, default 100)."},{"name":"auto_unlock","in":"query","required":false,"schema":{"type":"boolean","description":"Automatically unlock locked items on the current page using your points.","default":false,"title":"Auto Unlock"},"description":"Automatically unlock locked items on the current page using your points."}],"responses":{"200":{"description":"Results returned successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLeaksResponse"}}}},"400":{"description":"Pagination too deep (offset > 1,000,000 — use the matching `/export` endpoint).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. Response includes `Retry-After`, `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Domain search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/domain/{domain}/third_parties":{"get":{"tags":["Search Domain"],"summary":"List leaks for third parties of a domain","description":"Return a paginated list of leaks linked to third parties of the given domain.\n\n**Query parameters**\n- `page` starts at 1.\n- `page_size` is 1 to 1000 (default 100).\n- `search` optional term to narrow results.\n- `is_email` optional boolean to filter emails (true), usernames (false), or both (null).\n\n**Access and visibility**\n- If your plan includes `domain_search`, full URLs and item IDs are returned.\n- Otherwise URLs are redacted except for the first 10 items per page and IDs are omitted.\n- Credentials are included only for items with `unlocked=true` and if your plan includes `domain_search`.\n\n**Response**\n`PaginatedLeaksResponse` with `items`, `total`, `total_unlocked`, `page`, `page_size`.\n\n**Auto-unlock**\nPass `auto_unlock=true` to automatically unlock locked items on the current page. Points are consumed per newly unlocked item. If insufficient points, partial unlock is performed. The response field `auto_unlock_points_consumed` indicates how many points were used.","operationId":"get_third_parties_leaks_search_domain__domain__third_parties_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","description":"Domain whose third-party leaks to list, e.g. `example.com`.","title":"Domain"},"description":"Domain whose third-party leaks to list, e.g. `example.com`."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page (1–1000, default 100).","default":100,"title":"Page Size"},"description":"Items per page (1–1000, default 100)."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Optional search term to filter results.","title":"Search"},"description":"Optional search term to filter results."},{"name":"is_email","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by identifier type: true=emails only, false=usernames only, null=both.","title":"Is Email"},"description":"Filter by identifier type: true=emails only, false=usernames only, null=both."},{"name":"auto_unlock","in":"query","required":false,"schema":{"type":"boolean","description":"Automatically unlock locked items on the current page using your points.","default":false,"title":"Auto Unlock"},"description":"Automatically unlock locked items on the current page using your points."}],"responses":{"200":{"description":"Results returned successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLeaksResponse"}}}},"400":{"description":"Pagination too deep (offset > 1,000,000 — use the matching `/export` endpoint).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. Response includes `Retry-After`, `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Domain search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/domain/{domain}":{"get":{"tags":["Search Domain"],"summary":"Get leak report for a domain","description":"Return a domain leak report. If unauthenticated, `light=true` is forced.\n\n**Modes**\n- `light=true`: returns sampled counts only.\n- `light=false` (authenticated): returns exact counts plus password stats per group.\n\n**Parameters**\n- `include_search_count=true`: include the number of distinct users who searched this domain in the last 7 days (`searched_by_count`). Disabled by default to avoid an expensive lookup.\n\n**Caching**\n- Light up to 24 hours, full up to 1 hour.","operationId":"search_domain_leaks_search_domain__domain__get","security":[{"BearerAuth":[]},{}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","description":"Domain to report on, e.g. `example.com`.","title":"Domain"},"description":"Domain to report on, e.g. `example.com`."},{"name":"light","in":"query","required":false,"schema":{"type":"boolean","description":"Force light mode (sampled counts only). Always forced when unauthenticated.","default":false,"title":"Light"},"description":"Force light mode (sampled counts only). Always forced when unauthenticated."},{"name":"include_search_count","in":"query","required":false,"schema":{"type":"boolean","description":"Include `searched_by_count` (distinct users who searched this domain in the last 7 days). Full mode only; adds a heavier lookup.","default":false,"title":"Include Search Count"},"description":"Include `searched_by_count` (distinct users who searched this domain in the last 7 days). Full mode only; adds a heavier lookup."}],"responses":{"200":{"description":"Domain leak report returned successfully.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DomainSearchLightResponse"},{"$ref":"#/components/schemas/DomainSearchResponse"}],"title":"Response Search Domain Leaks Search Domain  Domain  Get"}}}},"400":{"description":"Empty domain.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Domain search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/domain/{domain}/report/pdf":{"get":{"tags":["Search Domain"],"summary":"Download domain report as PDF","description":"Generate and download a PDF report for the given domain.\n\n**Content**\n- Aggregated counts for compromised employees, third parties, and customers.\n- Aggregated password statistics per group when available.\n\n**Errors**\n- 400 Empty domain.\n- 401 Authentication required, or invalid/expired API key.\n- 403 Account banned, or pending email verification.\n- 422 Request validation error.\n- 429 Rate limit exceeded.\n- 503 Domain search under maintenance, or public API temporarily disabled.","operationId":"download_domain_report_pdf_search_domain__domain__report_pdf_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","description":"Domain to generate the PDF report for, e.g. `example.com`.","title":"Domain"},"description":"Domain to generate the PDF report for, e.g. `example.com`."}],"responses":{"200":{"description":"PDF report for the requested domain.","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}},"headers":{"Content-Disposition":{"description":"Attachment filename for the PDF report.","schema":{"type":"string"}}}},"400":{"description":"Empty domain.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Domain search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/domain/{domain}/subdomains":{"get":{"tags":["Search Domain"],"summary":"List subdomains for a domain","description":"Return a paginated list of distinct subdomains for the given domain with their occurrence counts.\n\n**Query parameters**\n- `page` starts at 1.\n- `page_size` is 1 to 1000 (default 100).\n- `search` optional wildcard filter on subdomain.\n\n**Access and visibility**\n- If your plan includes `domain_search`, full subdomains are returned.\n- Otherwise subdomains are redacted except for the first 10 items per page. If `search` is provided and you are not entitled, results are redacted.","operationId":"get_domain_subdomains_search_domain__domain__subdomains_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","description":"Parent domain to list subdomains for, e.g. `example.com`.","title":"Domain"},"description":"Parent domain to list subdomains for, e.g. `example.com`."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Optional wildcard filter on subdomain.","title":"Search"},"description":"Optional wildcard filter on subdomain."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page (1–1000, default 100).","default":100,"title":"Page Size"},"description":"Items per page (1–1000, default 100)."}],"responses":{"200":{"description":"Results returned successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_SubdomainOccurrences_"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Domain search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/domain/{domain}/subdomains/export":{"post":{"tags":["Search Domain"],"summary":"Export all subdomains for a domain as CSV/TXT/JSON","description":"Generate an on-demand export of all distinct subdomains for the given domain. The export contains a single `Subdomain` column.\n\n**Plan requirement**\nRequires a paid plan with `domain_search` enabled.\n\n**Parameters**\n- You can provide `search` either as a query parameter or in the JSON body. If both are provided, the JSON body value takes precedence.","operationId":"export_domain_subdomains_search_domain__domain__subdomains_export_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","description":"Parent domain to export subdomains for, e.g. `example.com`.","title":"Domain"},"description":"Parent domain to export subdomains for, e.g. `example.com`."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Optional wildcard filter on subdomain when using query parameters. If also provided in the JSON body, the body value takes precedence.","title":"Search"},"description":"Optional wildcard filter on subdomain when using query parameters. If also provided in the JSON body, the body value takes precedence."},{"name":"format","in":"query","required":false,"schema":{"$ref":"#/components/schemas/ExportFormatEnum","description":"Output format: csv (default), txt, or json.","default":"csv"},"description":"Output format: csv (default), txt, or json."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DomainSubdomainsExportBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Subdomains file (CSV/TXT/JSON) streamed successfully."},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Domain search not available on your plan, domain blocked, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Domain search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/domain/{domain}/urls":{"get":{"tags":["Search Domain"],"summary":"List URLs for a domain","description":"Return a paginated list of distinct URLs for the given domain with their occurrence counts.\n\n**Query parameters**\n- `page` starts at 1.\n- `page_size` is 1 to 1000 (default 100).\n- `search` optional wildcard filter on URL.\n\n**Access and visibility**\n- If your plan includes `domain_search`, full URLs are returned.\n- Otherwise URLs are redacted except for the first 10 items per page. If `search` is provided and you are not entitled, results are redacted.","operationId":"get_domain_urls_search_domain__domain__urls_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","description":"Domain to list URLs for, e.g. `example.com`.","title":"Domain"},"description":"Domain to list URLs for, e.g. `example.com`."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Optional wildcard filter on url.","title":"Search"},"description":"Optional wildcard filter on url."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page (1–1000, default 100).","default":100,"title":"Page Size"},"description":"Items per page (1–1000, default 100)."}],"responses":{"200":{"description":"Results returned successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_URLOccurrences_"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Domain search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/domain/{domain}/urls/export":{"post":{"tags":["Search Domain"],"summary":"Export all URLs for a domain as CSV/TXT/JSON","description":"Generate an on-demand export of all distinct URLs for the given domain. The export contains a single `URL` column and is capped at 100,000 rows.\n\n**Plan requirement**\nRequires a paid plan with `domain_search` enabled.\n\n**Parameters**\n- You can provide `search` either as a query parameter or in the JSON body. If both are provided, the JSON body value takes precedence.","operationId":"export_domain_urls_search_domain__domain__urls_export_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","description":"Domain to export URLs for, e.g. `example.com`.","title":"Domain"},"description":"Domain to export URLs for, e.g. `example.com`."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Optional search term to filter results when using query parameters. If also provided in the JSON body, the body value takes precedence.","title":"Search"},"description":"Optional search term to filter results when using query parameters. If also provided in the JSON body, the body value takes precedence."},{"name":"format","in":"query","required":false,"schema":{"$ref":"#/components/schemas/ExportFormatEnum","description":"Output format: csv (default), txt, or json.","default":"csv"},"description":"Output format: csv (default), txt, or json."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DomainURLsExportBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"URLs file (CSV/TXT/JSON) streamed successfully."},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Domain search not available on your plan, domain blocked, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Domain search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/domain/{domain}/{leak_type}/export":{"post":{"tags":["Search Domain"],"summary":"Export domain leaks to CSV/TXT/JSON","description":"Queue an export of all leaks for the given domain and leak type (valid values: `employees`, `customers`, `third_parties`, `all`). The job runs asynchronously and the file will appear in the Exports section when ready.\n\n**Parameters**\n- You can provide `search`, `is_email`, and `format` either as query parameters or in the JSON body. If both are provided, the JSON body values take precedence.\n\n**Query parameters**\n- `search` optional term to narrow results.\n- `is_email` optional boolean to filter emails (true), usernames (false), or both (null).\n- `format` optional output format: `csv` (default), `txt`, or `json`.\n\n**Limits and plan requirement**\n- You can have at most 5 exports with status PENDING or IN_PROGRESS (per account).\n- Requires a paid plan with `domain_search` enabled.\n\n**Response**\n`ExportResponse` with `status`, `message`, and `export_id`.","operationId":"create_domain_export_search_domain__domain___leak_type__export_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","description":"Domain to export leaks for, e.g. `example.com`.","title":"Domain"},"description":"Domain to export leaks for, e.g. `example.com`."},{"name":"leak_type","in":"path","required":true,"schema":{"$ref":"#/components/schemas/LeakTypeEnum","description":"Which leaks to export: `employees`, `customers`, `third_parties`, or `all`."},"description":"Which leaks to export: `employees`, `customers`, `third_parties`, or `all`."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Optional term to narrow results when using query parameters. If also provided in the JSON body, the body value takes precedence.","title":"Search"},"description":"Optional term to narrow results when using query parameters. If also provided in the JSON body, the body value takes precedence."},{"name":"is_email","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Optional boolean to filter emails (true), usernames (false), or both (null). If also provided in the JSON body, the body value takes precedence.","title":"Is Email"},"description":"Optional boolean to filter emails (true), usernames (false), or both (null). If also provided in the JSON body, the body value takes precedence."},{"name":"format","in":"query","required":false,"schema":{"$ref":"#/components/schemas/ExportFormatEnum","description":"Output format: csv (default), txt, or json.","default":"csv"},"description":"Output format: csv (default), txt, or json."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DomainExportBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Export queued successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportResponse"}}}},"400":{"description":"Maximum concurrent exports reached (PENDING/IN_PROGRESS limit).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Domain search not available on your plan, domain blocked, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"409":{"description":"An identical export is already queued or running.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Domain search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/domain/{domain}/{leak_type}/unlock":{"post":{"tags":["Search Domain"],"summary":"Unlock leaks for a domain","description":"Unlock leaks for the given domain and leak type (valid values: `employees`, `customers`, `third_parties`). Use `max` to cap how many new leaks to unlock. The effective limit is capped by your available points.\n\nBehavior\n- Only previously locked items are unlocked. Already unlocked items are left unchanged.\n- Only newly unlocked items consume points.\n- **Hard cap**: synchronous unlocks are limited to 10,000. Use `/search/domain/{domain}/{leak_type}/unlock/task` for higher volumes.\n\nPlan requirement\nRequires a paid plan with `domain_search` enabled.\n\n**Errors**\n- 400 Insufficient points, no matching data, all items already unlocked, more than 10,000 unlocks (use the /unlock/task endpoint), unlock not needed on your plan.\n- 401 Authentication required, or invalid/expired API key.\n- 403 Domain search not available on your plan, this domain is blocked, account banned, or pending email verification.\n- 404 The provided list_id does not exist or is not yours.\n- 422 Request validation error.\n- 429 Rate limit exceeded.\n- 503 Domain search under maintenance, or public API temporarily disabled.","operationId":"unlock_all_leaks_endpoint_search_domain__domain___leak_type__unlock_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","description":"Domain to unlock leaks for, e.g. `example.com`.","title":"Domain"},"description":"Domain to unlock leaks for, e.g. `example.com`."},{"name":"leak_type","in":"path","required":true,"schema":{"$ref":"#/components/schemas/LeakTypeEnum","description":"Which leaks to unlock: `employees`, `customers`, or `third_parties`."},"description":"Which leaks to unlock: `employees`, `customers`, or `third_parties`."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Optional search term to filter results.","title":"Search"},"description":"Optional search term to filter results."},{"name":"is_email","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter on e-mails (`true`), usernames (`false`) or both (`null`).","title":"Is Email"},"description":"Filter on e-mails (`true`), usernames (`false`) or both (`null`)."},{"name":"max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Maximum number of leaks to unlock.","title":"Max"},"description":"Maximum number of leaks to unlock."},{"name":"list_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Assign this list id to new unlocks.","title":"List Id"},"description":"Assign this list id to new unlocks."}],"responses":{"200":{"description":"Unlocked leaks returned successfully.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LeakDetails"},"title":"Response Unlock All Leaks Endpoint Search Domain  Domain   Leak Type  Unlock Post"}}}},"400":{"description":"Insufficient points, no matching data, all items already unlocked, more than 10,000 unlocks (use the /unlock/task endpoint), unlock not needed on your plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Domain search not available on your plan, this domain is blocked, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"The provided list_id does not exist or is not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Domain search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/domain/{domain}/{leak_type}/unlock/task":{"post":{"tags":["Search Domain"],"summary":"Queue an async mass unlock task for a domain","description":"Creates an asynchronous unlock **Task** for the given domain and leak type. Returns a `task_id` for polling.\n\n**Concurrency limit**\n- advanced / raw: max 2 concurrent tasks per user.\n- email / domain: max 5 concurrent tasks per user.\n- Returns 429 if limit exceeded.","operationId":"queue_domain_unlock_task_search_domain__domain___leak_type__unlock_task_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","description":"Domain to unlock leaks for, e.g. `example.com`.","title":"Domain"},"description":"Domain to unlock leaks for, e.g. `example.com`."},{"name":"leak_type","in":"path","required":true,"schema":{"$ref":"#/components/schemas/LeakTypeEnum","description":"Which leaks to unlock: `employees`, `customers`, or `third_parties`."},"description":"Which leaks to unlock: `employees`, `customers`, or `third_parties`."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Optional search term.","title":"Search"},"description":"Optional search term."},{"name":"is_email","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"True=email only, false=username only, null=both.","title":"Is Email"},"description":"True=email only, false=username only, null=both."},{"name":"max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Optional cap for new unlocks.","title":"Max"},"description":"Optional cap for new unlocks."},{"name":"list_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Assign this list id to new unlocks.","title":"List Id"},"description":"Assign this list id to new unlocks."}],"responses":{"200":{"description":"Unlock task queued; returns a task_id to poll.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Queue Domain Unlock Task Search Domain  Domain   Leak Type  Unlock Task Post"}}}},"400":{"description":"Insufficient points, or unlock not needed on your plan (all data already accessible).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Domain search not available on your plan, this domain is blocked, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"The provided list_id does not exist or is not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded, or too many concurrent unlock tasks (max 5 for domain).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Domain search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/domains/locked-exists":{"post":{"tags":["Search Domain"],"summary":"Batch exists-check of still-locked leaks by domain and category (account-specific)","description":"For up to 100 domains, returns per-category booleans indicating whether there are leaks that are still locked for the current account (total minus the account's unlocked items). Use include_counts=true to also get locked/total/unlocked counts.","operationId":"domains_locked_exists_search_domains_locked_exists_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainMassRequest"}}},"required":true},"responses":{"200":{"description":"Per-domain, per-category locked-exists results returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainMassResponse"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Your plan does not allow domain mass checks, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Domain search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/search/email":{"post":{"tags":["Search Email"],"summary":"Search leaks by email or username","description":"Search for leaks associated with a specific email or username. Provide the search payload in the JSON body.\n\nPagination\n- `page` starts at 1.\n- `page_size` is 1 to 100 (default 100).\n\nAccess and visibility\n- If your plan includes `email_search`, full URLs and item IDs are returned.\n- Otherwise URLs are redacted except for the first 10 items per page and IDs are omitted.\n- Credentials are returned only when `unlocked=true` and your plan includes `email_search`.\n\nAuto-unlock\nPass `auto_unlock=true` to automatically unlock locked items on the current page. Points are consumed per newly unlocked item. If insufficient points, partial unlock is performed. The response field `auto_unlock_points_consumed` indicates how many points were used.\n\nResponse\n`EmailSearchResponse` with `items`, `total`, `total_unlocked`, `page`, `page_size`.\n\nSpecial case: if `email` is a full SHA-1 (40 hex chars, no '@'), search is done on username_hash exactly.","operationId":"search_email_leaks_search_email_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (1–100, default 100).","default":100,"title":"Page Size"},"description":"Items per page (1–100, default 100)."},{"name":"auto_unlock","in":"query","required":false,"schema":{"type":"boolean","description":"Automatically unlock locked items on the current page using your points.","default":false,"title":"Auto Unlock"},"description":"Automatically unlock locked items on the current page using your points."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailSearchRequest"}}}},"responses":{"200":{"description":"Search results successfully returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailSearchResponse"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Email search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/search/email/unlock":{"post":{"tags":["Search Email"],"summary":"Unlock leaks for an email","description":"Unlock leaks for the given email or username. Provide the search payload in the JSON body. Use the `max` query parameter to cap how many new leaks to unlock. The effective limit is capped by your available points.\n\nRequest body\n- `email` the email or username to search.\n- `search` optional free-text filter applied to URL or username.\n- `is_email` optional boolean: `true` emails only, `false` usernames only, `null` both.\n\nBehavior\n- Only previously locked items are unlocked. Already unlocked items are left unchanged.\n- Only newly unlocked items consume points.\n- If nothing new can be unlocked but matching unlocked items exist, those unlocked items are returned.\n- **Hard cap**: synchronous unlocks are limited to 10,000. Use `/search/email/unlock/task` for higher volumes.\n\nPlan requirement\nRequires a paid plan with `email_search` enabled.","operationId":"unlock_all_email_leaks_search_email_unlock_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"0 or omitted = use all your points","title":"Max"},"description":"0 or omitted = use all your points"},{"name":"list_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Assign this list id to new unlocks.","title":"List Id"},"description":"Assign this list id to new unlocks."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailSearchRequest"}}}},"responses":{"200":{"description":"Unlocked leaks returned successfully.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LeakDetails"},"title":"Response Unlock All Email Leaks Search Email Unlock Post"}}}},"400":{"description":"Insufficient points, no matching data, all items already unlocked, more than 10,000 unlocks (use the /unlock/task endpoint), unlock not needed on your plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Email search not available on your plan, this search is blocked, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"The provided list_id does not exist or is not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded (10 req/sec). See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Email search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/email/unlock/task":{"post":{"tags":["Search Email"],"summary":"Queue an async mass unlock task for an email","description":"Creates an **asynchronous** unlock Task for the given email/username + optional filters. Returns a `task_id` you can poll with the task-status endpoint.\n\nmax semantics\n- Omit `max` or set `max=0` → use all your available points.\n- Positive `max` → unlock up to that number (and ≤ your points).\n\n**Concurrency limit**\n- advanced / raw: max 2 concurrent tasks per user.\n- email / domain: max 5 concurrent tasks per user.\n- Returns 429 if limit exceeded.","operationId":"queue_email_unlock_task_search_email_unlock_task_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"0 or omitted = use all your points","title":"Max"},"description":"0 or omitted = use all your points"},{"name":"list_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Assign this list id to new unlocks.","title":"List Id"},"description":"Assign this list id to new unlocks."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailSearchRequest"}}}},"responses":{"200":{"description":"Unlock task queued; returns a task_id to poll.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Queue Email Unlock Task Search Email Unlock Task Post"}}}},"400":{"description":"Insufficient points, or unlock not needed on your plan (all data already accessible).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Email search not available on your plan, this search is blocked, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"The provided list_id does not exist or is not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded, or too many concurrent unlock tasks (max 5 for email).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Email search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/email/export":{"post":{"tags":["Search Email"],"summary":"Export leaks for an email to CSV/TXT/JSON","description":"Queue an export of all leaks that match the given email or username and optional filters. Provide the search payload in the JSON body.\n\nRequest body\n- `email` the email or username to search.\n- `search` optional free-text filter applied to URL or username.\n- `is_email` optional boolean: `true` emails only, `false` usernames only, `null` both.\n\nQuery parameters\n- `format` optional output format: `csv` (default), `txt`, or `json`.\n\nLimits and plan requirement\n- You can have at most 5 exports with status PENDING or IN_PROGRESS (per account).\n- Requires a paid plan with `email_search` enabled.\n\nResponse\n`ExportResponse` with `status`, `message`, and `export_id`.","operationId":"create_email_export_search_email_export_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"$ref":"#/components/schemas/ExportFormatEnum","description":"Output format: csv (default), txt, or json.","default":"csv"},"description":"Output format: csv (default), txt, or json."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailSearchRequest"}}}},"responses":{"200":{"description":"Export queued successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportResponse"}}}},"400":{"description":"Maximum concurrent exports reached (PENDING/IN_PROGRESS limit).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Email search not available on your plan, search blocked, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"409":{"description":"An identical export is already queued or running.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Email search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/emails/locked-exists":{"post":{"tags":["Search Email"],"summary":"Batch exists-check of still-locked leaks by email or username (account-specific)","description":"For up to 100 emails or usernames, returns booleans and optional counts indicating whether there are leaks that are still locked for the current account. Use include_counts=true to also get locked/total/unlocked counts.","operationId":"emails_locked_exists_search_emails_locked_exists_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailMassRequest"}}},"required":true},"responses":{"200":{"description":"Per-email locked-exists results returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailMassResponse"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Your plan does not allow email/username mass checks, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Email search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/search/combolist/email":{"post":{"tags":["Search Combolists"],"summary":"Search combolists by exact email","description":"Search the Combolists dataset for an exact email address. Provide the search payload in the JSON body.\n\n**Dataset**\n- Combolists is a separate index from stealer logs: a pair returned here does not appear in `POST /search/email`, and unlocking it stores the record under `/profile/unlocked/combolists`, not `/profile/unlocked`.\n- Records carry no URL. A result is an identifier, a password, a password strength score, the email domain, and the date the pair was first added to the index.\n- Matching is exact and case-insensitive on the identifier. Use `search` to filter the matched set further on username or password.\n\n**Pagination**\n- `page` starts at 1.\n- `page_size` is 1 to 100 (default 100).\n- Deep interactive paging is capped. Past the offset limit the call answers 400 and you should queue `POST /search/combolist/export`.\n\n**Access and visibility**\n- The Combolists dataset is sold from the Enterprise tier upwards. Without it the search still runs, but identifiers come back masked, passwords are omitted and item IDs are not returned, so nothing can be unlocked.\n- Credentials are returned in clear only when `unlocked=true`.\n\n**Auto-unlock**\nPass `auto_unlock=true` to automatically unlock the locked pairs of the current page. 1 point is consumed per newly unlocked pair. If your balance is insufficient, a partial unlock is performed. The response field `auto_unlock_points_consumed` reports how many points were used.\n\n**Response**\n`CombolistSearchResponse` with `items`, `total`, `total_unlocked`, `page`, `page_size`. `blacklisted_value` is set instead of any result when the query matches one of your blacklist rules.","operationId":"search_combolist_email_search_combolist_email_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (1-100, default 100).","default":100,"title":"Page Size"},"description":"Items per page (1-100, default 100)."},{"name":"auto_unlock","in":"query","required":false,"schema":{"type":"boolean","description":"Automatically unlock the locked credentials of the current page using your points.","default":false,"title":"Auto Unlock"},"description":"Automatically unlock the locked credentials of the current page using your points."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombolistEmailSearchRequest"}}}},"responses":{"200":{"description":"Search results successfully returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombolistSearchResponse"}}}},"400":{"description":"Pagination too deep for interactive search.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Combolist search is not enabled on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Combolist search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/search/combolist/username":{"post":{"tags":["Search Combolists"],"summary":"Search combolists by exact username","description":"Search the Combolists dataset for an exact username, that is a pair whose identifier is not an email address. Provide the search payload in the JSON body.\n\n**Dataset**\n- Same index and same isolation rules as `POST /search/combolist/email`; only the identifier shape differs. This endpoint filters on `is_email = false`, so an email address never matches here, and `email_domain` is always null in the results.\n- Matching is exact and case-insensitive. Use `search` to filter the matched set further on username or password.\n\n**Pagination**\n- `page` starts at 1.\n- `page_size` is 1 to 100 (default 100).\n- Deep interactive paging is capped. Past the offset limit the call answers 400 and you should queue `POST /search/combolist/export`.\n\n**Access and visibility**\n- The Combolists dataset is sold from the Enterprise tier upwards. Without it the search still runs, but identifiers come back masked, passwords are omitted and item IDs are not returned, so nothing can be unlocked.\n\n**Auto-unlock**\nPass `auto_unlock=true` to unlock the locked pairs of the current page. 1 point per newly unlocked pair, partial unlock on insufficient balance, amount reported in `auto_unlock_points_consumed`.\n\n**Response**\n`CombolistSearchResponse` with `items`, `total`, `total_unlocked`, `page`, `page_size`.","operationId":"search_combolist_username_search_combolist_username_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (1-100, default 100).","default":100,"title":"Page Size"},"description":"Items per page (1-100, default 100)."},{"name":"auto_unlock","in":"query","required":false,"schema":{"type":"boolean","description":"Automatically unlock the locked credentials of the current page using your points.","default":false,"title":"Auto Unlock"},"description":"Automatically unlock the locked credentials of the current page using your points."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombolistUsernameSearchRequest"}}}},"responses":{"200":{"description":"Search results successfully returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombolistSearchResponse"}}}},"400":{"description":"Pagination too deep for interactive search.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Combolist search is not enabled on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Combolist search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/search/combolist/domain/{domain}":{"get":{"tags":["Search Combolists"],"summary":"Search combolists by exact email domain","description":"List the Combolist pairs whose identifier is an email address on the given root domain.\n\n**Dataset**\n- Matches on the indexed `email_domain`, so only pairs with an email identifier are returned. Username-only pairs are out of scope by construction, unlike stealer-log domain search which also matches on the leaked URL.\n- The domain is normalized (lowercased, trailing dot removed) and must be a valid hostname without `@`.\n\n**Pagination**\n- `page` starts at 1.\n- `page_size` is 1 to 1000 (default 100).\n- Deep interactive paging is capped. Past the offset limit the call answers 400 and you should queue `POST /search/combolist/export`.\n\n**Access and visibility**\n- The Combolists dataset is sold from the Enterprise tier upwards. Without it the search still runs, but identifiers come back masked, passwords are omitted and item IDs are not returned.\n\n**Auto-unlock**\nPass `auto_unlock=true` to unlock the locked pairs of the current page. 1 point per newly unlocked pair, partial unlock on insufficient balance, amount reported in `auto_unlock_points_consumed`.\n\n**Response**\n`CombolistSearchResponse` with `items`, `total`, `total_unlocked`, `page`, `page_size`.","operationId":"search_combolist_domain_search_combolist_domain__domain__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","maxLength":253,"description":"Root email domain to search, for example `example.com`.","title":"Domain"},"description":"Root email domain to search, for example `example.com`."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":100},{"type":"null"}],"description":"Filter the matched pairs further on username or password.","title":"Search"},"description":"Filter the matched pairs further on username or password."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page (1-1000, default 100).","default":100,"title":"Page Size"},"description":"Items per page (1-1000, default 100)."},{"name":"auto_unlock","in":"query","required":false,"schema":{"type":"boolean","description":"Automatically unlock the locked credentials of the current page using your points.","default":false,"title":"Auto Unlock"},"description":"Automatically unlock the locked credentials of the current page using your points."}],"responses":{"200":{"description":"Search results successfully returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombolistSearchResponse"}}}},"400":{"description":"Pagination too deep for interactive search.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Combolist search is not enabled on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Invalid domain, or invalid search filter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Combolist search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/search/combolist/domain/{domain}/report":{"get":{"tags":["Search Combolists"],"summary":"Get the dedicated combolist exposure report for a domain","description":"Aggregate Combolist exposure for a root email domain: total pairs, distinct email addresses, password strength breakdown, and the first and last dates a pair for that domain entered the index.\n\n**Access**\n- Authentication is optional. An anonymous caller gets the same aggregate figures; the report exposes counts only, never a credential.\n- A domain matching one of your blacklist rules returns a zeroed report rather than an error.\n\n**Caching**\nCached for one hour per domain and shared across callers. Send `x-no-cache: 1` to force a recompute.\n\n**Response**\n`CombolistDomainReportResponse`. `dataset` is always `combolist`, which is what distinguishes it from the stealer-log report at `GET /search/domain/{domain}`.","operationId":"get_combolist_domain_report_search_combolist_domain__domain__report_get","security":[{"BearerAuth":[]},{}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","maxLength":253,"description":"Root email domain to report on, for example `example.com`.","title":"Domain"},"description":"Root email domain to report on, for example `example.com`."}],"responses":{"200":{"description":"Report returned successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombolistDomainReportResponse"}}}},"404":{"description":"Combolist search is not enabled on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Invalid domain.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Combolist search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/search/combolist/advanced":{"post":{"tags":["Search Combolists"],"summary":"Search combolists with mapping-safe advanced filters","description":"Combine multiple filters over the Combolists dataset. Provide the filters in the JSON body.\n\n**Filterable fields**\nOnly the fields that exist in the combolist mapping are accepted, which is a strict subset of stealer-log advanced search: `username`, `password`, `email_domain` (each with a `_not` variant and a `_match_type` of `contains`, `starts_with` or `ends_with`), `username_hash`, `password_hash`, `is_email`, `password_strength`, `added_from`, `added_to` and `force_and`. There is no `url` filter: combolist records carry no URL. Sending a stealer-only field is a 422 rather than a silently ignored filter.\n\n**Boolean logic**\n- Values inside one field are OR by default; `force_and=true` requires every positive value of the same field to match. Excluded values stay OR whatever the setting.\n- Different fields are always AND.\n\n**Pagination**\n- `page` starts at 1.\n- `page_size` is 1 to 1000 (default 100).\n- Deep interactive paging is capped. Past the offset limit the call answers 400 and you should queue `POST /search/combolist/export`.\n\n**Rate limit**\nThis endpoint counts as a heavy search: it is bound by the advanced per-second limit and by your plan's concurrent heavy search slots, not by the lighter limit of the email and domain endpoints.\n\n**Access and visibility**\n- The Combolists dataset is sold from the Enterprise tier upwards. Without it the search still runs, but identifiers come back masked, passwords are omitted and item IDs are not returned.\n\n**Auto-unlock**\nPass `auto_unlock=true` to unlock the locked pairs of the current page. 1 point per newly unlocked pair, partial unlock on insufficient balance, amount reported in `auto_unlock_points_consumed`.\n\n**Response**\n`CombolistSearchResponse` with `items`, `total`, `total_unlocked`, `page`, `page_size`.","operationId":"search_combolist_advanced_search_combolist_advanced_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page (1-1000, default 100).","default":100,"title":"Page Size"},"description":"Items per page (1-1000, default 100)."},{"name":"auto_unlock","in":"query","required":false,"schema":{"type":"boolean","description":"Automatically unlock the locked credentials of the current page using your points.","default":false,"title":"Auto Unlock"},"description":"Automatically unlock the locked credentials of the current page using your points."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombolistAdvancedSearchRequest"}}}},"responses":{"200":{"description":"Search results successfully returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombolistSearchResponse"}}}},"400":{"description":"Pagination too deep for interactive search.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Combolist search is not enabled on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error, including a filter field absent from the combolist mapping.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Combolist search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/search/combolist/unlock":{"post":{"tags":["Search Combolists"],"summary":"Unlock selected combolist credentials","description":"Unlock a list of Combolist credential IDs and return them in clear.\n\n**Identifiers**\nOnly combolist IDs are accepted, that is the `cl1_` namespace followed by 60 hexadecimal characters. A stealer-log ID in the payload is a 400, never a silent skip: the two datasets never share an unlock endpoint. At most 10 000 IDs per call.\n\n**Billing**\n- 1 point per pair newly unlocked, taken from the account owner's balance. Pairs you already own are free and are returned again without charge.\n- If Elasticsearch rejects part of the batch, only the pairs that were actually written are billed; the rest is refunded.\n- The Combolists dataset is sold from the Enterprise tier upwards. Unlocking without it is a 403, even though the search itself answers.\n\n**Bulk**\nFor a whole result set rather than a selection, queue `POST /search/combolist/unlock/task` instead: it takes a scope rather than a list of IDs and reports progress as a task.\n\n**Response**\nA list of `CombolistUnlockResult`, one per credential whose unlock state could be confirmed. Passwords are omitted when your account preference hides them.","operationId":"unlock_combolist_credentials_search_combolist_unlock_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnlockRequest"}}},"required":true},"responses":{"200":{"description":"Credentials unlocked and returned in clear.","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CombolistUnlockResult"},"type":"array","title":"Response Unlock Combolist Credentials Search Combolist Unlock Post"}}}},"400":{"description":"No IDs provided, more than 10 000 IDs, an ID outside the combolist namespace, insufficient points, or every selected credential was already unlocked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"No active subscription, the Combolists dataset is not on your plan, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Combolist search is not enabled on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"410":{"description":"The selected credentials are no longer in the index. Refresh your search results and retry with the new IDs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"500":{"description":"Unlock state could not be verified, or indexation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Combolist search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}},"security":[{"BearerAuth":[]}]}},"/search/combolist/unlock/task":{"post":{"tags":["Search Combolists"],"summary":"Queue an asynchronous Combolist mass unlock","description":"Unlock every Combolist pair matching a search scope, as a background task.\n\n**Scope**\nThe body is the search itself, not a list of IDs: `scope` is one of `email`, `username`, `domain` or `advanced`, with `value` for the first three and `filters` for the last. The scope is revalidated by the worker, so a task cannot widen its own perimeter.\n\n**Cost and cap**\n- 1 point per pair newly unlocked. The task is capped at your current point balance, and further capped by `max` when you pass it.\n- Pairs you already own are skipped and cost nothing.\n- Plans that never spend points (Unlimited) get a 400: everything is already readable, use the export instead.\n\n**Progress**\nThe response carries a `task_id`. Poll it on `GET /profile/activities/tasks` to follow `updated` against `total`.\n\n**Concurrency**\nOne combolist unlock task at a time per account. Queuing a second one while the first runs is a 429.","operationId":"queue_combolist_unlock_task_search_combolist_unlock_task_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Upper bound on the number of pairs to unlock. Omit to use the whole point balance.","title":"Max"},"description":"Upper bound on the number of pairs to unlock. Omit to use the whole point balance."},{"name":"list_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Assign every newly unlocked pair to this unlocked list.","title":"List Id"},"description":"Assign every newly unlocked pair to this unlocked list."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombolistScopedRequest"}}}},"responses":{"200":{"description":"Task queued.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskStatusOut"}}}},"400":{"description":"Insufficient points, or the plan does not spend points.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"No active subscription, or the Combolists dataset is not on your plan for this scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Combolist search is not enabled on this deployment, or the target list does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Too many concurrent unlock tasks, or rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Combolist search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/search/combolist/export":{"post":{"tags":["Search Combolists"],"summary":"Queue a Combolist search export","description":"Export every Combolist pair matching a search scope, as a background job.\n\n**Scope**\nSame body as `POST /search/combolist/unlock/task`: `scope` is one of `email`, `username`, `domain` or `advanced`, with `value` for the first three and `filters` for the last.\n\n**What the file contains**\nOn a normal plan the export contains **only the pairs you have already unlocked** inside that scope, never the locked ones. To export a full result set, queue `POST /search/combolist/unlock/task` first and wait for it to finish. Plans that never spend points (Unlimited) get every matching pair directly.\n\n**Limits**\n- Formats: `csv`, `txt`, `json`.\n- At most 5 exports pending or in progress per account, all types combined.\n- An identical export already queued is refused rather than duplicated.\n\n**Retrieval**\nThe response carries an `export_id`. Follow it and download the file from the Exports endpoints.","operationId":"create_combolist_search_export_search_combolist_export_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"$ref":"#/components/schemas/ExportFormatEnum","description":"Output format: `csv`, `txt` or `json`.","default":"csv"},"description":"Output format: `csv`, `txt` or `json`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombolistScopedRequest"}}}},"responses":{"200":{"description":"Export queued.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportResponse"}}}},"400":{"description":"Too many exports already in progress.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"The Combolists dataset is not on your plan for this scope, or the search is blocked by one of your blacklist rules.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Combolist search is not enabled on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"409":{"description":"An identical export is already queued.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Combolist search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/search/raw":{"post":{"tags":["Raw Search"],"summary":"Search raw leak blocks","description":"Perform a full-text search across raw leak blocks. Provide the search payload in the JSON body.\n\n**Request body**\n\n- `q`: Optional search string (minimum 4 characters once quotes are removed).\n- `container_id`: Optional container identifier.\n- `exts` / `exts_not`: File extensions to include / exclude.\n- `categories` / `categories_not`: Raw file categories to include / exclude.\n- `file_name` / `file_name_not`: Match on `entry_name` (max 50 items, min 4 chars each).\n- `file_name_match_type` / `file_name_not_match_type`: How each list is matched, one mode per list: `contains` (default), `starts_with`, `ends_with` or `exact` (the whole entry name).\n- `folder_name` / `folder_name_not`: Match on the folder holding the block (max 20 items, min 4 chars each, surrounding slashes ignored). `folder_name_not` is not a standalone selector.\n- `folder_name_match_type` / `folder_name_not_match_type`: `contains` (default, substring of the path), `starts_with` (the path begins with the value), `ends_with` (the path ends with the value) or `exact` (a whole folder at any depth: `data` matches `a/b/data`, not `a/b/database`).\n- `file_name_exact` / `folder_name_exact`: Deprecated. `true` means `exact` on both the include and the exclude list when no match type is given.\n- `exclude_terms`: Content terms to exclude (substring, case-insensitive, max 20 items, min 4 chars each). Not a standalone selector.\n- `force_and`: Apply AND logic within `file_name` and within `folder_name` (default OR).\n- `ingested_at_min` / `ingested_at_max`: Datetime range filter (ISO 8601 with timezone).\n\nIf `q` is omitted, you must provide at least one filter among `container_id`, `exts`, `categories`, `file_name`, `folder_name`.\n\n**Query parameters**\n\n- `page` starts at 1.\n- `page_size` ranges from 1 to 100 (default 10).\n- `cursor`: Cursor returned in the previous response to fetch the next page of results.\n\n**Rate limit:** 5 requests per second per user.\n\n**Response:** `{ items, total, page, page_size }`\n\n---\n\n**Limits:**\n\n| Constraint | Value |\n|------------|-------|\n| Max file name filters | 50 |\n| Max folder name filters | 20 |\n| Min characters per file / folder name | 4 |\n| Max export results | 5 000 |\n| Max export files | 25 |\n| Download link retention | 7 days |","operationId":"raw_search_search_raw_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (1–100, default 10).","default":10,"title":"Page Size"},"description":"Items per page (1–100, default 10)."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cursor from previous response to fetch the next page","title":"Cursor"},"description":"Cursor from previous response to fetch the next page"},{"name":"dedup","in":"query","required":false,"schema":{"type":"boolean","description":"Collapse blocks with identical content (same block_fp64) into a single result. Dedup is per-page: with cursor pagination the same content may resurface on a later page.","default":false,"title":"Dedup"},"description":"Collapse blocks with identical content (same block_fp64) into a single result. Dedup is per-page: with cursor pagination the same content may resurface on a later page."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RawSearchRequest"}}}},"responses":{"200":{"description":"Search executed successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RawSearchResponse"}}}},"400":{"description":"Invalid query (too short, too long, or empty with no filters), expired search cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded (5 req/sec). See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"500":{"description":"Upstream search error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Raw search under maintenance, pagination temporarily unavailable, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/raw/count":{"post":{"tags":["Raw Search"],"summary":"Count matching raw blocks (mass-unlock cost estimate)","description":"Return how many raw blocks match the given filters, i.e. the maximum number of parts (1 point each) a mass unlock would consume. Uses the **same** payload as `/search/raw` so the count matches exactly what search and unlock traverse.\n\nThis is intended to be called on demand (e.g. when opening the mass-unlock dialog), NOT on every search: the count is heavier than a page fetch and is cached.\n\n- `exact=true`: `total` is the exact count.\n- `exact=false`: `total` is an upper bound (`q_exact` and/or `dedup` shrink the real set).\n- `capped=true`: the count hit its upper limit, so `total` is a lower bound.\n\n**Rate limit:** shares the raw search limit, including its concurrent-request slot: a count fans out over every shard of the raw index, so it is billed against the same budget as `/search/raw` rather than the wider generic search limit.","operationId":"raw_count_search_raw_count_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"dedup","in":"query","required":false,"schema":{"type":"boolean","description":"Mark the count as an upper bound because the deduplicated view folds identical content (block_fp64) app-side.","default":false,"title":"Dedup"},"description":"Mark the count as an upper bound because the deduplicated view folds identical content (block_fp64) app-side."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RawSearchRequest"}}}},"responses":{"200":{"description":"Count computed successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RawCountResponse"}}}},"400":{"description":"Invalid query (too short, too long, or empty with no filters).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Raw search not available on your plan, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Raw search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/raw/parts":{"get":{"tags":["Raw Search"],"summary":"List parts for a raw entry","description":"Return metadata about the blocks (parts) of a raw entry.\n\n**Query parameters**\n- `container_id`: Required container identifier.\n- `entry_path`: Path of the entry inside the container.\n- `page`/`page_size`: Pagination parameters.\n\n**Response**\nUniform shape: { items, total, page, page_size } and optional `window`.","operationId":"list_parts_search_raw_parts_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"container_id","in":"query","required":true,"schema":{"type":"integer","minimum":1,"description":"Container identifier.","title":"Container Id"},"description":"Container identifier."},{"name":"entry_path","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Path of the entry inside the container.","title":"Entry Path"},"description":"Path of the entry inside the container."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page (1–1000, default 100).","default":100,"title":"Page Size"},"description":"Items per page (1–1000, default 100)."}],"responses":{"200":{"description":"Parts listed successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartsResponse"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"500":{"description":"Search query failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Raw search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/raw/part":{"get":{"tags":["Raw Search"],"summary":"Retrieve a raw entry part","description":"Fetch the textual content for a specific raw entry block. If the block is not unlocked, the content is censored unless `auto_unlock=true` succeeds.\n\n**Query parameters**\n- `container_id`: Required container identifier.\n- `entry_path`: Path of the entry inside the container.\n- `seq`: Block sequence number (0-based).\n- `trim_overlap`: When true, drop the overlapping prefix shared with the previous block.\n- `overlap_chars`: Number of characters to trim when `trim_overlap=true` (default from configuration).\n- `auto_unlock`: Attempt to unlock the block using points when necessary.\n\n**Response**\nReturns `PartResponse` describing the block and its (possibly censored) content.","operationId":"get_part_search_raw_part_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"container_id","in":"query","required":true,"schema":{"type":"integer","minimum":1,"description":"Container identifier.","title":"Container Id"},"description":"Container identifier."},{"name":"entry_path","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Path of the entry inside the container.","title":"Entry Path"},"description":"Path of the entry inside the container."},{"name":"seq","in":"query","required":true,"schema":{"type":"integer","minimum":0,"description":"Block sequence number (0-based).","title":"Seq"},"description":"Block sequence number (0-based)."},{"name":"trim_overlap","in":"query","required":false,"schema":{"type":"boolean","description":"Drop the overlapping prefix shared with the previous block.","default":false,"title":"Trim Overlap"},"description":"Drop the overlapping prefix shared with the previous block."},{"name":"overlap_chars","in":"query","required":false,"schema":{"type":"integer","maximum":8192,"minimum":0,"description":"Characters to trim when trim_overlap=true.","default":256,"title":"Overlap Chars"},"description":"Characters to trim when trim_overlap=true."},{"name":"auto_unlock","in":"query","required":false,"schema":{"type":"boolean","description":"Attempt to unlock the block using points when necessary.","default":false,"title":"Auto Unlock"},"description":"Attempt to unlock the block using points when necessary."}],"responses":{"200":{"description":"Block returned successfully (content censored unless unlocked).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartResponse"}}}},"400":{"description":"Insufficient points during auto-unlock.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"auto_unlock requires an active raw plan, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Block not found or unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"500":{"description":"Search query failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Raw search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/container/tree":{"get":{"tags":["Raw Search"],"summary":"Browse the container tree","description":"List entries located under a given prefix within a container.\n\nPagination uses `page`/`page_size`.\n\nUniform response: { items, total, page, page_size }.","operationId":"container_tree_container_tree_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"container_id","in":"query","required":true,"schema":{"type":"integer","minimum":1,"description":"Container identifier.","title":"Container Id"},"description":"Container identifier."},{"name":"prefix","in":"query","required":false,"schema":{"type":"string","description":"folder prefix, ex: 'db/users' ('' = root of container)","default":"","title":"Prefix"},"description":"folder prefix, ex: 'db/users' ('' = root of container)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page (1–1000, default 200).","default":200,"title":"Page Size"},"description":"Items per page (1–1000, default 200)."}],"responses":{"200":{"description":"Entries listed successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerTreeResponse"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"500":{"description":"Search query failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Raw search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/container/subfolders":{"get":{"tags":["Raw Search"],"summary":"List immediate subfolders","description":"Aggregate the immediate subfolders located under the provided prefix.\n\nPagination is `page`/`page_size`. The server hides any cursor and handles deep paging internally.\n\nUniform response: { items, total, page, page_size } + has_more.","operationId":"container_subfolders_container_subfolders_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"container_id","in":"query","required":true,"schema":{"type":"integer","minimum":1,"description":"Container identifier.","title":"Container Id"},"description":"Container identifier."},{"name":"prefix","in":"query","required":false,"schema":{"type":"string","description":"folder prefix ('' for root)","default":"","title":"Prefix"},"description":"folder prefix ('' for root)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":1,"description":"Items per page (1–100000, default 1000).","default":1000,"title":"Page Size"},"description":"Items per page (1–100000, default 1000)."}],"responses":{"200":{"description":"Subfolders aggregated successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubfoldersResponse"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"500":{"description":"Aggregation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Raw search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/container/tree/resolve_path":{"post":{"tags":["Raw Search"],"summary":"Resolve a full folder chain and prefetch its contents","description":"Resolve an entry path by hydrating every folder segment leading to it.\n\nThe resolver fetches the immediate subfolders and a page of files for each segment in the chain. It also can prefetch parts around a target sequence.","operationId":"resolve_container_tree_path_container_tree_resolve_path_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolvePathRequest"}}},"required":true},"responses":{"200":{"description":"Folder chain resolved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolvePathResponse"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Folder or entry not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"500":{"description":"Search query failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Raw search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/container/file_info":{"get":{"tags":["Raw Search"],"summary":"Fetch metadata for a raw entry","description":"Return the stored metadata for a raw entry located in the container tree.","operationId":"container_file_info_container_file_info_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"container_id","in":"query","required":true,"schema":{"type":"integer","minimum":1,"description":"Container identifier.","title":"Container Id"},"description":"Container identifier."},{"name":"entry_path","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Path of the entry inside the container.","title":"Entry Path"},"description":"Path of the entry inside the container."}],"responses":{"200":{"description":"Entry metadata returned successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RawFileInfoResponse"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Entry not found in the index.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"500":{"description":"Search error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Raw search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/raw/download":{"post":{"tags":["Raw Search"],"summary":"Generate a download URL for a raw file","description":"Return a short-lived URL that allows downloading a raw file. Either provide the `sha256_original` hash directly or specify both `container_id` and `entry_path` so the hash can be resolved.\n\nYou can pass parameters either as query string or in the JSON body. If both are provided, the JSON body values take precedence.","operationId":"raw_download_source_raw_download_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"sha256_original","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"SHA-256 of the original file (alternative to container_id + entry_path).","title":"Sha256 Original"},"description":"SHA-256 of the original file (alternative to container_id + entry_path)."},{"name":"container_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Container identifier (with entry_path, resolves the file hash).","title":"Container Id"},"description":"Container identifier (with entry_path, resolves the file hash)."},{"name":"entry_path","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"description":"Path of the entry inside the container.","title":"Entry Path"},"description":"Path of the entry inside the container."},{"name":"expires_in","in":"query","required":false,"schema":{"type":"integer","maximum":3600,"minimum":60,"description":"Download URL lifetime in seconds (60–3600, default 900).","default":900,"title":"Expires In"},"description":"Download URL lifetime in seconds (60–3600, default 900)."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"description":"Optional JSON body with `sha256_original`, `container_id`, `entry_path`, `expires_in`.\nExample: {\"sha256_original\": \"...\", \"container_id\": 123, \"entry_path\": \"path/to/file\", \"expires_in\": 900}","examples":[{"container_id":123,"entry_path":"db/users.txt","expires_in":900}],"title":"Payload"}}}},"responses":{"200":{"description":"Download URL generated successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownloadSourceResponse"}}}},"400":{"description":"Missing or invalid identifier (container_id / expires_in).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"402":{"description":"Insufficient GB quota to unlock the file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Raw download requires an active raw plan, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"File not found, sha256 unknown, or raw file not registered.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"500":{"description":"Storage or search error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Raw search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/raw/download/preview":{"get":{"tags":["Raw Search"],"summary":"Preview unlock cost for a raw file","description":"Return the quota impact of unlocking a raw file. Either provide `sha256_original` or the tuple (`container_id`, `entry_path`).","operationId":"raw_download_preview_raw_download_preview_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"sha256_original","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"SHA-256 of the original file (alternative to container_id + entry_path).","title":"Sha256 Original"},"description":"SHA-256 of the original file (alternative to container_id + entry_path)."},{"name":"container_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Container identifier (with entry_path, resolves the file hash).","title":"Container Id"},"description":"Container identifier (with entry_path, resolves the file hash)."},{"name":"entry_path","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"description":"Path of the entry inside the container.","title":"Entry Path"},"description":"Path of the entry inside the container."}],"responses":{"200":{"description":"Preview computed successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RawDownloadPreviewResponse"}}}},"400":{"description":"Missing or invalid identifier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"File not found, sha256 unknown, or raw file not registered.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"500":{"description":"Search error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Raw search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/raw/export":{"post":{"tags":["Raw Search"],"summary":"Queue a raw export job","description":"Queue an asynchronous export job for raw search results. Mode 'rows' exports a CSV of matching lines, mode 'parts' exports a text snapshot of matching parts.\n\n**Important**: This export only includes results that have been previously unlocked via Mass Unlock. No points are consumed during export. Use `/search/raw/unlock/task` to unlock results first.","operationId":"raw_export_search_raw_export_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"export","in":"query","required":true,"schema":{"type":"string","pattern":"^(rows|parts)$","description":"Export mode: `rows` (CSV of matching lines) or `parts` (text snapshot of matching parts).","title":"Export"},"description":"Export mode: `rows` (CSV of matching lines) or `parts` (text snapshot of matching parts)."},{"name":"dedup","in":"query","required":false,"schema":{"type":"boolean","description":"Deduplicate the export. `rows`: drop duplicate lines (whitespace-normalized, case-insensitive). `parts`: drop blocks with identical content.","default":false,"title":"Dedup"},"description":"Deduplicate the export. `rows`: drop duplicate lines (whitespace-normalized, case-insensitive). `parts`: drop blocks with identical content."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RawSearchRequest"}}}},"responses":{"200":{"description":"Export job queued successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportResponse"}}}},"400":{"description":"Invalid query (too short, too long, or empty with no filters), maximum concurrent exports reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Raw export requires an active raw plan, search blocked, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"409":{"description":"An identical export is already queued/running, or an identical Raw Export is still in its quarantine cooling-off period.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"500":{"description":"Error while creating the export job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Raw search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/raw/files":{"get":{"tags":["Raw Search"],"summary":"List indexed raw files","description":"Return raw files that are done, non-duplicate and have indexed lines.","operationId":"list_raw_files_raw_files_get","responses":{"200":{"description":"Raw files listed successfully.","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/RawFileAddedSummary"},"type":"array","title":"Response List Raw Files Raw Files Get"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}},"security":[{"BearerAuth":[]}]}},"/search/raw/unlock/task":{"post":{"tags":["Raw Search"],"summary":"Queue an async mass unlock task for raw search","description":"Creates an asynchronous unlock **Task** for the given raw search filters. Returns a `task_id` you can poll with the task-status endpoint.\n\n**Request body**\n- `q`: Optional search string (minimum 4 characters if provided). Required if no other filter is provided.\n- `container_id`: Optional container identifier.\n- `exts`: Optional list of file extensions to keep.\n- `exts_not`: Optional list of file extensions to exclude.\n- `categories`: Optional list of raw file categories.\n- `categories_not`: Optional list of raw file categories to exclude.\n- `file_name`: Optional match on `entry_name`.\n- `file_name_not`: Optional match that must NOT hold on `entry_name`.\n- `file_name_match_type` / `file_name_not_match_type`: `contains` (default), `starts_with`, `ends_with` or `exact`, one per list.\n- `folder_name`: Optional match on the folder holding the block (max 20 items, min 4 chars each).\n- `folder_name_not`: Optional folders to exclude. Not a standalone selector.\n- `folder_name_match_type` / `folder_name_not_match_type`: `contains` (default), `starts_with`, `ends_with` or `exact` (a whole folder at any depth), one per list.\n- `file_name_exact` / `folder_name_exact`: Deprecated, `true` means `exact` on both lists when no match type is given.\n- `exclude_terms`: Optional content terms to exclude (substring, case-insensitive, max 20, min 4 chars each).\n- `ingested_at_min`: Optional datetime to filter results ingested on or after.\n- `ingested_at_max`: Optional datetime to filter results ingested on or before.\n\n**Query parameters**\n- `max`: Optional cap of new unlocks. 0 or omitted = use all your points.\n\n**Plan requirement**\nRequires a paid plan with `raw_search` enabled.\n\n**Concurrency limit**\n- raw: max 1 running and 1 queued task per account.\n- identical active requests return the existing task id.\n- email / domain: max 5 concurrent tasks per user.\n- Returns 429 if limit exceeded.","operationId":"queue_raw_unlock_task_search_raw_unlock_task_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"0 or omitted = use all your points","title":"Max"},"description":"0 or omitted = use all your points"},{"name":"dedup","in":"query","required":false,"schema":{"type":"boolean","description":"Skip blocks with identical content (same block_fp64) so each unique content is unlocked once. Matches the deduplicated search/export view.","default":false,"title":"Dedup"},"description":"Skip blocks with identical content (same block_fp64) so each unique content is unlocked once. Matches the deduplicated search/export view."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RawSearchRequest"}}}},"responses":{"200":{"description":"Unlock task queued; returns a task_id to poll.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Queue Raw Unlock Task Search Raw Unlock Task Post"}}}},"400":{"description":"Invalid query (too short, too long, or empty with no filters), insufficient points, unlock not needed on your plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Raw search not available on your plan, this search is blocked, account banned, or pending email verification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded, or the account already has a queued raw unlock task.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"503":{"description":"Raw search under maintenance, or public API temporarily disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profile":{"get":{"tags":["Profile"],"summary":"Get user profile","description":"Return the profile of the authenticated user.","operationId":"get_profile_profile_get","responses":{"200":{"description":"User profile retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserBase"}}}},"401":{"description":"Unauthorized. Invalid or missing authentication token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"User not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error: invalid request parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Too many requests: rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["Profile"],"summary":"Update user profile","description":"Update the authenticated user's profile with fields defined by `ProfileUpdate` (name, organization, address, country, VAT number, etc.). Email is not editable here.\n\n**Behavior**\n- Only whitelisted fields from `ProfileUpdate` are applied.\n\n**Response**\nReturns the updated profile.","operationId":"update_profile_profile_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileUpdate"}}},"required":true},"responses":{"200":{"description":"User profile updated successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserBase"}}}},"400":{"description":"Invalid VAT number.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Unauthorized. Invalid or missing authentication token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"User not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error: invalid request parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Too many requests: rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}},"security":[{"BearerAuth":[]}]}},"/profile/unlocked":{"get":{"tags":["Unlocked Leaks"],"summary":"List your unlocked leaks","description":"Return a paginated list of unlocked leaks for the authenticated account.\n\nPagination\n- `page` starts at 1.\n- `page_size` is 1 to 1000 (default 100).\n\nFiltering\n- `search` optional free-text filter applied to URL or username.\n- `is_email` optional boolean: `true` emails only, `false` usernames only, `null` both.\n- `list_id` optional integer: filter leaks assigned to this list.\n- `list_none` optional boolean: filter leaks with no list assignment.\n\nResponse semantics\n- When no filter is provided at all (no `search`, no `is_email`, no list filter), `total` equals your global count of unlocked items.\n- When any filter is provided (including only `is_email`), `total` equals the filtered count, while `total_unlocked` remains your global total.\n\n**Errors**\n- 401 Authentication required, or invalid/expired API key.\n- 404 Page out of range.\n- 422 Request validation error.","operationId":"get_unlocked_leaks_profile_unlocked_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page (1–1000, default 100).","default":100,"title":"Page Size"},"description":"Items per page (1–1000, default 100)."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional free-text filter on URL or username.","title":"Search"},"description":"Optional free-text filter on URL or username."},{"name":"is_email","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"true=email, false=username","title":"Is Email"},"description":"true=email, false=username"},{"name":"list_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Filter by list id.","title":"List Id"},"description":"Filter by list id."},{"name":"list_none","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Only leaks without a list when true","title":"List None"},"description":"Only leaks without a list when true"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by remediation status: new, in_progress, fixed, accepted_risk","title":"Status"},"description":"Filter by remediation status: new, in_progress, fixed, accepted_risk"}],"responses":{"200":{"description":"Unlocked leaks returned successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedUnlockedLeaksResponse"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Page out of range.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profile/unlocked/advanced":{"get":{"tags":["Unlocked Leaks"],"summary":"List your unlocked leaks with advanced filters","description":"Return a paginated list of your unlocked leaks filtered by the same fields supported by `LeakSearchFilters`. Filters are passed as query parameters. Optional `search` can further narrow results.\n\nPagination\n- `page` starts at 1.\n- `page_size` is 1 to 1000 (default 100).\n\nFiltering\n- Any combination of `LeakSearchFilters` fields.\n- `search` optional free-text filter applied to URL or username.\n- `list_id` optional integer: filter leaks assigned to this list.\n- `list_none` optional boolean: filter leaks with no list assignment.\n\nResponse semantics\n- `total` and `total_unlocked` both equal the number of unlocked items matching the filters.","operationId":"search_unlocked_advanced_profile_unlocked_advanced_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page (1–1000, default 100).","default":100,"title":"Page Size"},"description":"Items per page (1–1000, default 100)."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional free-text filter on URL or username.","title":"Search"},"description":"Optional free-text filter on URL or username."},{"name":"list_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Filter by list id.","title":"List Id"},"description":"Filter by list id."},{"name":"list_none","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Only leaks without a list when true.","title":"List None"},"description":"Only leaks without a list when true."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by remediation status: new, in_progress, fixed, accepted_risk","title":"Status"},"description":"Filter by remediation status: new, in_progress, fixed, accepted_risk"},{"name":"username","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":100,"strip_whitespace":true}},{"type":"null"}],"description":"Username values to match.","title":"Username"},"description":"Username values to match."},{"name":"username_not","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":100,"strip_whitespace":true}},{"type":"null"}],"description":"Username values to exclude.","title":"Username Not"},"description":"Username values to exclude."},{"name":"username_match_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Username matching mode; default contains.","title":"Username Match Type"},"description":"Username matching mode; default contains."},{"name":"username_not_match_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded username matching mode; default contains.","title":"Username Not Match Type"},"description":"Excluded username matching mode; default contains."},{"name":"password","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":100,"strip_whitespace":true}},{"type":"null"}],"description":"Password values to match.","title":"Password"},"description":"Password values to match."},{"name":"password_not","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":100,"strip_whitespace":true}},{"type":"null"}],"description":"Password values to exclude.","title":"Password Not"},"description":"Password values to exclude."},{"name":"password_match_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Password matching mode; default contains.","title":"Password Match Type"},"description":"Password matching mode; default contains."},{"name":"password_not_match_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded password matching mode; default contains.","title":"Password Not Match Type"},"description":"Excluded password matching mode; default contains."},{"name":"url","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":100,"strip_whitespace":true}},{"type":"null"}],"description":"URL values to match.","title":"Url"},"description":"URL values to match."},{"name":"url_not","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":100,"strip_whitespace":true}},{"type":"null"}],"description":"URL values to exclude.","title":"Url Not"},"description":"URL values to exclude."},{"name":"url_match_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"URL matching mode; default contains.","title":"Url Match Type"},"description":"URL matching mode; default contains."},{"name":"url_not_match_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded URL matching mode; default contains.","title":"Url Not Match Type"},"description":"Excluded URL matching mode; default contains."},{"name":"url_domain","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":100,"strip_whitespace":true}},{"type":"null"}],"description":"URL domain values to match.","title":"Url Domain"},"description":"URL domain values to match."},{"name":"url_domain_not","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":100,"strip_whitespace":true}},{"type":"null"}],"description":"URL domain values to exclude.","title":"Url Domain Not"},"description":"URL domain values to exclude."},{"name":"url_domain_match_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"URL domain matching mode; default contains.","title":"Url Domain Match Type"},"description":"URL domain matching mode; default contains."},{"name":"url_domain_not_match_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded URL domain matching mode; default contains.","title":"Url Domain Not Match Type"},"description":"Excluded URL domain matching mode; default contains."},{"name":"url_host","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":100,"strip_whitespace":true}},{"type":"null"}],"description":"URL host values to match.","title":"Url Host"},"description":"URL host values to match."},{"name":"url_host_not","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":100,"strip_whitespace":true}},{"type":"null"}],"description":"URL host values to exclude.","title":"Url Host Not"},"description":"URL host values to exclude."},{"name":"url_host_match_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"URL host matching mode; default contains.","title":"Url Host Match Type"},"description":"URL host matching mode; default contains."},{"name":"url_host_not_match_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded URL host matching mode; default contains.","title":"Url Host Not Match Type"},"description":"Excluded URL host matching mode; default contains."},{"name":"username_hash","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":100,"strip_whitespace":true}},{"type":"null"}],"description":"Username SHA-1 hash prefix (hex).","title":"Username Hash"},"description":"Username SHA-1 hash prefix (hex)."},{"name":"password_hash","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":100,"strip_whitespace":true}},{"type":"null"}],"description":"Password SHA-1 hash prefix (hex).","title":"Password Hash"},"description":"Password SHA-1 hash prefix (hex)."},{"name":"url_scheme","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":20,"strip_whitespace":true}},{"type":"null"}],"description":"URL scheme(s) to include (multi).","title":"Url Scheme"},"description":"URL scheme(s) to include (multi)."},{"name":"url_scheme_not","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":20,"strip_whitespace":true}},{"type":"null"}],"description":"URL scheme(s) to exclude (multi).","title":"Url Scheme Not"},"description":"URL scheme(s) to exclude (multi)."},{"name":"url_port","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"integer"}},{"type":"null"}],"description":"URL port(s) to include (multi).","title":"Url Port"},"description":"URL port(s) to include (multi)."},{"name":"url_port_not","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"integer"}},{"type":"null"}],"description":"URL port(s) to exclude (multi).","title":"Url Port Not"},"description":"URL port(s) to exclude (multi)."},{"name":"url_tld","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":10,"strip_whitespace":true}},{"type":"null"}],"description":"URL TLD(s) to include (multi).","title":"Url Tld"},"description":"URL TLD(s) to include (multi)."},{"name":"url_tld_not","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":10,"strip_whitespace":true}},{"type":"null"}],"description":"URL TLD(s) to exclude (multi).","title":"Url Tld Not"},"description":"URL TLD(s) to exclude (multi)."},{"name":"is_email","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Identifier type filter: true=email only, false=username only, null=both.","title":"Is Email"},"description":"Identifier type filter: true=email only, false=username only, null=both."},{"name":"email_domain","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":100,"strip_whitespace":true}},{"type":"null"}],"description":"Email domain values to match.","title":"Email Domain"},"description":"Email domain values to match."},{"name":"email_domain_not","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":100,"strip_whitespace":true}},{"type":"null"}],"description":"Email domain values to exclude.","title":"Email Domain Not"},"description":"Email domain values to exclude."},{"name":"email_domain_match_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Email domain matching mode; default contains.","title":"Email Domain Match Type"},"description":"Email domain matching mode; default contains."},{"name":"email_domain_not_match_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded email domain matching mode; default contains.","title":"Email Domain Not Match Type"},"description":"Excluded email domain matching mode; default contains."},{"name":"email_host","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":100,"strip_whitespace":true}},{"type":"null"}],"description":"Email host values to match.","title":"Email Host"},"description":"Email host values to match."},{"name":"email_host_not","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":100,"strip_whitespace":true}},{"type":"null"}],"description":"Email host values to exclude.","title":"Email Host Not"},"description":"Email host values to exclude."},{"name":"email_host_match_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Email host matching mode; default contains.","title":"Email Host Match Type"},"description":"Email host matching mode; default contains."},{"name":"email_host_not_match_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded email host matching mode; default contains.","title":"Email Host Not Match Type"},"description":"Excluded email host matching mode; default contains."},{"name":"email_tld","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":10,"strip_whitespace":true}},{"type":"null"}],"description":"Email TLD(s) to include (multi).","title":"Email Tld"},"description":"Email TLD(s) to include (multi)."},{"name":"email_tld_not","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":10,"strip_whitespace":true}},{"type":"null"}],"description":"Email TLD(s) to exclude (multi).","title":"Email Tld Not"},"description":"Email TLD(s) to exclude (multi)."},{"name":"password_strength","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PasswordStrengthCategory-Input"},{"type":"null"}],"description":"Filter by password strength category. too_weak = score 0-2, weak = 3-4, medium = 5-7, strong = 8+.","title":"Password Strength"},"description":"Filter by password strength category. too_weak = score 0-2, weak = 3-4, medium = 5-7, strong = 8+."},{"name":"added_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only include leaks indexed on/after this UTC datetime.","title":"Added From"},"description":"Only include leaks indexed on/after this UTC datetime."},{"name":"added_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only include leaks indexed on/before this UTC datetime.","title":"Added To"},"description":"Only include leaks indexed on/before this UTC datetime."},{"name":"force_and","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"When true, values within each field are combined with AND instead of OR.","title":"Force And"},"description":"When true, values within each field are combined with AND instead of OR."}],"responses":{"200":{"description":"Unlocked leaks returned successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedUnlockedLeaksResponse"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Page out of range.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profile/unlocked/export":{"post":{"tags":["Unlocked Leaks"],"summary":"Export your unlocked leaks to CSV/TXT/JSON","description":"Queue an export of your unlocked leaks with optional filters. The job runs asynchronously and the file will appear in the Exports section when ready.\n\nBody (JSON)\n- `search` optional free-text filter applied to URL or username.\n- `is_email` optional boolean: `true` emails only, `false` usernames only, `null` both.\n- `list_id` optional list id filter.\n- `list_none` optional boolean to only include leaks without list.\n- `unlocked_at_min` optional ISO 8601 timestamp (with timezone) to include items unlocked at or after this instant.\n- `status` optional remediation status: `new`, `in_progress`, `fixed` or `accepted_risk`. Omit it to export every status. `new` also matches records that were never triaged.\n\nQuery parameters\n- `format` optional output format: `csv` (default), `txt`, or `json`.\n\nLimits\n- You can have at most 5 exports with status PENDING or IN_PROGRESS.\n\nColumns\nURL, USERNAME, PASSWORD, ADDED_AT, UNLOCKED_AT, STATUS. The TXT format stays `url:username:password`, one record per line.\n\nResponse\n`ExportResponse` with `status`, `message`, and `export_id`.","operationId":"export_unlocked_leaks_profile_unlocked_export_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"$ref":"#/components/schemas/ExportFormatEnum","description":"Output format: csv (default), txt, or json.","default":"csv"},"description":"Output format: csv (default), txt, or json."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnlockedExportRequest"}}}},"responses":{"200":{"description":"Export queued successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportResponse"}}}},"400":{"description":"Maximum concurrent exports reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profile/unlocked/advanced/export":{"post":{"tags":["Unlocked Leaks"],"summary":"Export your unlocked leaks to CSV/TXT/JSON (advanced filters)","description":"Queue an export of your unlocked leaks filtered by the same fields supported by `LeakSearchFilters`. Provide advanced filters in the JSON request body. The job runs asynchronously and the file will appear in the Exports section when ready.\n\nRequest body\n- JSON payload following the `LeakSearchFilters` schema.\n- The four scope fields below may also be sent as keys of this same flat body. A value given in the query string wins over the body one.\n\nScope, as query parameters or body keys\n- `unlocked_at_min` optional ISO 8601 timestamp with timezone to include items unlocked at or after this instant.\n- `list_id` optional list id filter.\n- `list_none` optional boolean to only include leaks without list.\n- `status` optional remediation status: `new`, `in_progress`, `fixed` or `accepted_risk`. Omit it to export every status.\n- `format` optional output format: `csv` (default), `txt`, or `json`.\n\nLimits\n- At least one advanced filter is required.\n- You can have at most 5 exports with status PENDING or IN_PROGRESS.\n\nResponse\n`ExportResponse` with `status`, `message`, and `export_id`.","operationId":"export_unlocked_advanced_leaks_profile_unlocked_advanced_export_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"list_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by list id","title":"List Id"},"description":"Filter by list id"},{"name":"list_none","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Only leaks without list","title":"List None"},"description":"Only leaks without list"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["new","in_progress","fixed","accepted_risk"],"type":"string"},{"type":"null"}],"description":"Remediation status filter. Omit to export every status.","title":"Status"},"description":"Remediation status filter. Omit to export every status."},{"name":"format","in":"query","required":false,"schema":{"$ref":"#/components/schemas/ExportFormatEnum","description":"Output format: csv (default), txt, or json.","default":"csv"},"description":"Output format: csv (default), txt, or json."},{"name":"unlocked_at_min","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only include items unlocked at or after this ISO 8601 timestamp (with timezone).","title":"Unlocked At Min"},"description":"Only include items unlocked at or after this ISO 8601 timestamp (with timezone)."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnlockedAdvancedExportRequest"}}}},"responses":{"200":{"description":"Export queued successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportResponse"}}}},"400":{"description":"No filters provided, maximum concurrent exports reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profile/unlocked/combolists":{"get":{"tags":["Unlocked Combolists"],"summary":"List unlocked combolist credentials","description":"List the Combolist credentials you have unlocked, in clear.\n\n**Separate from unlocked leaks**\nThis space is disjoint from `GET /profile/unlocked`: a pair unlocked from a combolist search never shows up there, and a stealer-log record never shows up here. Unlocked lists, however, are shared between the two datasets.\n\n**Filters**\n- `search` matches on username or password.\n- `is_email` splits email identifiers from username-only ones.\n- `list_id` and `list_none` are mutually exclusive.\n- `status` is the remediation status you set on the record.\n- `unlocked_at_min` keeps only what you unlocked at or after that instant, which is how you page an incremental sync. It must carry a timezone.\n\n**Pagination**\n- `page` starts at 1.\n- `page_size` is 1 to 1000 (default 100).\n\n**Response**\n`PaginatedUnlockedCombolistsResponse`. `total` is the filtered count and `total_unlocked` the unfiltered one, so a client can show \"x of y\" without a second call.","operationId":"get_unlocked_combolists_profile_unlocked_combolists_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page (1-1000, default 100).","default":100,"title":"Page Size"},"description":"Items per page (1-1000, default 100)."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Filter on username or password.","title":"Search"},"description":"Filter on username or password."},{"name":"is_email","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"`true` keeps only email identifiers, `false` only username-only pairs. Omit for both.","title":"Is Email"},"description":"`true` keeps only email identifiers, `false` only username-only pairs. Omit for both."},{"name":"list_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Keep only the records assigned to this list.","title":"List Id"},"description":"Keep only the records assigned to this list."},{"name":"list_none","in":"query","required":false,"schema":{"type":"boolean","description":"Keep only the records with no list assigned.","default":false,"title":"List None"},"description":"Keep only the records with no list assigned."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["new","in_progress","fixed","accepted_risk"],"type":"string"},{"type":"null"}],"description":"Keep only the records in this remediation status.","title":"Status"},"description":"Keep only the records in this remediation status."},{"name":"unlocked_at_min","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Keep only what was unlocked at or after this instant. Must carry a timezone, for example `2026-09-01T00:00:00Z`.","title":"Unlocked At Min"},"description":"Keep only what was unlocked at or after this instant. Must carry a timezone, for example `2026-09-01T00:00:00Z`."}],"responses":{"200":{"description":"Unlocked credentials returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedUnlockedCombolistsResponse"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Combolist search is not enabled on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error, including `unlocked_at_min` without a timezone.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/profile/unlocked/combolists/advanced":{"post":{"tags":["Unlocked Combolists"],"summary":"List unlocked combolist credentials with advanced filters","description":"Same listing as `GET /profile/unlocked/combolists`, with the advanced filter set applied on top.\n\n**Filters**\n- `filters` takes the same contract as `POST /search/combolist/advanced`: `username`, `password`, `email_domain` with their `_not` and `_match_type` variants, the hash prefixes, `is_email`, `password_strength`, `added_from`, `added_to` and `force_and`. There is no `url` filter, combolist records carry no URL.\n- The unlocked-specific filters (`search`, `is_email`, `list_id`, `list_none`, `status`, `unlocked_at_min`) still apply and combine with AND.\n- `filters` is optional: an empty set behaves exactly like the global listing.\n\n**Why POST**\nThe body reuses the advanced search contract verbatim rather than a second query-string parser that could drift from it.\n\n**Export**\n`POST /profile/unlocked/combolists/export` takes the same `filters`, so the file holds exactly the rows this listing shows.","operationId":"search_unlocked_combolists_advanced_profile_unlocked_combolists_advanced_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page (1-1000, default 100).","default":100,"title":"Page Size"},"description":"Items per page (1-1000, default 100)."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombolistUnlockedAdvancedRequest"}}}},"responses":{"200":{"description":"Unlocked credentials returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedUnlockedCombolistsResponse"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Combolist search is not enabled on this deployment, the list does not exist, or the page is out of range.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error, including a filter field absent from the combolist mapping.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/profile/unlocked/combolists/{leak_id}/list":{"put":{"tags":["Unlocked Combolists"],"summary":"Assign or unassign a list for one unlocked combolist credential","description":"Assign a specific unlocked list to a single unlocked combolist credential, or unassign it.\n\nBehavior\n- Provide `list_id` to assign. Use `null` to remove the assignment.\n- Lists are shared with unlocked leaks: the same list can hold records from both datasets. Counts per dataset are read from `GET /profile/unlocked/lists?dataset=combolist`.","operationId":"set_unlocked_combolist_list_profile_unlocked_combolists__leak_id__list_put","security":[{"BearerAuth":[]}],"parameters":[{"name":"leak_id","in":"path","required":true,"schema":{"type":"string","pattern":"^cl1_[0-9a-f]{60}$","description":"Combolist credential ID, in the `cl1_` namespace.","title":"Leak Id"},"description":"Combolist credential ID, in the `cl1_` namespace."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombolistListUpdate"}}}},"responses":{"200":{"description":"List assignment updated.","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Set Unlocked Combolist List Profile Unlocked Combolists  Leak Id  List Put"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Unlocked combolist credential not found, or combolist search is not enabled on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/profile/unlocked/combolists/{leak_id}/comment":{"put":{"tags":["Unlocked Combolists"],"summary":"Set the comment on one unlocked combolist credential","description":"Attach or replace a free-text comment on a single unlocked combolist credential.\n\nBehavior\n- The comment replaces any previous one. Use the DELETE variant to clear it.","operationId":"set_unlocked_combolist_comment_profile_unlocked_combolists__leak_id__comment_put","security":[{"BearerAuth":[]}],"parameters":[{"name":"leak_id","in":"path","required":true,"schema":{"type":"string","pattern":"^cl1_[0-9a-f]{60}$","description":"Combolist credential ID, in the `cl1_` namespace.","title":"Leak Id"},"description":"Combolist credential ID, in the `cl1_` namespace."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombolistCommentUpdate"}}}},"responses":{"200":{"description":"Comment saved.","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Set Unlocked Combolist Comment Profile Unlocked Combolists  Leak Id  Comment Put"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Unlocked combolist credential not found, or combolist search is not enabled on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}},"delete":{"tags":["Unlocked Combolists"],"summary":"Delete the comment on one unlocked combolist credential","description":"Remove the comment attached to a single unlocked combolist credential. Idempotent: deleting an absent comment succeeds.","operationId":"delete_unlocked_combolist_comment_profile_unlocked_combolists__leak_id__comment_delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"leak_id","in":"path","required":true,"schema":{"type":"string","pattern":"^cl1_[0-9a-f]{60}$","description":"Combolist credential ID, in the `cl1_` namespace.","title":"Leak Id"},"description":"Combolist credential ID, in the `cl1_` namespace."}],"responses":{"200":{"description":"Comment removed.","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Delete Unlocked Combolist Comment Profile Unlocked Combolists  Leak Id  Comment Delete"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Unlocked combolist credential not found, or combolist search is not enabled on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/profile/unlocked/combolists/{leak_id}/status":{"put":{"tags":["Unlocked Combolists"],"summary":"Set the remediation status of one unlocked combolist credential","description":"Set the remediation status of a single unlocked combolist credential.\n\nBehavior\n- Allowed values: `new`, `in_progress`, `fixed`, `accepted_risk`.\n- Newly unlocked credentials start at `new`.","operationId":"set_unlocked_combolist_status_profile_unlocked_combolists__leak_id__status_put","security":[{"BearerAuth":[]}],"parameters":[{"name":"leak_id","in":"path","required":true,"schema":{"type":"string","pattern":"^cl1_[0-9a-f]{60}$","description":"Combolist credential ID, in the `cl1_` namespace.","title":"Leak Id"},"description":"Combolist credential ID, in the `cl1_` namespace."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombolistStatusUpdate"}}}},"responses":{"200":{"description":"Status updated.","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Set Unlocked Combolist Status Profile Unlocked Combolists  Leak Id  Status Put"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Unlocked combolist credential not found, or combolist search is not enabled on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/profile/unlocked/combolists/export":{"post":{"tags":["Unlocked Combolists"],"summary":"Export unlocked combolist credentials","description":"Export the Combolist credentials you have already unlocked, as a background job.\n\n**Scope**\n- Only your unlocked pairs, never the locked ones. To widen the set, unlock first with `POST /search/combolist/unlock/task`.\n- The body takes the same filters as `GET /profile/unlocked/combolists` (`search`, `is_email`, `list_id`, `list_none`, `status`, `unlocked_at_min`), so what you see in the list is what the file contains.\n- `unlocked_at_min` is the incremental hook: pass the timestamp of your last successful export to get only what came after. It must carry a timezone.\n- `filters` takes the advanced set of `POST /profile/unlocked/combolists/advanced`. Send it to export exactly the rows that advanced listing shows.\n\n**Separate from unlocked leaks**\nThis export never contains a stealer-log record. Its counterpart is `POST /profile/unlocked/export`.\n\n**Limits**\n- Formats: `csv`, `txt`, `json`.\n- At most 5 exports pending or in progress per account, all types combined.\n- An identical export already queued is refused rather than duplicated.\n\n**Retrieval**\nThe response carries an `export_id`. Follow it and download the file from the Exports endpoints.","operationId":"export_unlocked_combolists_profile_unlocked_combolists_export_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"$ref":"#/components/schemas/ExportFormatEnum","description":"Output format: `csv`, `txt` or `json`.","default":"csv"},"description":"Output format: `csv`, `txt` or `json`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombolistUnlockedExportRequest"}}}},"responses":{"200":{"description":"Export queued.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportResponse"}}}},"400":{"description":"Too many exports already in progress.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Combolist search is not enabled on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"409":{"description":"An identical export is already queued.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error, including `unlocked_at_min` without a timezone.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded. See Retry-After / X-RateLimit-* headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/profile/unlocked/lists":{"get":{"tags":["Unlocked Leaks Lists"],"summary":"List your Unlocked Lists","description":"Return all your Unlocked Lists in ascending creation order.\n\nParameters\n- `with_counts` when true, each list includes `items_count`, the number of unlocked leaks currently assigned to that list. When false, `items_count` is returned as 0 to avoid extra computation.\n\n**Errors**\n- 401 Authentication required, or invalid/expired API key.\n- 422 Request validation error.","operationId":"list_unlocked_lists_profile_unlocked_lists_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"with_counts","in":"query","required":false,"schema":{"type":"boolean","description":"When true, include `items_count` per list.","default":true,"title":"With Counts"},"description":"When true, include `items_count` per list."},{"name":"dataset","in":"query","required":false,"schema":{"enum":["stealer_logs","combolist"],"type":"string","description":"Dataset used to compute each list's item count.","default":"stealer_logs","title":"Dataset"},"description":"Dataset used to compute each list's item count."}],"responses":{"200":{"description":"Lists returned successfully.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UnlockedListOut"},"title":"Response List Unlocked Lists Profile Unlocked Lists Get"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Unlocked Leaks Lists"],"summary":"Create an Unlocked List","description":"Create a new list to organize your unlocked leaks.\n\nRules\n- Maximum number of lists is determined by your current plan.\n- List names must be unique per account, case-insensitive.\n\nResponse\n- Returns the created list. `items_count` is 0 at creation time.\n\n**Errors**\n- 400 No plan, or maximum number of lists reached.\n- 401 Authentication required, or invalid/expired API key.\n- 409 A list with the same name already exists.\n- 422 Request validation error.","operationId":"create_unlocked_list_profile_unlocked_lists_post","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnlockedListCreateIn","description":"JSON payload with `name` (required) and `color` (optional UI attribute)."}}}},"responses":{"200":{"description":"List created successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnlockedListOut"}}}},"400":{"description":"No plan, or maximum number of lists reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"409":{"description":"A list with the same name already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profile/unlocked/lists/{list_id}":{"patch":{"tags":["Unlocked Leaks Lists"],"summary":"Update an Unlocked List","description":"Update list metadata. Only provided fields are updated.\n\nUpdatable fields\n- `name` must be unique per account, case-insensitive.\n- `color` optional UI attribute.\n\n**Errors**\n- 401 Authentication required, or invalid/expired API key.\n- 404 List not found.\n- 409 A list with the same name already exists.\n- 422 Request validation error.","operationId":"update_unlocked_list_profile_unlocked_lists__list_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"ID of the list to update","title":"List Id"},"description":"ID of the list to update"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnlockedListUpdateIn","description":"JSON payload with optional `name` and optional `color`."}}}},"responses":{"200":{"description":"List updated successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnlockedListOut"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"List not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"409":{"description":"A list with the same name already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Unlocked Leaks Lists"],"summary":"Delete an Unlocked List","description":"Delete the list and start a background cleanup of related leak assignments.\n\nBehavior\n- The list is removed immediately.\n- Any unlocked leak that referenced this list will be cleaned up by a background task.\n- `task_id` remains the primary Stealer Logs task for backward compatibility.\n- `task_ids` contains every Stealer Logs and Combolist cleanup task; poll each at `/profile/unlocked/list-tasks/{task_id}`.\n\n**Errors**\n- 401 Authentication required, or invalid/expired API key.\n- 404 List not found.\n- 422 Request validation error.","operationId":"delete_unlocked_list_profile_unlocked_lists__list_id__delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"ID of the list to delete","title":"List Id"},"description":"ID of the list to delete"}],"responses":{"200":{"description":"List deleted; cleanup task started.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListCleanupTasksOut"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"List not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profile/unlocked/lists/{list_id}/clear":{"post":{"tags":["Unlocked Leaks Lists"],"summary":"Clear list assignment from leaks while keeping the list","description":"Remove the list assignment from all unlocked leaks that currently reference this list. The list itself is kept. The operation runs in the background. `task_id` is the backward-compatible primary task and `task_ids` contains every dataset cleanup task.","operationId":"clear_unlocked_list_profile_unlocked_lists__list_id__clear_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"ID of the list whose assignments will be cleared","title":"List Id"},"description":"ID of the list whose assignments will be cleared"}],"responses":{"200":{"description":"Clear task started.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListCleanupTasksOut"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"List not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profile/unlocked/list-tasks/{task_id}":{"get":{"tags":["Unlocked Leaks Lists"],"summary":"Get unlocked lists background task status","description":"Return the status of a background task started by unlocked lists operations.\n\nThis endpoint is only for tasks created by:\n- `POST /profile/unlocked/lists/bulk-assign` (bulk assign/unassign list)\n\nUsage\n- Use the exact `task_id` returned by one of these endpoints.\n\nImportant\n- Do **not** use this endpoint for unlock tasks created by `/search/.../unlock/task`. For unlock tasks, poll `/tasks/{task_id}` instead.","operationId":"get_task_status_profile_unlocked_list_tasks__task_id__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"description":"Task id returned by an unlocked-lists operation (delete / clear / bulk).","title":"Task Id"},"description":"Task id returned by an unlocked-lists operation (delete / clear / bulk)."}],"responses":{"200":{"description":"Task status returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskStatusOut"}}}},"400":{"description":"Invalid task_id for this endpoint (use /tasks/{task_id} for unlock tasks).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profile/unlocked/{leak_id}/list":{"put":{"tags":["Unlocked Leaks Lists"],"summary":"Assign or unassign a list for one unlocked leak","description":"Assign a specific list to a single unlocked leak, or unassign it.\n\nBehavior\n- Provide `list_id` to assign. Use `null` to remove the assignment.\n\n**Errors**\n- 401 Authentication required, or invalid/expired API key.\n- 404 Unlocked leak not found, or list not found.\n- 422 Request validation error.\n- 429 Rate limit exceeded.","operationId":"set_list_for_unlocked_profile_unlocked__leak_id__list_put","security":[{"BearerAuth":[]}],"parameters":[{"name":"leak_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"description":"Unlocked leak identifier","title":"Leak Id"},"description":"Unlocked leak identifier"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignListIn","description":"JSON payload with `list_id` to assign. Use null to unassign."}}}},"responses":{"200":{"description":"List assignment updated.","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Unlocked leak not found, or list not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/profile/unlocked/{leak_id}/comment":{"put":{"tags":["Unlocked Leaks Lists"],"summary":"Create or update a comment for one unlocked leak","description":"Create or update a user comment on a single unlocked leak. Empty or whitespace-only comments are treated as delete.\n\nLimits\n- Max 500 characters.\n\n**Errors**\n- 401 Authentication required, or invalid/expired API key.\n- 404 Unlocked leak not found.\n- 422 Comment exceeds 500 characters.","operationId":"upsert_comment_for_unlocked_profile_unlocked__leak_id__comment_put","security":[{"BearerAuth":[]}],"parameters":[{"name":"leak_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"description":"Unlocked leak identifier","title":"Leak Id"},"description":"Unlocked leak identifier"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentUpsertIn","description":"JSON payload with a single `comment` field. Empty string removes the comment."}}}},"responses":{"200":{"description":"Comment saved (or removed when empty).","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Unlocked leak not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Comment exceeds 500 characters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Unlocked Leaks Lists"],"summary":"Delete the comment of one unlocked leak","description":"Delete the user comment attached to a specific unlocked leak.\n\n**Errors**\n- 401 Authentication required, or invalid/expired API key.\n- 404 Unlocked leak not found.\n- 422 Request validation error.","operationId":"delete_comment_for_unlocked_profile_unlocked__leak_id__comment_delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"leak_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"description":"Unlocked leak identifier","title":"Leak Id"},"description":"Unlocked leak identifier"}],"responses":{"200":{"description":"Comment deleted.","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Unlocked leak not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profile/unlocked/{leak_id}/status":{"put":{"tags":["Unlocked Leaks Lists"],"summary":"Update the remediation status of one unlocked leak","description":"Set the remediation status of a single unlocked leak.\n\nValid statuses: `new`, `in_progress`, `fixed`, `accepted_risk`.\n\n**Errors**\n- 401 Authentication required, or invalid/expired API key.\n- 404 Unlocked leak not found.\n- 422 Invalid status value.\n- 429 Rate limit exceeded.","operationId":"set_status_for_unlocked_profile_unlocked__leak_id__status_put","security":[{"BearerAuth":[]}],"parameters":[{"name":"leak_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"description":"Unlocked leak identifier","title":"Leak Id"},"description":"Unlocked leak identifier"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusUpdateIn","description":"JSON payload with a single `status` field."}}}},"responses":{"200":{"description":"Status updated.","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Unlocked leak not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Invalid status value.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/profile/unlocked/bulk-status":{"post":{"tags":["Unlocked Leaks Lists"],"summary":"Bulk update the remediation status across many unlocked leaks","description":"Start a background task that updates the remediation status on all unlocked leaks matching the provided filters.\n\nValid statuses: `new`, `in_progress`, `fixed`, `accepted_risk`.\n\nFiltering\n- Supports the same filtering fields used by the advanced unlocked search API.\n- Optional helpers, applied on top of `filters` when both are sent: `search`, `is_email`, `list_id_filter`, `list_none`, `status_filter`.\n\nResponse\n- Returns a `task_id` that you can poll with `/profile/unlocked/list-tasks/{task_id}`.","operationId":"bulk_update_status_profile_unlocked_bulk_status_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkStatusUpdateIn","description":"JSON payload with `target_status` and optional filter fields to select which unlocked leaks will be updated."}}},"required":true},"responses":{"200":{"description":"Bulk status task started.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskStatusOut"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/profile/unlocked/lists/bulk-assign":{"post":{"tags":["Unlocked Leaks Lists"],"summary":"Bulk assign or unassign a list across many unlocked leaks","description":"Start a background task that assigns a target list to all unlocked leaks matching the provided filters. Use a null `target_list_id` to remove the assignment for matches.\n\nFiltering\n- Supports the same filtering fields used by the advanced unlocked search API.\n- Optional helpers, applied on top of `filters` when both are sent: `search`, `is_email`, `list_id_filter`, `list_none`, `status_filter`.\n\nValidation\n- `target_list_id` must be a positive integer when provided. Use null to unassign.\n\nResponse\n- Returns a `task_id` that you can poll with `/profile/unlocked/list-tasks/{task_id}`.","operationId":"bulk_assign_list_profile_unlocked_lists_bulk_assign_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkAssignIn","description":"JSON payload with `target_list_id` (int or null) and optional filter fields to select which unlocked leaks will be updated. Filter shape matches the advanced unlocked search API."}}},"required":true},"responses":{"200":{"description":"Bulk assign task started.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskStatusOut"}}}},"400":{"description":"Invalid target_list_id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Target list not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/profile/raw/downloads":{"get":{"tags":["Profile Downloads"],"summary":"List your raw file downloads","description":"Return a paginated list of your raw file downloads within the retention window. Team members see the account owner's downloads.","operationId":"list_raw_downloads_profile_raw_downloads_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page.","default":20,"title":"Page Size"},"description":"Items per page."}],"responses":{"200":{"description":"Downloads listed successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_DownloadLogItem_"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Page out of range.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profile/raw/unlocked-parts":{"get":{"tags":["Profile Downloads"],"summary":"List your unlocked raw files","description":"Return a paginated list of the raw file entries you have unlocked (one row per entry: file name, path, category, content preview), most recent first. Optional `q` filters by inner file name, path, source file or category. Team members see the account owner's unlocks.","operationId":"list_raw_unlocked_parts_endpoint_profile_raw_unlocked_parts_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page.","default":20,"title":"Page Size"},"description":"Items per page."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Filter by file name, path, source or category.","title":"Q"},"description":"Filter by file name, path, source or category."}],"responses":{"200":{"description":"Unlocked raw files listed successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_RawUnlockedPartItem_"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profile/raw/downloads/{download_id}/file":{"post":{"tags":["Profile Downloads"],"summary":"Download a raw file through the platform","description":"Resolve a previously unlocked raw file download and redirect (307) to a short-lived download URL for the file.","operationId":"download_raw_file_profile_raw_downloads__download_id__file_post","security":[{"BearerAuth":[]},{}],"parameters":[{"name":"download_id","in":"path","required":true,"schema":{"type":"integer","description":"ID of the download record (from GET /profile/raw/downloads).","title":"Download Id"},"description":"ID of the download record (from GET /profile/raw/downloads)."},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional one-time download token.","title":"Token"},"description":"Optional one-time download token."}],"responses":{"307":{"description":"Temporary redirect to a download URL for the raw file.","headers":{"Location":{"description":"Temporary URL for file download.","schema":{"type":"string","format":"uri"}}}},"401":{"description":"Authentication is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Account banned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Download not found or raw file unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"410":{"description":"Download expired or previous attempt failed. Unlock the file again to regenerate access.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profile/team":{"get":{"tags":["Team"],"summary":"Get team overview","description":"Returns the full team structure: owner, active members, pending invitations, plan summary, and member quota.","operationId":"get_team_overview_profile_team_get","responses":{"200":{"description":"Team overview","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamOverviewResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}},"security":[{"BearerAuth":[]}]}},"/profile/team/invitations":{"post":{"tags":["Team"],"summary":"Create a team invitation","description":"Invite a user to join your team by email. An invitation email is sent automatically. Returns 409 if the user already belongs to a team or an invitation is already pending.","operationId":"create_invitation_profile_team_invitations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamInvitationCreate"}}},"required":true},"responses":{"200":{"description":"Invitation created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamInvitationResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Unprocessable Content","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/profile/team/invitations/{invitation_id}/resend":{"post":{"tags":["Team"],"summary":"Resend a team invitation","description":"Resend the invitation email for a pending invitation. Generates a new token and extends the expiration. Rate limited to 1 resend per invitation per 60 seconds.","operationId":"resend_invitation_profile_team_invitations__invitation_id__resend_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"integer","description":"ID of the team invitation.","title":"Invitation Id"},"description":"ID of the team invitation."}],"responses":{"200":{"description":"Invitation resent","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamInvitationResponse"}}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}},"description":"Not Found"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}},"description":"Unauthorized"},"429":{"description":"Too soon — wait 60 seconds before resending this invitation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profile/team/invitations/{invitation_id}/revoke":{"post":{"tags":["Team"],"summary":"Revoke a team invitation","description":"Revoke a pending invitation. The invited user will no longer be able to accept it.","operationId":"revoke_invitation_profile_team_invitations__invitation_id__revoke_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"integer","description":"ID of the team invitation.","title":"Invitation Id"},"description":"ID of the team invitation."}],"responses":{"200":{"description":"Invitation revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamInvitationResponse"}}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}},"description":"Not Found"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}},"description":"Unauthorized"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}},"description":"Bad Request"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profile/team/members/{member_id}":{"delete":{"tags":["Team"],"summary":"Remove a team member","description":"Remove a member from the team. The member's account is detached but not deleted.","operationId":"remove_member_profile_team_members__member_id__delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","description":"ID of the team member.","title":"Member Id"},"description":"ID of the team member."}],"responses":{"200":{"description":"Member removed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamMemberResponse"}}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}},"description":"Not Found"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}},"description":"Unauthorized"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Team"],"summary":"Update a team member's role","description":"Change a team member's role to 'member' or 'admin'.","operationId":"update_member_role_profile_team_members__member_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","description":"ID of the team member.","title":"Member Id"},"description":"ID of the team member."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamMemberRoleUpdate"}}}},"responses":{"200":{"description":"Member updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamMemberResponse"}}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}},"description":"Not Found"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}},"description":"Unauthorized"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"description":"Unprocessable Content"}}}},"/profile/team/leave":{"post":{"tags":["Team"],"summary":"Leave the team","description":"Voluntarily leave the team you are a member of. Team owners cannot use this endpoint.","operationId":"leave_team_profile_team_leave_post","responses":{"200":{"description":"Successfully left the team","content":{"application/json":{"schema":{}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}},"security":[{"BearerAuth":[]}]}},"/profile/activities/balance-logs":{"get":{"tags":["Profile"],"summary":"List balance history for the current account","description":"Return a paginated list of balance log entries (points and GB changes) for the authenticated user's account.\n\nTeam members see the owner's aggregated logs.","operationId":"list_balance_logs_profile_activities_balance_logs_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page.","default":20,"title":"Page Size"},"description":"Items per page."},{"name":"order_by","in":"query","required":false,"schema":{"type":"string","description":"Field to sort by.","default":"created_at","title":"Order By"},"description":"Field to sort by."},{"name":"order_dir","in":"query","required":false,"schema":{"type":"string","description":"Sort direction: asc or desc.","default":"desc","title":"Order Dir"},"description":"Sort direction: asc or desc."}],"responses":{"200":{"description":"Balance logs returned successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_BalanceLogItem_"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Page out of range.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profile/activities/tasks":{"get":{"tags":["Profile"],"summary":"List task history for the current account","description":"Return a paginated list of background tasks (exports, bulk unlocks, etc.) for the authenticated user's account.\n\nTeam members see the owner's aggregated tasks.","operationId":"list_tasks_profile_activities_tasks_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page.","default":20,"title":"Page Size"},"description":"Items per page."},{"name":"order_by","in":"query","required":false,"schema":{"type":"string","description":"Field to sort by.","default":"id","title":"Order By"},"description":"Field to sort by."},{"name":"order_dir","in":"query","required":false,"schema":{"type":"string","description":"Sort direction: asc or desc.","default":"desc","title":"Order Dir"},"description":"Sort direction: asc or desc."}],"responses":{"200":{"description":"Tasks returned successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_UserTaskItem_"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Page out of range.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profile/preferences":{"get":{"tags":["Profile"],"summary":"Get user preferences","description":"Return the authenticated user's preferences. Defaults are used when no preferences have been saved yet.","operationId":"get_preferences_profile_preferences_get","responses":{"200":{"description":"Preferences returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPreferencesRead"}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}},"security":[{"BearerAuth":[]}]},"patch":{"tags":["Profile"],"summary":"Update user preferences","description":"Partial update of the authenticated user's preferences. Only fields provided in the body are modified.","operationId":"update_preferences_profile_preferences_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPreferencesUpdate"}}},"required":true},"responses":{"200":{"description":"Preferences updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPreferencesRead"}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/profile/usage":{"get":{"tags":["Profile"],"summary":"Get plan limits and current usage","description":"Return every plan limit alongside its current consumption for the authenticated account.\n\nScope\n- All counters are account-owner scoped: a team member sees the owner's consumption, since quotas are shared across the team.\n\nSemantics\n- `limit: null` means unlimited.\n- `used: null` means the counter is momentarily unreadable (never 0 by default, so the UI can tell 'unknown' from 'nothing consumed').\n- `caps_enforced: false` means the caps of your plan are not being applied.\n- `legacy_caps: true` means the daily request cap is not enforced on this account (concurrency caps still are).\n\nThis endpoint never mutates a counter: reading it does not consume quota.","operationId":"get_plan_usage_profile_usage_get","responses":{"200":{"description":"Usage returned successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanUsageResponse"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}},"security":[{"BearerAuth":[]}]}},"/stats":{"get":{"tags":["Stats"],"summary":"Get statistics","description":"Return the cached service statistics snapshot. If stats are not available in cache, the endpoint returns `{ \"message\": \"Stats not available\" }`.","operationId":"get_statistics_stats_get","responses":{"200":{"description":"Statistics returned successfully.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/StatsResponse"},{"$ref":"#/components/schemas/StatsUnavailableResponse"}],"title":"Response Get Statistics Stats Get"}}}}},"security":[]}},"/live-stats":{"get":{"tags":["Stats"],"summary":"Get live landing stats","description":"Lightweight live snapshot used by the public landing page (raw lines total, today, ingestion rate, active sources, dark web posts). Refreshed every ~2 min. Public endpoint (no authentication). Returns `{ \"message\": \"Live stats not available\" }` when the cache is empty.","operationId":"get_live_statistics_live_stats_get","responses":{"200":{"description":"Live stats returned successfully.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/LiveStatsResponse"},{"$ref":"#/components/schemas/StatsUnavailableResponse"}],"title":"Response Get Live Statistics Live Stats Get"}}}}},"security":[]}},"/transparency-stats":{"get":{"tags":["Stats"],"summary":"Get transparency report figures","description":"Figures published on the public transparency page: active exclusion rules by field, suspended accounts, removal requests for the last closed quarter, legal demands received from authorities, and data quality counters. Refreshed every 6 hours. Public endpoint (no authentication). Returns `{ \"message\": \"Stats not available\" }` when the cache is empty.","operationId":"get_transparency_statistics_transparency_stats_get","responses":{"200":{"description":"Transparency figures returned successfully.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TransparencyStatsResponse"},{"$ref":"#/components/schemas/StatsUnavailableResponse"}],"title":"Response Get Transparency Statistics Transparency Stats Get"}}}}},"security":[]}},"/unlock":{"post":{"tags":["Unlock"],"summary":"Unlock selected leaks by ID","description":"Unlock leaks by their IDs for the authenticated account if they have enough points.\n\n**Request body**\n- `leak_ids` array of leak IDs to unlock (max 10,000). Duplicates are ignored while preserving order.\n\n**Behavior**\n- Requires an active paid subscription.\n- 1 point per leak. Points are charged up front and partially refunded if some items were already unlocked during processing.\n- Only found leaks are processed. If none are found, the request fails.\n- The response reflects the final unlocked state from the account-level index.\n\n**Visibility**\n- `id` is included only for paid users.\n- Credentials are included only for items with `unlocked=true`.\n\n**Errors**\n- 400 No leak IDs provided, too many leak IDs, insufficient points, or all selected data already unlocked.\n- 401 Unauthorized.\n- 403 Forbidden: subscription does not allow unlocking.\n- 404 The provided target_list_id does not exist.\n- 410 The selected data is no longer available (refresh your search).\n- 422 Validation error.\n- 500 Billing or indexation error while unlocking.","operationId":"unlock_data_unlock_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnlockRequest"}}},"required":true},"responses":{"200":{"description":"Selected leaks successfully unlocked.","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/LeakDetails"},"type":"array","title":"Response Unlock Data Unlock Post"}}}},"400":{"description":"No leak IDs provided, too many leak IDs, insufficient points, or all selected data already unlocked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Unauthorized.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Forbidden. The user's subscription does not allow unlocking data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"The provided target_list_id does not exist or is not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"410":{"description":"The selected data is no longer available (removed during cleanup). Refresh your search results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Billing or indexation error while unlocking.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}},"security":[{"BearerAuth":[]}]}},"/exports":{"get":{"tags":["Exports"],"summary":"List export jobs","description":"Return the current account's export jobs ordered by most recent first. Supports pagination.\n\n**Pagination**\n- `page` starts at 1.\n- `page_size` default and maximum are defined by server settings (default 20, max 100 if not configured).\n\n**Response**\n`PaginatedResponse[ExportBase]` with `items`, `total`, `page`, `page_size`.\n\n**Errors**\n- 401 Authentication required, or invalid/expired API key.\n- 404 Page out of range.\n- 422 Request validation error.\n- 429 Rate limit exceeded.","operationId":"get_exports_exports_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number starting at 1","default":1,"title":"Page"},"description":"Page number starting at 1"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of items per page","default":20,"title":"Page Size"},"description":"Number of items per page"}],"responses":{"200":{"description":"Exports retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_ExportBase_"}}}},"401":{"description":"Unauthorized. The user is not authenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Page out of range.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error: invalid request parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"description":"Too many requests: rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/notification_methods":{"get":{"tags":["Notifications"],"summary":"List notification methods","description":"Return all notification methods configured for the current account.\n\nMethod types\n- `email`\n- `slack` (Incoming Webhook URL)\n- `telegram` (`value` = bot token, `second_value` = chat_id)\n- `webhook` (generic HTTP webhook)\n- `discord` (Discord Webhook URL)\n\nResponse\nArray of objects with `id`, `type`, `value`, `second_value`, `timestamp`.","operationId":"list_notification_methods_notification_methods_get","responses":{"200":{"description":"Notification methods listed successfully.","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NotificationMethodOut"},"type":"array","title":"Response List Notification Methods Notification Methods Get"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["Notifications"],"summary":"Create notification method","description":"Create a new notification method for the current account.\n\nBody fields\n- `type` one of: `email`, `slack`, `telegram`, `webhook`, `discord`.\n- `value` string. For Slack/Discord use the webhook URL. For Telegram use the bot token.\n- `second_value` optional. Required for Telegram (`chat_id`).\n\nResponse\nObject with `id`, `type`, `value`, `second_value`, `timestamp`.","operationId":"create_notification_method_notification_methods_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationMethodCreateRequest"}}},"required":true},"responses":{"200":{"description":"Method created successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationMethodOut"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Feature not available on your plan (free tier restricts non-email channels and extra recipients).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/notification_methods/{method_id}":{"patch":{"tags":["Notifications"],"summary":"Update notification method","description":"Update an existing notification method owned by the current account.\n\n**Errors**\n- 401 Authentication required.\n- 404 Notification method not found.\n- 422 Request validation error.","operationId":"update_notification_method_notification_methods__method_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"method_id","in":"path","required":true,"schema":{"type":"integer","description":"ID of the notification method.","title":"Method Id"},"description":"ID of the notification method."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationMethodCreateRequest"}}}},"responses":{"200":{"description":"Method updated successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationMethodOut"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Notification method not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Notifications"],"summary":"Delete notification method","description":"Delete a notification method owned by the current account.\n\n**Errors**\n- 401 Authentication required.\n- 404 Notification method not found.\n- 409 Method is still used by active notifications.\n- 422 Request validation error.","operationId":"delete_notification_method_notification_methods__method_id__delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"method_id","in":"path","required":true,"schema":{"type":"integer","description":"ID of the notification method.","title":"Method Id"},"description":"ID of the notification method."}],"responses":{"200":{"description":"Method deleted successfully.","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Notification method not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"409":{"description":"Method is still used by active notifications.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications":{"get":{"tags":["Notifications"],"summary":"List notifications","description":"Return all notifications configured for the current account, including linked method info.\n\nResponse\nArray of objects with fields like `id`, `method_id`, `type`, `second_type`, `value`, `filters`, `is_active`, `timestamp`, `method_type`, `method_value`, `auto_unlock`, `max_points`, `daily_spent`, `daily_reset_at`, `total_notifications`, `total_cost`.","operationId":"list_notifications_notifications_get","responses":{"200":{"description":"Notifications listed successfully.","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NotificationOut"},"type":"array","title":"Response List Notifications Notifications Get"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}},"security":[{"BearerAuth":[]}]},"post":{"tags":["Notifications"],"summary":"Create notification","description":"Create a new notification bound to an existing notification method.\n\nSupported types\n- `email` requires `value` (email). `second_type` is not allowed.\n- `domain` requires `value` (domain). `second_type` optional: one of domain leak types, default `ALL`.\n- `advanced` requires `filters` (no `value`). Bulk is not allowed.\n\nBulk creation\n- For `email` and `domain`, set `bulk=true` and provide newline-separated values in `value` to create several notifications at once.\n\nLimit\n- Max notifications = plan limit + extra monitoring assets purchased.","operationId":"create_notification_notifications_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationCreateRequest"}}},"required":true},"responses":{"200":{"description":"Notification created successfully.","content":{"application/json":{"schema":{"anyOf":[{"items":{"$ref":"#/components/schemas/NotificationOut"},"type":"array"},{"$ref":"#/components/schemas/NotificationOut"}],"title":"Response Create Notification Notifications Post"}}}},"400":{"description":"Invalid parameters (missing value, invalid type, etc.).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Feature or channel not allowed on your plan (free-tier restrictions or per-type plan gates), or monitoring limit reached (buy assets / upgrade).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Referenced notification method not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"409":{"description":"Duplicate notification already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/notifications/{notification_id}":{"patch":{"tags":["Notifications"],"summary":"Update notification","description":"Update an existing notification owned by the current account. All type-specific rules from creation apply.","operationId":"update_notification_notifications__notification_id__patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"integer","description":"ID of the notification.","title":"Notification Id"},"description":"ID of the notification."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationCreateRequest"}}}},"responses":{"200":{"description":"Notification updated successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationOut"}}}},"400":{"description":"Invalid parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"Feature not included in your plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Notification not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Notifications"],"summary":"Delete notification","description":"Delete a single notification owned by the current account.","operationId":"delete_notification_notifications__notification_id__delete","security":[{"BearerAuth":[]}],"parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"integer","description":"ID of the notification.","title":"Notification Id"},"description":"ID of the notification."}],"responses":{"200":{"description":"Notification deleted successfully.","content":{"application/json":{"schema":{}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Notification not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications/bulk":{"delete":{"tags":["Notifications"],"summary":"Delete multiple notifications","description":"Delete multiple notifications owned by the current account.\n\nBody\n- `ids` array of notification IDs to delete.","operationId":"delete_notifications_notifications_bulk_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationsDeleteRequest"}}},"required":true},"responses":{"200":{"description":"Notifications deleted successfully.","content":{"application/json":{"schema":{}}}},"400":{"description":"No notification IDs provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/notifications/{notification_id}/active":{"patch":{"tags":["Notifications"],"summary":"Set notification active","description":"Enable or disable a notification by ID.","operationId":"set_notification_active_notifications__notification_id__active_patch","security":[{"BearerAuth":[]}],"parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"integer","description":"ID of the notification.","title":"Notification Id"},"description":"ID of the notification."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationStatusUpdateRequest"}}}},"responses":{"200":{"description":"Status updated successfully.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Notification Active Notifications  Notification Id  Active Patch"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Notification not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notification_methods/test":{"post":{"tags":["Notifications"],"summary":"Test notification method","description":"Validate that the provided parameters allow sending a test notification.\n\nEmail: `value`=recipient email address. Slack: Incoming Webhook URL. Telegram: `value`=bot token, `second_value`=chat_id. Discord: Webhook URL. Webhook: sends a JSON payload to the provided URL.","operationId":"test_notification_method_notification_methods_test_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationMethodCreateRequest"}}},"required":true},"responses":{"200":{"description":"Test notification sent successfully.","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid parameters or delivery failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded (30 tests per hour).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"500":{"description":"Internal error while sending the test notification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"BearerAuth":[]}]}},"/notification_methods/{method_id}/test-with-data":{"post":{"tags":["Notifications"],"summary":"Test notification method with fake data","description":"Send a test notification with realistic fake data.\n\nSupports all notification types via the `type` query parameter:\n- `leak` (default): Test with fake credential leaks\n- `raw`: Test with fake raw search results\n- `dark_web`: Test with fake dark web posts\n\nRate limit: 30 tests per hour.\n\nSupported for all method types: email, slack, telegram, webhook, discord.","operationId":"test_notification_method_with_data_notification_methods__method_id__test_with_data_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"method_id","in":"path","required":true,"schema":{"type":"integer","description":"ID of the notification method.","title":"Method Id"},"description":"ID of the notification method."},{"name":"notification_type","in":"query","required":false,"schema":{"type":"string","pattern":"^(leak|raw|dark_web)$","description":"Fake data type: leak (default), raw, or dark_web.","default":"leak","title":"Notification Type"},"description":"Fake data type: leak (default), raw, or dark_web."}],"responses":{"200":{"description":"Test notification sent successfully.","content":{"application/json":{"schema":{}}}},"400":{"description":"Delivery failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Notification method not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"429":{"description":"Rate limit exceeded (30 tests per hour).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"500":{"description":"Internal error while sending the test notification.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications/stats":{"get":{"tags":["Notifications"],"summary":"Get notification stats","description":"Return monitored assets usage and limits (plan + extra assets) at account level.","operationId":"notification_stats_notifications_stats_get","responses":{"200":{"description":"Stats returned successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationStatsResponse"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}},"security":[{"BearerAuth":[]}]}},"/notification_runs":{"get":{"tags":["Notifications Runs"],"summary":"List notification runs","description":"Return paginated notification runs for the current user ordered by most recent first.\n\n**Pagination**\n- `page` starts at 1.\n- `page_size` is 1 to 1000 (default 20).\n\n**Response**\n`PaginatedResponse[NotificationRunBase]` with `items`, `total`, `page`, `page_size`.","operationId":"list_notification_runs_notification_runs_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page (1–1000, default 20).","default":20,"title":"Page Size"},"description":"Items per page (1–1000, default 20)."}],"responses":{"200":{"description":"Notification runs listed successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse_NotificationRunBase_"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notification_runs/{run_id}/status":{"put":{"tags":["Notifications Runs"],"summary":"Update the status of a notification run","description":"Set the triage status of a notification run. Valid values: `new`, `in_progress`, `fixed`, `accepted_risk`. The status is propagated to all unlocked leaks in the run.","operationId":"set_notification_run_status_notification_runs__run_id__status_put","security":[{"BearerAuth":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"ID of the notification run.","title":"Run Id"},"description":"ID of the notification run."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationRunStatusUpdateIn"}}}},"responses":{"200":{"description":"Run status updated successfully.","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid status value.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required, or invalid/expired API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Run not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Invalid path parameter or request body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notification_runs/{run_id}/items":{"get":{"tags":["Notifications Runs"],"summary":"List items for a notification run (unified endpoint)","description":"Return items associated with a specific notification run. Supports all notification types:\n\n- **Credential leaks** (EMAIL, DOMAIN, ADVANCED): Fetches leak details from ES\n- **RAW**: Returns file metadata stored in DB\n- **DARK_WEB**: Fetches post details from ES\n\n**Pagination**\n- `page` starts at 1.\n- `page_size` is 1 to 1000 (default 100).\n\n**Response**\n`PaginatedRunItemsResponse` with `items`, `total`, `total_unlocked`, `page`, `page_size`, `item_type`.\n\n**Errors**\n- 401 Authentication required, or invalid/expired API key.\n- 404 Run not found.\n- 422 Request validation error.","operationId":"notification_run_items_notification_runs__run_id__items_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","description":"ID of the notification run.","title":"Run Id"},"description":"ID of the notification run."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (starts at 1).","default":1,"title":"Page"},"description":"Page number (starts at 1)."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page (1–1000, default 100).","default":100,"title":"Page Size"},"description":"Items per page (1–1000, default 100)."}],"responses":{"200":{"description":"Items returned successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedRunItemsResponse"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Run not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notification_runs/{run_id}/leaks/unlock":{"post":{"tags":["Notifications Runs"],"summary":"Unlock leaks from a notification run","description":"Unlock leaks that belong to a specific notification run. You can optionally filter by `search` and `is_email`, and cap the number of new unlocks with `max`. The effective limit is capped by your available points.\n\n**Behavior**\n- Only items not previously unlocked in this run are attempted.\n- Points are charged only for newly unlocked items.\n- The response contains the final unlocked state for the requested IDs.\n\n**Errors**\n- 400 No leaks for this run, all data already unlocked, or no data matches the search.\n- 401 Authentication required, or invalid/expired API key.\n- 403 The target monitored by this run is blocked.\n- 404 Run not found.\n- 422 Request validation error.","operationId":"unlock_notification_run_leaks_notification_runs__run_id__leaks_unlock_post","security":[{"BearerAuth":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","description":"ID of the notification run.","title":"Run Id"},"description":"ID of the notification run."},{"name":"max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Max items to unlock (capped by your available points).","title":"Max"},"description":"Max items to unlock (capped by your available points)."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional free-text filter on URL or username.","title":"Search"},"description":"Optional free-text filter on URL or username."},{"name":"is_email","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by identifier type: true=emails, false=usernames, null=both.","title":"Is Email"},"description":"Filter by identifier type: true=emails, false=usernames, null=both."},{"name":"list_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Optional unlocked-list ID assigned to newly unlocked items.","title":"List Id"},"description":"Optional unlocked-list ID assigned to newly unlocked items."}],"responses":{"200":{"description":"Leaks unlocked successfully.","content":{"application/json":{"schema":{"type":"array","items":{"anyOf":[{"$ref":"#/components/schemas/LeakDetails"},{"$ref":"#/components/schemas/CombolistUnlockResult"}]},"title":"Response Unlock Notification Run Leaks Notification Runs  Run Id  Leaks Unlock Post"}}}},"400":{"description":"No leaks, all already unlocked, or no data matches filter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"403":{"description":"The target monitored by this run is blocked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Run not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notification_runs/{run_id}/export":{"get":{"tags":["Notifications Runs"],"summary":"Export leaks from a notification run to CSV/TXT/JSON","description":"Queue an export of leaks associated with a specific notification run. Optional `search` and `is_email` filters apply. The job runs asynchronously and the file will appear in the Exports section when ready.\n\n**Limits**\n- You can have at most 5 exports with status PENDING or IN_PROGRESS.\n\n**Query parameters**\n- `format` optional output format: `csv` (default), `txt`, or `json`.\n\n**Response**\n`ExportResponse` with `status`, `message`, and `export_id`.\n\n**Errors**\n- 400 Too many exports in progress.\n- 401 Authentication required, or invalid/expired API key.\n- 404 Run not found.\n- 422 Request validation error.","operationId":"export_notification_run_notification_runs__run_id__export_get","security":[{"BearerAuth":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","description":"ID of the notification run.","title":"Run Id"},"description":"ID of the notification run."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional free-text filter on URL or username.","title":"Search"},"description":"Optional free-text filter on URL or username."},{"name":"is_email","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by identifier type: true=emails, false=usernames, null=both.","title":"Is Email"},"description":"Filter by identifier type: true=emails, false=usernames, null=both."},{"name":"format","in":"query","required":false,"schema":{"$ref":"#/components/schemas/ExportFormatEnum","description":"Output format: csv (default), txt, or json.","default":"csv"},"description":"Output format: csv (default), txt, or json."}],"responses":{"200":{"description":"Export queued successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportResponse"}}}},"400":{"description":"Too many exports in progress.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Run not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tasks/{task_id}":{"get":{"tags":["Tasks"],"summary":"Get background task status","description":"Return the live status for a background task started by list operations Use the `task_id` returned by the create endpoint.\n\n**Usage**\nPoll this endpoint every 1s until `completed=true`. If the task is unknown or expired, the service returns `completed=true` with no totals, which can be treated as finished.","operationId":"get_task_status_tasks__task_id__get","security":[{"BearerAuth":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","description":"Background task id returned by the create endpoint.","title":"Task Id"},"description":"Background task id returned by the create endpoint."}],"responses":{"200":{"description":"Task status returned successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskStatusOut"}}}},"400":{"description":"Invalid task_id format.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"401":{"description":"Authentication required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"404":{"description":"Task not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AdvancedTextMatchType":{"type":"string","enum":["contains","starts_with","ends_with"],"title":"AdvancedTextMatchType"},"AllLeakDetails":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Unique leak identifier. Only returned when the item is unlocked or the plan includes full access."},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Source URL where the credentials were found. Redacted for locked items on non-advanced plans."},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username","description":"Leaked username or email address. Masked when locked."},"username_masked":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username Masked","description":"Partially masked version of the username (e.g. j***@example.com)."},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password","description":"Leaked password. Only returned when the item is unlocked."},"password_strength":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Password Strength","description":"Password strength raw score (integer, 0+). Categories: too_weak (0-2), weak (3-4), medium (5-7), strong (8+).","default":0},"unlocked":{"type":"boolean","title":"Unlocked","description":"Whether this item has been unlocked by the current account.","default":false},"is_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Email","description":"True if the username is an email address, false if it is a plain username."},"added_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Added At","description":"Date when this leak was added to the database."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Remediation status of the unlocked leak: new, in_progress, fixed, accepted_risk. Only present for unlocked items."},"category":{"type":"string","title":"Category","description":"Leak category: 'employees', 'customers', or 'third_parties'."}},"type":"object","required":["category"],"title":"AllLeakDetails","example":{"added_at":"2025-01-15T10:30:00Z","category":"employees","id":"3f1a9c2b7e","is_email":true,"password":"P@ssw0rd123","password_strength":6,"status":"new","unlocked":true,"url":"https://example.com/login","username":"john.doe@example.com"}},"AssignListIn":{"properties":{"list_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"List Id","description":"null to remove list"}},"type":"object","title":"AssignListIn","example":{"list_id":42}},"BalanceLogItem":{"properties":{"id":{"type":"integer","title":"Id","description":"Balance log entry ID."},"user_id":{"type":"integer","title":"User Id","description":"User ID."},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email","description":"User email address."},"kind":{"type":"string","title":"Kind","description":"Type of balance change (e.g. unlock, topup, subscription)."},"delta_total":{"type":"integer","title":"Delta Total","description":"Total points change (positive = credit, negative = debit)."},"delta_subscription":{"type":"integer","title":"Delta Subscription","description":"Subscription points portion of the change."},"delta_extra":{"type":"integer","title":"Delta Extra","description":"Extra points portion of the change."},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Human-readable reason for the balance change."},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Additional metadata about the operation."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Date of the balance change."}},"type":"object","required":["id","user_id","kind","delta_total","delta_subscription","delta_extra","created_at"],"title":"BalanceLogItem"},"BulkAssignIn":{"properties":{"target_list_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Target List Id"},"dataset":{"type":"string","enum":["stealer_logs","combolist"],"title":"Dataset","default":"stealer_logs"},"search":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"},"is_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Email"},"list_id_filter":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"List Id Filter"},"list_none":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"List None"},"status_filter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Filter"},"filters":{"anyOf":[{"$ref":"#/components/schemas/LeakSearchFilters"},{"type":"null"}]}},"type":"object","required":["target_list_id"],"title":"BulkAssignIn","example":{"is_email":true,"target_list_id":42}},"BulkStatusUpdateIn":{"properties":{"target_status":{"type":"string","title":"Target Status","description":"Target status: new, in_progress, fixed, accepted_risk"},"dataset":{"type":"string","enum":["stealer_logs","combolist"],"title":"Dataset","default":"stealer_logs"},"search":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"},"is_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Email"},"list_id_filter":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"List Id Filter"},"list_none":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"List None"},"status_filter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Filter"},"filters":{"anyOf":[{"$ref":"#/components/schemas/LeakSearchFilters"},{"type":"null"}]}},"type":"object","required":["target_status"],"title":"BulkStatusUpdateIn","example":{"is_email":true,"target_status":"fixed"}},"CategoryInfo":{"properties":{"has_locked":{"type":"boolean","title":"Has Locked"},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count"},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total"},"unlocked":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Unlocked"}},"type":"object","required":["has_locked"],"title":"CategoryInfo"},"CombolistAdvancedSearchRequest":{"properties":{"username":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Username"},"username_not":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Username Not"},"username_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}]},"username_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}]},"password":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Password"},"password_not":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Password Not"},"password_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}]},"password_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}]},"email_domain":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Email Domain"},"email_domain_not":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Email Domain Not"},"email_domain_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}]},"email_domain_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}]},"username_hash":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Username Hash"},"password_hash":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Password Hash"},"is_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Email"},"password_strength":{"anyOf":[{"$ref":"#/components/schemas/PasswordStrengthCategory-Input"},{"type":"null"}]},"added_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Added From"},"added_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Added To"},"force_and":{"type":"boolean","title":"Force And","default":false}},"additionalProperties":false,"type":"object","title":"CombolistAdvancedSearchRequest","description":"Strict subset of filters that exists in the combolist_v1 mapping."},"CombolistCommentUpdate":{"properties":{"comment":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Comment"}},"type":"object","title":"CombolistCommentUpdate"},"CombolistCredentialDetails":{"properties":{"id":{"anyOf":[{"type":"string","pattern":"^cl1_[0-9a-f]{60}$"},{"type":"null"}],"title":"Id","description":"Immutable combolist credential identifier. Hidden when the plan does not grant access to the selected search surface."},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username","description":"Email address or username. Present only for unlocked rows."},"username_masked":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username Masked","description":"Masked identifier shown while the credential is locked."},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password","description":"Exact password. Present only for unlocked rows."},"password_strength":{"type":"integer","minimum":0.0,"title":"Password Strength","description":"Raw password-strength score.","default":0},"is_email":{"type":"boolean","title":"Is Email","description":"True for an email, false for a username."},"email_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Domain","description":"Normalized domain, present only for email credentials."},"added_at":{"type":"string","format":"date-time","title":"Added At","description":"Date of the earliest accepted RawFile occurrence."},"unlocked":{"type":"boolean","title":"Unlocked","description":"Whether the row is unlocked.","default":false},"status":{"anyOf":[{"type":"string","enum":["new","in_progress","fixed","accepted_risk"]},{"type":"null"}],"title":"Status","description":"Remediation status, present only for unlocked rows."},"dataset":{"type":"string","const":"combolist","title":"Dataset","description":"Fixed provenance guard for this dedicated API.","default":"combolist"}},"type":"object","required":["is_email","added_at"],"title":"CombolistCredentialDetails","description":"One credential returned by the dedicated combolist search surface.","example":{"added_at":"2026-01-15T10:30:00Z","dataset":"combolist","email_domain":"example.com","id":"cl1_9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c","is_email":true,"password":"P@ssw0rd123","password_strength":6,"status":"new","unlocked":true,"username":"john.doe@example.com"}},"CombolistDomainReportResponse":{"properties":{"domain":{"type":"string","title":"Domain"},"total_credentials":{"type":"integer","minimum":0.0,"title":"Total Credentials"},"unique_emails":{"type":"integer","minimum":0.0,"title":"Unique Emails","description":"Distinct email identifiers, approximate on large domains."},"password_strength":{"$ref":"#/components/schemas/CombolistPasswordStrengthReport"},"first_seen":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Seen","description":"Earliest date a pair for this domain entered the index."},"last_seen":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen","description":"Most recent date a pair for this domain entered the index."},"dataset":{"type":"string","const":"combolist","title":"Dataset","default":"combolist"}},"type":"object","required":["domain","total_credentials","unique_emails","password_strength"],"title":"CombolistDomainReportResponse","example":{"dataset":"combolist","domain":"example.com","first_seen":"2024-03-02T08:11:00Z","last_seen":"2026-01-15T10:30:00Z","password_strength":{"medium":298,"strong":73,"too_weak":402,"weak":511},"total_credentials":1284,"unique_emails":973}},"CombolistEmailSearchRequest":{"properties":{"email":{"type":"string","maxLength":254,"title":"Email","description":"Exact email address to search.","strip_whitespace":true},"search":{"anyOf":[{"type":"string","maxLength":100,"strip_whitespace":true},{"type":"null"}],"title":"Search","description":"Optional substring in the identifier or password."}},"additionalProperties":false,"type":"object","required":["email"],"title":"CombolistEmailSearchRequest"},"CombolistListUpdate":{"properties":{"list_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"List Id"}},"type":"object","title":"CombolistListUpdate"},"CombolistPasswordStrengthReport":{"properties":{"too_weak":{"type":"integer","minimum":0.0,"title":"Too Weak"},"weak":{"type":"integer","minimum":0.0,"title":"Weak"},"medium":{"type":"integer","minimum":0.0,"title":"Medium"},"strong":{"type":"integer","minimum":0.0,"title":"Strong"}},"type":"object","required":["too_weak","weak","medium","strong"],"title":"CombolistPasswordStrengthReport"},"CombolistScopedRequest":{"properties":{"scope":{"type":"string","enum":["email","username","domain","advanced"],"title":"Scope","description":"Which search the job replays: `email`, `username` and `domain` take `value`, `advanced` takes `filters`."},"value":{"anyOf":[{"type":"string","maxLength":320},{"type":"null"}],"title":"Value","description":"Exact email, username or root email domain, per `scope`."},"search":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Search","description":"Optional filter on username or password, applied on top of `value`. Not allowed on the advanced scope."},"filters":{"anyOf":[{"$ref":"#/components/schemas/CombolistAdvancedSearchRequest"},{"type":"null"}],"description":"Advanced filter set. Required by, and reserved to, the advanced scope."}},"additionalProperties":false,"type":"object","required":["scope"],"title":"CombolistScopedRequest","description":"Stable search contract persisted by Combo unlock/export jobs.","examples":[{"scope":"domain","value":"example.com"},{"scope":"email","value":"john.doe@example.com"},{"filters":{"added_from":"2026-01-01","email_domain":["example.com"],"password_strength":"weak"},"scope":"advanced"}]},"CombolistSearchResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CombolistCredentialDetails"},"type":"array","title":"Items"},"total":{"type":"integer","minimum":0.0,"title":"Total","description":"Total pairs matching the query."},"total_unlocked":{"type":"integer","minimum":0.0,"title":"Total Unlocked","description":"How many of them you have already unlocked."},"page":{"type":"integer","minimum":1.0,"title":"Page"},"page_size":{"type":"integer","minimum":1.0,"title":"Page Size"},"blacklisted_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blacklisted Value","description":"Set instead of any result when the query matches one of your blacklist rules."},"auto_unlock_points_consumed":{"type":"integer","minimum":0.0,"title":"Auto Unlock Points Consumed","description":"Points consumed by Combo auto-unlock on this request.","default":0}},"type":"object","required":["items","total","total_unlocked","page","page_size"],"title":"CombolistSearchResponse","example":{"auto_unlock_points_consumed":0,"items":[{"added_at":"2026-01-15T10:30:00Z","dataset":"combolist","email_domain":"example.com","id":"cl1_9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c","is_email":true,"password":"P@ssw0rd123","password_strength":6,"status":"new","unlocked":true,"username":"john.doe@example.com"}],"page":1,"page_size":100,"total":128,"total_unlocked":1}},"CombolistStatusUpdate":{"properties":{"status":{"type":"string","enum":["new","in_progress","fixed","accepted_risk"],"title":"Status"}},"type":"object","required":["status"],"title":"CombolistStatusUpdate"},"CombolistUnlockResult":{"properties":{"id":{"type":"string","pattern":"^cl1_[0-9a-f]{60}$","title":"Id"},"username":{"type":"string","title":"Username"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"password_strength":{"type":"integer","minimum":0.0,"title":"Password Strength","default":0},"is_email":{"type":"boolean","title":"Is Email"},"email_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Domain"},"added_at":{"type":"string","format":"date-time","title":"Added At"},"status":{"type":"string","enum":["new","in_progress","fixed","accepted_risk"],"title":"Status","default":"new"},"dataset":{"type":"string","const":"combolist","title":"Dataset","default":"combolist"},"unlocked":{"type":"boolean","const":true,"title":"Unlocked","default":true}},"type":"object","required":["id","username","is_email","added_at"],"title":"CombolistUnlockResult","example":{"added_at":"2026-01-15T10:30:00Z","dataset":"combolist","email_domain":"example.com","id":"cl1_9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c9f2c","is_email":true,"password":"P@ssw0rd123","password_strength":6,"status":"new","unlocked":true,"username":"john.doe@example.com"}},"CombolistUnlockedAdvancedRequest":{"properties":{"search":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Search"},"is_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Email"},"list_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"List Id"},"list_none":{"type":"boolean","title":"List None","default":false},"status":{"anyOf":[{"type":"string","enum":["new","in_progress","fixed","accepted_risk"]},{"type":"null"}],"title":"Status"},"unlocked_at_min":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Unlocked At Min"},"filters":{"anyOf":[{"$ref":"#/components/schemas/CombolistAdvancedSearchRequest"},{"type":"null"}]}},"additionalProperties":false,"type":"object","title":"CombolistUnlockedAdvancedRequest","description":"Advanced listing over your unlocked combolist credentials.\n\nSame fields as the export request minus the output format, so the listing\nand the export of a given advanced view select rigorously the same rows.\n`filters` stays optional: the front toggles into advanced mode before the\nuser has filled anything, and an empty set must behave like the global\nlisting rather than error."},"CombolistUnlockedDetails":{"properties":{"id":{"type":"string","pattern":"^cl1_[0-9a-f]{60}$","title":"Id"},"username":{"type":"string","title":"Username"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"password_strength":{"type":"integer","minimum":0.0,"title":"Password Strength","default":0},"is_email":{"type":"boolean","title":"Is Email"},"email_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Domain"},"added_at":{"type":"string","format":"date-time","title":"Added At"},"unlocked_at":{"type":"string","format":"date-time","title":"Unlocked At"},"auto_unlocked":{"type":"boolean","title":"Auto Unlocked","default":false},"auto_unlocked_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Unlocked By"},"list_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"List Id"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"status":{"type":"string","enum":["new","in_progress","fixed","accepted_risk"],"title":"Status","default":"new"},"dataset":{"type":"string","const":"combolist","title":"Dataset","default":"combolist"},"unlocked":{"type":"boolean","const":true,"title":"Unlocked","default":true}},"type":"object","required":["id","username","is_email","added_at","unlocked_at"],"title":"CombolistUnlockedDetails"},"CombolistUnlockedExportRequest":{"properties":{"search":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Search"},"is_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Email"},"list_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"List Id"},"list_none":{"type":"boolean","title":"List None","default":false},"status":{"anyOf":[{"type":"string","enum":["new","in_progress","fixed","accepted_risk"]},{"type":"null"}],"title":"Status"},"unlocked_at_min":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Unlocked At Min"},"filters":{"anyOf":[{"$ref":"#/components/schemas/CombolistAdvancedSearchRequest"},{"type":"null"}],"description":"Advanced filter set, same contract as the advanced listing. When set, the file holds exactly the rows that listing shows."}},"type":"object","title":"CombolistUnlockedExportRequest"},"CombolistUsernameSearchRequest":{"properties":{"username":{"type":"string","maxLength":254,"title":"Username","description":"Exact non-email username to search.","strip_whitespace":true},"search":{"anyOf":[{"type":"string","maxLength":100,"strip_whitespace":true},{"type":"null"}],"title":"Search","description":"Optional substring in the identifier or password."}},"additionalProperties":false,"type":"object","required":["username"],"title":"CombolistUsernameSearchRequest"},"CommentUpsertIn":{"properties":{"comment":{"type":"string","maxLength":500,"minLength":0,"title":"Comment"}},"type":"object","required":["comment"],"title":"CommentUpsertIn","example":{"comment":"Credential rotated on 2025-01-15."}},"ContainerTreeResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TreeEntry"},"type":"array","title":"Items","description":"Entries located under the requested prefix."},"total":{"type":"integer","title":"Total","description":"Total entries under the prefix."},"page":{"type":"integer","title":"Page","description":"Requested page index (1-based)."},"page_size":{"type":"integer","title":"Page Size","description":"Maximum number of entries returned in this response."},"container_id":{"type":"string","title":"Container Id","description":"Identifier of the container that was browsed."},"prefix":{"type":"string","title":"Prefix","description":"Folder prefix used for the listing."}},"type":"object","required":["items","total","page","page_size","container_id","prefix"],"title":"ContainerTreeResponse"},"DarkWebItem":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Unique post identifier."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Post title."},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","description":"Post content. May be truncated for long posts."},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Source identifier (forum/market)."},"source_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Name","description":"Human-readable source name."},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target","description":"Target entity mentioned in the post."},"source_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Ref","description":"Original reference URL on the source."},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author","description":"Post author."},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At","description":"Original publication date."},"ingested_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ingested At","description":"Date when the post was indexed by LeakRadar."},"truncated":{"type":"boolean","title":"Truncated","description":"Whether the content was truncated due to length.","default":false},"censored":{"type":"boolean","title":"Censored","description":"Whether sensitive content was censored.","default":false}},"type":"object","title":"DarkWebItem","example":{"author":"anon","censored":false,"content":"Full credential dump attached...","id":"post_12345","ingested_at":"2025-01-15T10:30:00Z","source":"forum_x","source_name":"Forum X","title":"Database leak for example.com","truncated":false}},"DarkWebPostsStats":{"properties":{"total":{"type":"integer","title":"Total"}},"type":"object","required":["total"],"title":"DarkWebPostsStats"},"DarkWebSearchRequest":{"properties":{"query":{"anyOf":[{"type":"string","maxLength":254,"strip_whitespace":true},{"type":"null"}],"title":"Query","description":"Global search term (simple mode)."},"title":{"anyOf":[{"type":"string","maxLength":254,"strip_whitespace":true},{"type":"null"}],"title":"Title","description":"Search in title only (advanced mode)."},"content":{"anyOf":[{"type":"string","maxLength":254,"strip_whitespace":true},{"type":"null"}],"title":"Content","description":"Search in content only (advanced mode)."},"author":{"anyOf":[{"type":"string","maxLength":100,"strip_whitespace":true},{"type":"null"}],"title":"Author","description":"Exact author match (advanced mode)."},"source_url":{"anyOf":[{"type":"string","maxLength":500,"strip_whitespace":true},{"type":"null"}],"title":"Source Url","description":"Source URL contains (advanced mode)."},"logic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logic","description":"Logic for combining fields: AND or OR.","default":"AND"}},"type":"object","title":"DarkWebSearchRequest","example":{"query":"example.com"}},"DarkWebSearchResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DarkWebItem"},"type":"array","title":"Items","description":"List of dark web posts for the current page."},"total":{"type":"integer","title":"Total","description":"Total number of matching posts."},"page":{"type":"integer","title":"Page","description":"Current page number."},"page_size":{"type":"integer","title":"Page Size","description":"Number of items per page."}},"type":"object","required":["items","total","page","page_size"],"title":"DarkWebSearchResponse","example":{"items":[{"author":"anon","censored":false,"content":"Full credential dump attached...","id":"post_12345","ingested_at":"2025-01-15T10:30:00Z","source":"forum_x","source_name":"Forum X","title":"Database leak for example.com","truncated":false}],"page":1,"page_size":25,"total":1}},"DarkWebSource":{"properties":{"name":{"type":"string","title":"Name"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["name","count"],"title":"DarkWebSource"},"DarkWebSourcesResponse":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/DarkWebSource"},"type":"array","title":"Sources"}},"type":"object","required":["sources"],"title":"DarkWebSourcesResponse","example":{"sources":[{"count":1500,"name":"Forum X"}]}},"DarkWebStatsResponse":{"properties":{"total_posts":{"type":"integer","title":"Total Posts"},"total_sources":{"type":"integer","title":"Total Sources"},"latest_ingested_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Latest Ingested At"},"oldest_published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Oldest Published At"}},"type":"object","required":["total_posts","total_sources"],"title":"DarkWebStatsResponse","example":{"latest_ingested_at":"2025-01-15T10:30:00Z","oldest_published_at":"2020-01-01T00:00:00Z","total_posts":1200000,"total_sources":42}},"DomainExportBody":{"properties":{"search":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"},"is_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Email"},"format":{"anyOf":[{"$ref":"#/components/schemas/ExportFormatEnum"},{"type":"null"}]}},"type":"object","title":"DomainExportBody","example":{"format":"csv","is_email":true,"search":"example.com"}},"DomainMassRequest":{"properties":{"domains":{"items":{"type":"string"},"type":"array","maxItems":100,"minItems":1,"title":"Domains","description":"List of domains, max 100."},"categories":{"anyOf":[{"items":{"$ref":"#/components/schemas/LeakTypeEnum"},"type":"array"},{"type":"null"}],"title":"Categories","description":"Subset among employees, customers, third_parties. If omitted -> all."},"include_counts":{"type":"boolean","title":"Include Counts","description":"If true, also include counts (locked/total/unlocked).","default":false}},"type":"object","required":["domains"],"title":"DomainMassRequest","example":{"domains":["example.com","test.org"],"include_counts":false}},"DomainMassResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/DomainMassResult"},"type":"array","title":"Results"}},"type":"object","required":["results"],"title":"DomainMassResponse","example":{"results":[{"any":true,"categories":{"employees":{"count":10,"has_locked":true,"total":12,"unlocked":2}},"domain":"example.com"}]}},"DomainMassResult":{"properties":{"domain":{"type":"string","title":"Domain"},"any":{"type":"boolean","title":"Any"},"categories":{"additionalProperties":{"$ref":"#/components/schemas/CategoryInfo"},"propertyNames":{"$ref":"#/components/schemas/LeakTypeEnum"},"type":"object","title":"Categories"}},"type":"object","required":["domain","any","categories"],"title":"DomainMassResult"},"DomainSearchLightResponse":{"properties":{"employees_compromised":{"type":"integer","title":"Employees Compromised"},"third_parties_compromised":{"type":"integer","title":"Third Parties Compromised"},"customers_compromised":{"type":"integer","title":"Customers Compromised"},"blacklisted_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blacklisted Value"},"searched_by_count":{"type":"integer","title":"Searched By Count","default":0}},"type":"object","required":["employees_compromised","third_parties_compromised","customers_compromised"],"title":"DomainSearchLightResponse"},"DomainSearchResponse":{"properties":{"employees_compromised":{"type":"integer","title":"Employees Compromised","description":"Number of compromised employee accounts."},"third_parties_compromised":{"type":"integer","title":"Third Parties Compromised","description":"Number of compromised third-party accounts."},"customers_compromised":{"type":"integer","title":"Customers Compromised","description":"Number of compromised customer accounts."},"employee_passwords":{"$ref":"#/components/schemas/PasswordStrengthSummary","description":"Password strength breakdown for employees."},"third_parties_passwords":{"$ref":"#/components/schemas/PasswordStrengthSummary","description":"Password strength breakdown for third parties."},"customer_passwords":{"$ref":"#/components/schemas/PasswordStrengthSummary","description":"Password strength breakdown for customers."},"blacklisted_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blacklisted Value","description":"If a filter value matched a blacklist entry, this field contains the matched value."},"searched_by_count":{"type":"integer","title":"Searched By Count","description":"Number of other users who have searched this domain.","default":0}},"type":"object","required":["employees_compromised","third_parties_compromised","customers_compromised","employee_passwords","third_parties_passwords","customer_passwords"],"title":"DomainSearchResponse"},"DomainSubdomainsExportBody":{"properties":{"search":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},"type":"object","title":"DomainSubdomainsExportBody","example":{"search":"admin"}},"DomainURLsExportBody":{"properties":{"search":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},"type":"object","title":"DomainURLsExportBody","example":{"search":"login"}},"DownloadLogItem":{"properties":{"id":{"type":"integer","title":"Id","description":"Download log entry ID."},"raw_file_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Raw File Id","description":"ID of the raw file that was downloaded."},"container_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Container Id","description":"Container ID of the raw file."},"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Name","description":"Stored file name."},"original_file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original File Name","description":"Original file name before processing."},"download_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Token","description":"Unique download token."},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes","description":"File size in bytes."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Date when the download was initiated."},"success":{"type":"boolean","title":"Success","description":"Whether the download was successful."},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url","description":"Temporary download URL."},"expires_in":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires In","description":"Seconds until the download URL expires."},"download_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Download Expires At","description":"Expiration date of the download URL."},"file_password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Password","description":"Password to extract the downloaded archive."}},"type":"object","required":["id","created_at","success"],"title":"DownloadLogItem"},"DownloadSourceResponse":{"properties":{"url":{"type":"string","title":"Url","description":"Temporary URL that can be used to download the file."},"expires_in":{"type":"integer","title":"Expires In","description":"Number of seconds before the download URL expires.","default":900},"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Name","description":"Suggested file name for the downloaded file."},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes","description":"Size of the file in bytes, when known."},"mime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime","description":"MIME type of the file, when available."},"already_unlocked":{"type":"boolean","title":"Already Unlocked","description":"True when the user had an active unlock for the file prior to this request.","default":false},"downloaded_before":{"type":"boolean","title":"Downloaded Before","description":"Indicates whether the user has successfully downloaded this file in the past.","default":false}},"type":"object","required":["url"],"title":"DownloadSourceResponse"},"EmailMassRequest":{"properties":{"emails":{"items":{"type":"string"},"type":"array","maxItems":100,"minItems":1,"title":"Emails","description":"List of emails or usernames, max 100."},"include_counts":{"type":"boolean","title":"Include Counts","description":"If true, also include counts (locked/total/unlocked).","default":false}},"type":"object","required":["emails"],"title":"EmailMassRequest","example":{"emails":["john.doe@example.com","jane@example.com"],"include_counts":false}},"EmailMassResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/EmailMassResult"},"type":"array","title":"Results"}},"type":"object","required":["results"],"title":"EmailMassResponse","example":{"results":[{"any":true,"email":"john.doe@example.com","locked":3,"total":5,"unlocked":2}]}},"EmailMassResult":{"properties":{"email":{"type":"string","title":"Email"},"any":{"type":"boolean","title":"Any"},"locked":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Locked"},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total"},"unlocked":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Unlocked"}},"type":"object","required":["email","any"],"title":"EmailMassResult"},"EmailSearchRequest":{"properties":{"email":{"type":"string","maxLength":254,"title":"Email","description":"Email or username to search.","strip_whitespace":true},"search":{"anyOf":[{"type":"string","maxLength":100,"strip_whitespace":true},{"type":"null"}],"title":"Search","description":"Optional free-text filter."},"is_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Email","description":"Identifier type filter: true=email only, false=username only, null=both."}},"type":"object","required":["email"],"title":"EmailSearchRequest","example":{"email":"john.doe@example.com","is_email":true}},"EmailSearchResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/LeakDetails"},"type":"array","title":"Items","description":"List of leak records for the current page."},"total":{"type":"integer","title":"Total","description":"Total number of matching leak records."},"total_unlocked":{"type":"integer","title":"Total Unlocked","description":"Number of already-unlocked records in the total results."},"page":{"type":"integer","title":"Page","description":"Current page number."},"page_size":{"type":"integer","title":"Page Size","description":"Number of items per page."},"blacklisted_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blacklisted Value","description":"If a filter value matched a blacklist entry, this field contains the matched value."},"auto_unlock_points_consumed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Unlock Points Consumed","description":"Number of points consumed by auto-unlock on this request."}},"type":"object","required":["items","total","total_unlocked","page","page_size"],"title":"EmailSearchResponse","example":{"items":[{"added_at":"2025-01-15T10:30:00Z","id":"3f1a9c2b7e","is_email":true,"password":"P@ssw0rd123","password_strength":6,"status":"new","unlocked":true,"url":"https://example.com/login","username":"john.doe@example.com"}],"page":1,"page_size":10,"total":1,"total_unlocked":1}},"ErrorMessage":{"type":"object","title":"ErrorMessage","description":"Standard error body. `detail` is a human-readable string on most errors, and an object on the errors that carry structured data (invalid search cursor, raw plan gating, insufficient points, maintenance, public API temporarily disabled).","properties":{"detail":{"title":"Detail","description":"Error message, or an object describing the error. When it is an object it always carries a `message`, plus a `code` when the error is machine-identifiable.","anyOf":[{"type":"string"},{"type":"object","additionalProperties":true}]},"code":{"type":"string","title":"Code","description":"Machine-readable error code, at the top level. Returned on 503 responses raised when search is temporarily unavailable (`search_unavailable`), alongside a `Retry-After` header."},"id":{"type":"string","title":"Id","description":"Correlation id of an unhandled server error (500). Quote it when reporting the problem to support."}},"required":["detail"]},"ExportBase":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"filename":{"type":"string","title":"Filename"},"type":{"type":"string","title":"Type"},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params"},"status":{"type":"string","title":"Status"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"from_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From Date"}},"type":"object","required":["id","user_id","filename","type","status","timestamp"],"title":"ExportBase"},"ExportFormatEnum":{"type":"string","enum":["csv","txt","json"],"title":"ExportFormatEnum"},"ExportResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Export job status: 'queued', 'processing', 'completed', or 'failed'."},"message":{"type":"string","title":"Message","description":"Human-readable status message."},"export_id":{"type":"integer","title":"Export Id","description":"ID of the export job. Use this to check status or download the result."}},"type":"object","required":["status","message","export_id"],"title":"ExportResponse","example":{"export_id":1234,"message":"Your export request has been queued. Check the Exports page for progress.","status":"queued"}},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InvoiceBase":{"properties":{"id":{"type":"integer","title":"Id"},"amount":{"type":"number","title":"Amount"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"},"paid":{"type":"boolean","title":"Paid"},"paid_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paid At"},"payment_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method"},"is_renewal":{"type":"boolean","title":"Is Renewal"},"discount_code_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Discount Code Id"},"user_id":{"type":"integer","title":"User Id"},"discount_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Discount Amount"},"vat_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vat Rate"},"vat_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vat Amount"},"vat_reverse_charge":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Vat Reverse Charge"},"vat_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vat Country"},"vat_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vat Number"},"invoice_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Type"}},"type":"object","required":["id","amount","period","paid","payment_method","is_renewal","discount_code_id","user_id"],"title":"InvoiceBase"},"LeakDetails":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Unique leak identifier. Only returned when the item is unlocked or the plan includes full access."},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Source URL where the credentials were found. Redacted for locked items on non-advanced plans."},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username","description":"Leaked username or email address. Masked when locked."},"username_masked":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username Masked","description":"Partially masked version of the username (e.g. j***@example.com)."},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password","description":"Leaked password. Only returned when the item is unlocked."},"password_strength":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Password Strength","description":"Password strength raw score (integer, 0+). Categories: too_weak (0-2), weak (3-4), medium (5-7), strong (8+).","default":0},"unlocked":{"type":"boolean","title":"Unlocked","description":"Whether this item has been unlocked by the current account.","default":false},"is_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Email","description":"True if the username is an email address, false if it is a plain username."},"added_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Added At","description":"Date when this leak was added to the database."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Remediation status of the unlocked leak: new, in_progress, fixed, accepted_risk. Only present for unlocked items."}},"type":"object","title":"LeakDetails","example":{"added_at":"2025-01-15T10:30:00Z","id":"3f1a9c2b7e","is_email":true,"password":"P@ssw0rd123","password_strength":6,"status":"new","unlocked":true,"url":"https://example.com/login","username":"john.doe@example.com"}},"LeakSearchFilters":{"properties":{"username":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Username","description":"Username values to match."},"username_not":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Username Not","description":"Username values to exclude."},"username_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Username matching mode. Omitted means contains."},"username_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded username matching mode. Omitted means contains."},"password":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Password","description":"Password values to match."},"password_not":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Password Not","description":"Password values to exclude."},"password_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Password matching mode. Omitted means contains."},"password_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded password matching mode. Omitted means contains."},"url":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url","description":"URL values to match."},"url_not":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url Not","description":"URL values to exclude."},"url_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"URL matching mode. Omitted means contains."},"url_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded URL matching mode. Omitted means contains."},"url_domain":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url Domain","description":"URL domain values to match."},"url_domain_not":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url Domain Not","description":"URL domain values to exclude."},"url_domain_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"URL domain matching mode. Omitted means contains."},"url_domain_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded URL domain matching mode. Omitted means contains."},"url_host":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url Host","description":"URL host values to match."},"url_host_not":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url Host Not","description":"URL host values to exclude."},"url_host_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"URL host matching mode. Omitted means contains."},"url_host_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded URL host matching mode. Omitted means contains."},"username_hash":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Username Hash","description":"Username SHA-1 hash prefix (hex)."},"password_hash":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Password Hash","description":"Password SHA-1 hash prefix (hex)."},"url_scheme":{"anyOf":[{"items":{"type":"string","maxLength":20,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url Scheme","description":"URL scheme(s) to include (multi)."},"url_scheme_not":{"anyOf":[{"items":{"type":"string","maxLength":20,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url Scheme Not","description":"URL scheme(s) to exclude (multi)."},"url_port":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Url Port","description":"URL port(s) to include (multi)."},"url_port_not":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Url Port Not","description":"URL port(s) to exclude (multi)."},"url_tld":{"anyOf":[{"items":{"type":"string","maxLength":10,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url Tld","description":"URL TLD(s) to include (multi)."},"url_tld_not":{"anyOf":[{"items":{"type":"string","maxLength":10,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url Tld Not","description":"URL TLD(s) to exclude (multi)."},"is_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Email","description":"Identifier type filter: true=email only, false=username only, null=both."},"email_domain":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Email Domain","description":"Email domain values to match."},"email_domain_not":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Email Domain Not","description":"Email domain values to exclude."},"email_domain_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Email domain matching mode. Omitted means contains."},"email_domain_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded email domain matching mode. Omitted means contains."},"email_host":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Email Host","description":"Email host values to match."},"email_host_not":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Email Host Not","description":"Email host values to exclude."},"email_host_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Email host matching mode. Omitted means contains."},"email_host_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded email host matching mode. Omitted means contains."},"email_tld":{"anyOf":[{"items":{"type":"string","maxLength":10,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Email Tld","description":"Email TLD(s) to include (multi)."},"email_tld_not":{"anyOf":[{"items":{"type":"string","maxLength":10,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Email Tld Not","description":"Email TLD(s) to exclude (multi)."},"password_strength":{"anyOf":[{"$ref":"#/components/schemas/PasswordStrengthCategory-Input"},{"type":"null"}],"description":"Filter by password strength category. too_weak = score 0-2, weak = 3-4, medium = 5-7, strong = 8+."},"added_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Added From","description":"Only include leaks indexed on/after this UTC datetime."},"added_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Added To","description":"Only include leaks indexed on/before this UTC datetime."},"force_and":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Force And","description":"When true, require all values within each field (AND within field)."}},"type":"object","title":"LeakSearchFilters","example":{"password":["123456"],"url_domain":["example.com"]}},"LeakTypeEnum":{"type":"string","enum":["employees","third_parties","customers","all"],"title":"LeakTypeEnum"},"LeaksStats":{"properties":{"total":{"type":"integer","title":"Total"},"today":{"type":"integer","title":"Today"},"per_week":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Per Week"},"this_week":{"type":"integer","title":"This Week"},"this_month":{"type":"integer","title":"This Month"}},"type":"object","required":["total","today","per_week","this_week","this_month"],"title":"LeaksStats"},"ListCleanupTasksOut":{"properties":{"task_id":{"type":"string","title":"Task Id"},"running":{"type":"boolean","title":"Running"},"completed":{"type":"boolean","title":"Completed"},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total"},"updated":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Updated"},"version_conflicts":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version Conflicts"},"task_ids":{"items":{"type":"string"},"type":"array","title":"Task Ids"}},"type":"object","required":["task_id","running","completed","task_ids"],"title":"ListCleanupTasksOut","description":"Backward-compatible primary task plus every dataset cleanup task.","example":{"completed":false,"running":true,"task_id":"stealer-node:11","task_ids":["stealer-node:11","combolist-node:22"]}},"LiveStatsResponse":{"properties":{"raw_lines_total":{"type":"integer","title":"Raw Lines Total"},"raw_lines_7d":{"type":"integer","title":"Raw Lines 7D"},"leaks_total":{"type":"integer","title":"Leaks Total"},"leaks_7d":{"type":"integer","title":"Leaks 7D"},"dark_web_posts_total":{"type":"integer","title":"Dark Web Posts Total"},"sources_active":{"type":"integer","title":"Sources Active"},"credentials_per_second_24h":{"type":"number","title":"Credentials Per Second 24H"},"sparkline_24h":{"items":{"type":"integer"},"type":"array","title":"Sparkline 24H"},"synced_at":{"type":"string","title":"Synced At"}},"type":"object","required":["raw_lines_total","raw_lines_7d","leaks_total","leaks_7d","dark_web_posts_total","sources_active","credentials_per_second_24h","sparkline_24h","synced_at"],"title":"LiveStatsResponse","example":{"credentials_per_second_24h":12.5,"dark_web_posts_total":1200000,"leaks_7d":50000000,"leaks_total":15000000000,"raw_lines_7d":100000000,"raw_lines_total":50000000000,"sources_active":42,"sparkline_24h":[100,120,90,140,110],"synced_at":"2025-01-15T10:30:00Z"}},"MonitoringUsageMetric":{"properties":{"used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Used","description":"Current consumption, null when unreadable."},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit","description":"Plan limit, null when unlimited."},"plan_limit":{"type":"integer","title":"Plan Limit","description":"Slots granted by the plan (or free tier baseline).","default":0},"extra_limit":{"type":"integer","title":"Extra Limit","description":"Slots bought on top of the plan.","default":0}},"type":"object","title":"MonitoringUsageMetric"},"NNotificationMethodTypeEnum":{"type":"string","enum":["email","slack","telegram","webhook","discord"],"title":"NNotificationMethodTypeEnum"},"NNotificationTypeEnum":{"type":"string","enum":["email","domain","advanced","raw","dark_web"],"title":"NNotificationTypeEnum"},"NotificationCreateRequest":{"properties":{"method_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Method Id","description":"Notification method ID to use."},"dataset":{"type":"string","enum":["stealer_logs","combolist"],"title":"Dataset","description":"Credential dataset to monitor.","default":"stealer_logs"},"type":{"$ref":"#/components/schemas/NNotificationTypeEnum","description":"Notification type (what to monitor)."},"value":{"anyOf":[{"type":"string","maxLength":4096,"strip_whitespace":true},{"type":"null"}],"title":"Value","description":"Value to monitor (required for EMAIL/DOMAIN types)."},"filters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filters","description":"Filters when type=ADVANCED or RAW. Parsed according to type."},"auto_unlock":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Unlock","description":"If true, automatically unlock new matching leaks (consumes points)."},"max_points":{"anyOf":[{"type":"integer","maximum":300000.0,"minimum":0.0},{"type":"null"}],"title":"Max Points","description":"Daily points cap for auto-unlock (if enabled)."},"second_type":{"anyOf":[{"$ref":"#/components/schemas/NotificationLeakTypeEnum"},{"type":"null"}],"description":"For DOMAIN notifications: which leak category to monitor."},"bulk":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Bulk","description":"Create multiple notifications at once (e.g., newline-separated values).","default":false}},"type":"object","required":["type"],"title":"NotificationCreateRequest","example":{"method_id":1,"type":"domain","value":"example.com"}},"NotificationLeakTypeEnum":{"type":"string","enum":["ALL","EMPLOYEES","THIRD_PARTIES","CUSTOMERS"],"title":"NotificationLeakTypeEnum"},"NotificationMethodCreateRequest":{"properties":{"type":{"$ref":"#/components/schemas/NNotificationMethodTypeEnum","description":"Notification method type."},"value":{"type":"string","maxLength":500,"title":"Value","description":"Primary value (e.g., webhook URL, bot token, or email address).","strip_whitespace":true},"second_value":{"anyOf":[{"type":"string","maxLength":500,"strip_whitespace":true},{"type":"null"}],"title":"Second Value","description":"Secondary value when required by the method (e.g., Telegram chat_id)."},"headers":{"anyOf":[{"items":{"$ref":"#/components/schemas/WebhookCustomHeader"},"type":"array"},{"type":"null"}],"title":"Headers","description":"Optional custom HTTP headers for webhook methods (max 10)."},"extra_emails":{"anyOf":[{"items":{"type":"string","maxLength":254,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Extra Emails","description":"Up to 4 additional email recipients (delivered as BCC). Only allowed when type=email. Total recipients (value + extra_emails) must be ≤ 5."}},"type":"object","required":["type","value"],"title":"NotificationMethodCreateRequest","example":{"type":"email","value":"alerts@example.com"}},"NotificationMethodOut":{"properties":{"id":{"type":"integer","title":"Id","description":"Notification method ID."},"type":{"$ref":"#/components/schemas/NNotificationMethodTypeEnum","description":"Delivery type: email, slack, telegram, discord, or webhook."},"value":{"type":"string","title":"Value","description":"Primary destination (email address, webhook URL, channel ID, etc.)."},"second_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Second Value","description":"Secondary value (e.g. Telegram chat ID)."},"headers":{"anyOf":[{"items":{"$ref":"#/components/schemas/WebhookHeaderOut"},"type":"array"},{"type":"null"}],"title":"Headers","description":"Custom HTTP headers for webhook methods."},"extra_emails":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Extra Emails","description":"Additional email recipients delivered as BCC (email methods only, max 4)."},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Creation date of this notification method."}},"type":"object","required":["id","type","value","timestamp"],"title":"NotificationMethodOut"},"NotificationOut":{"properties":{"id":{"type":"integer","title":"Id","description":"Notification ID."},"method_id":{"type":"integer","title":"Method Id","description":"ID of the notification method used for delivery."},"type":{"$ref":"#/components/schemas/NNotificationTypeEnum","description":"Monitoring type: email, domain, advanced, raw, or dark_web."},"dataset":{"type":"string","enum":["stealer_logs","combolist"],"title":"Dataset","description":"Credential dataset monitored by this notification.","default":"stealer_logs"},"second_type":{"anyOf":[{"$ref":"#/components/schemas/NotificationLeakTypeEnum"},{"type":"null"}],"description":"Sub-type for domain notifications: employees, customers, or third_parties."},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"Monitored value (email address, domain, search query, etc.)."},"filters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filters","description":"Additional search filters applied to this notification."},"last_searched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Searched At","description":"Last time this notification was checked for new results."},"is_active":{"type":"boolean","title":"Is Active","description":"Whether this notification is currently active."},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Creation date of this notification."},"method_type":{"anyOf":[{"$ref":"#/components/schemas/NNotificationMethodTypeEnum"},{"type":"null"}],"description":"Delivery type of the associated method."},"method_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Method Value","description":"Destination of the associated method."},"method_extra_emails":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Method Extra Emails","description":"Additional BCC recipients of the associated method (email methods only)."},"auto_unlock":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Unlock","description":"Whether new results are automatically unlocked."},"max_points":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Points","description":"Maximum points to spend per notification run for auto-unlock."},"daily_spent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Spent","description":"Points spent today by auto-unlock on this notification."},"daily_reset_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Daily Reset At","description":"Next daily reset time for the spent counter."},"total_notifications":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Notifications","description":"Total number of notification runs executed."},"total_cost":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Cost","description":"Total points consumed by this notification across all runs."}},"type":"object","required":["id","method_id","type","is_active","timestamp"],"title":"NotificationOut"},"NotificationRunBase":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"notification_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Notification Id"},"sent_at":{"type":"string","format":"date-time","title":"Sent At"},"new_leaks_count":{"type":"integer","title":"New Leaks Count"},"unlocked_count":{"type":"integer","title":"Unlocked Count"},"points_spent":{"type":"integer","title":"Points Spent"},"sent_ok":{"type":"boolean","title":"Sent Ok"},"notification_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Type"},"notification_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Value"},"dataset":{"type":"string","enum":["stealer_logs","combolist"],"title":"Dataset","default":"stealer_logs"},"status":{"type":"string","title":"Status","default":"new"}},"type":"object","required":["id","user_id","sent_at","new_leaks_count","unlocked_count","points_spent","sent_ok"],"title":"NotificationRunBase"},"NotificationRunStatusUpdateIn":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"NotificationRunStatusUpdateIn","example":{"status":"fixed"}},"NotificationStatsResponse":{"properties":{"total_notifications_asset":{"type":"integer","title":"Total Notifications Asset"},"max_notification_asset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Notification Asset"},"plan_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Plan Limit"},"extra_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Extra Limit"},"total_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Limit"},"available":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Available"}},"type":"object","required":["total_notifications_asset","max_notification_asset"],"title":"NotificationStatsResponse"},"NotificationStatusUpdateRequest":{"properties":{"is_active":{"type":"boolean","title":"Is Active","description":"Set the notification as active/inactive."}},"type":"object","required":["is_active"],"title":"NotificationStatusUpdateRequest","example":{"is_active":true}},"NotificationsDeleteRequest":{"properties":{"ids":{"items":{"type":"integer"},"type":"array","maxItems":100,"title":"Ids","description":"Notification IDs to delete."}},"type":"object","required":["ids"],"title":"NotificationsDeleteRequest","example":{"ids":[12,34,56]}},"PaginatedAllLeaksResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AllLeakDetails"},"type":"array","title":"Items","description":"List of leak records for the current page."},"total":{"type":"integer","title":"Total","description":"Total number of matching leak records."},"total_unlocked":{"type":"integer","title":"Total Unlocked","description":"Number of already-unlocked records in the total results."},"page":{"type":"integer","title":"Page","description":"Current page number."},"page_size":{"type":"integer","title":"Page Size","description":"Number of items per page."},"blacklisted_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blacklisted Value","description":"If a filter value matched a blacklist entry, this field contains the matched value."},"auto_unlock_points_consumed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Unlock Points Consumed","description":"Number of points consumed by auto-unlock on this request."}},"type":"object","required":["items","total","total_unlocked","page","page_size"],"title":"PaginatedAllLeaksResponse"},"PaginatedLeaksResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/LeakDetails"},"type":"array","title":"Items","description":"List of leak records for the current page."},"total":{"type":"integer","title":"Total","description":"Total number of matching leak records."},"total_unlocked":{"type":"integer","title":"Total Unlocked","description":"Number of already-unlocked records in the total results."},"page":{"type":"integer","title":"Page","description":"Current page number."},"page_size":{"type":"integer","title":"Page Size","description":"Number of items per page."},"blacklisted_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blacklisted Value","description":"If a filter value matched a blacklist entry, this field contains the matched value."},"auto_unlock_points_consumed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Unlock Points Consumed","description":"Number of points consumed by auto-unlock on this request."}},"type":"object","required":["items","total","total_unlocked","page","page_size"],"title":"PaginatedLeaksResponse"},"PaginatedResponse_BalanceLogItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BalanceLogItem"},"type":"array","title":"Items","description":"List of items for the current page."},"total":{"type":"integer","title":"Total","description":"Total number of matching items."},"page":{"type":"integer","title":"Page","description":"Current page number."},"page_size":{"type":"integer","title":"Page Size","description":"Number of items per page."},"blacklisted_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blacklisted Value","description":"If a filter value matched a blacklist entry, this field contains the matched value."}},"type":"object","required":["items","total","page","page_size"],"title":"PaginatedResponse[BalanceLogItem]","example":{"items":[],"page":1,"page_size":20,"total":0}},"PaginatedResponse_DownloadLogItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DownloadLogItem"},"type":"array","title":"Items","description":"List of items for the current page."},"total":{"type":"integer","title":"Total","description":"Total number of matching items."},"page":{"type":"integer","title":"Page","description":"Current page number."},"page_size":{"type":"integer","title":"Page Size","description":"Number of items per page."},"blacklisted_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blacklisted Value","description":"If a filter value matched a blacklist entry, this field contains the matched value."}},"type":"object","required":["items","total","page","page_size"],"title":"PaginatedResponse[DownloadLogItem]","example":{"items":[],"page":1,"page_size":20,"total":0}},"PaginatedResponse_ExportBase_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ExportBase"},"type":"array","title":"Items","description":"List of items for the current page."},"total":{"type":"integer","title":"Total","description":"Total number of matching items."},"page":{"type":"integer","title":"Page","description":"Current page number."},"page_size":{"type":"integer","title":"Page Size","description":"Number of items per page."},"blacklisted_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blacklisted Value","description":"If a filter value matched a blacklist entry, this field contains the matched value."}},"type":"object","required":["items","total","page","page_size"],"title":"PaginatedResponse[ExportBase]","example":{"items":[],"page":1,"page_size":20,"total":0}},"PaginatedResponse_NotificationRunBase_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/NotificationRunBase"},"type":"array","title":"Items","description":"List of items for the current page."},"total":{"type":"integer","title":"Total","description":"Total number of matching items."},"page":{"type":"integer","title":"Page","description":"Current page number."},"page_size":{"type":"integer","title":"Page Size","description":"Number of items per page."},"blacklisted_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blacklisted Value","description":"If a filter value matched a blacklist entry, this field contains the matched value."}},"type":"object","required":["items","total","page","page_size"],"title":"PaginatedResponse[NotificationRunBase]","example":{"items":[],"page":1,"page_size":20,"total":0}},"PaginatedResponse_RawUnlockedPartItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/RawUnlockedPartItem"},"type":"array","title":"Items","description":"List of items for the current page."},"total":{"type":"integer","title":"Total","description":"Total number of matching items."},"page":{"type":"integer","title":"Page","description":"Current page number."},"page_size":{"type":"integer","title":"Page Size","description":"Number of items per page."},"blacklisted_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blacklisted Value","description":"If a filter value matched a blacklist entry, this field contains the matched value."}},"type":"object","required":["items","total","page","page_size"],"title":"PaginatedResponse[RawUnlockedPartItem]","example":{"items":[],"page":1,"page_size":20,"total":0}},"PaginatedResponse_SubdomainOccurrences_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SubdomainOccurrences"},"type":"array","title":"Items","description":"List of items for the current page."},"total":{"type":"integer","title":"Total","description":"Total number of matching items."},"page":{"type":"integer","title":"Page","description":"Current page number."},"page_size":{"type":"integer","title":"Page Size","description":"Number of items per page."},"blacklisted_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blacklisted Value","description":"If a filter value matched a blacklist entry, this field contains the matched value."}},"type":"object","required":["items","total","page","page_size"],"title":"PaginatedResponse[SubdomainOccurrences]","example":{"items":[],"page":1,"page_size":20,"total":0}},"PaginatedResponse_URLOccurrences_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/URLOccurrences"},"type":"array","title":"Items","description":"List of items for the current page."},"total":{"type":"integer","title":"Total","description":"Total number of matching items."},"page":{"type":"integer","title":"Page","description":"Current page number."},"page_size":{"type":"integer","title":"Page Size","description":"Number of items per page."},"blacklisted_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blacklisted Value","description":"If a filter value matched a blacklist entry, this field contains the matched value."}},"type":"object","required":["items","total","page","page_size"],"title":"PaginatedResponse[URLOccurrences]","example":{"items":[],"page":1,"page_size":20,"total":0}},"PaginatedResponse_UserTaskItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/UserTaskItem"},"type":"array","title":"Items","description":"List of items for the current page."},"total":{"type":"integer","title":"Total","description":"Total number of matching items."},"page":{"type":"integer","title":"Page","description":"Current page number."},"page_size":{"type":"integer","title":"Page Size","description":"Number of items per page."},"blacklisted_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blacklisted Value","description":"If a filter value matched a blacklist entry, this field contains the matched value."}},"type":"object","required":["items","total","page","page_size"],"title":"PaginatedResponse[UserTaskItem]","example":{"items":[],"page":1,"page_size":20,"total":0}},"PaginatedRunItemsResponse":{"properties":{"items":{"items":{},"type":"array","title":"Items","description":"List of run items (LeakRunItem, RawRunItem, or DarkWebRunItem)."},"total":{"type":"integer","title":"Total","description":"Total number of items in this run."},"total_unlocked":{"type":"integer","title":"Total Unlocked","description":"Number of already-unlocked items."},"page":{"type":"integer","title":"Page","description":"Current page number."},"page_size":{"type":"integer","title":"Page Size","description":"Number of items per page."},"item_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item Type","description":"Primary item type in this run: 'leak', 'raw', or 'dark_web'."}},"type":"object","required":["items","total","total_unlocked","page","page_size"],"title":"PaginatedRunItemsResponse","description":"Paginated response for notification run items."},"PaginatedUnlockedCombolistsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CombolistUnlockedDetails"},"type":"array","title":"Items"},"total":{"type":"integer","minimum":0.0,"title":"Total","description":"Records matching the filters."},"total_unlocked":{"type":"integer","minimum":0.0,"title":"Total Unlocked","description":"Records you have unlocked in total, filters ignored."},"page":{"type":"integer","minimum":1.0,"title":"Page"},"page_size":{"type":"integer","minimum":1.0,"title":"Page Size"}},"type":"object","required":["items","total","total_unlocked","page","page_size"],"title":"PaginatedUnlockedCombolistsResponse"},"PaginatedUnlockedLeaksResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/UnlockedLeakDetails"},"type":"array","title":"Items","description":"List of unlocked leak records for the current page."},"total":{"type":"integer","title":"Total","description":"Total number of matching records."},"total_unlocked":{"type":"integer","title":"Total Unlocked","description":"Total number of unlocked records."},"page":{"type":"integer","title":"Page","description":"Current page number."},"page_size":{"type":"integer","title":"Page Size","description":"Number of items per page."}},"type":"object","required":["items","total","total_unlocked","page","page_size"],"title":"PaginatedUnlockedLeaksResponse"},"PartResponse":{"properties":{"container_id":{"type":"string","title":"Container Id","description":"Identifier of the container that owns the part."},"entry_path":{"type":"string","title":"Entry Path","description":"Entry path that contains the part."},"seq":{"type":"integer","title":"Seq","description":"Sequential part number requested."},"offset":{"type":"integer","title":"Offset","description":"Byte offset of the part inside the entry."},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes","description":"Size of the returned block in bytes, if available."},"ingested_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ingested At","description":"ISO timestamp of the ingestion time for the block."},"trim_overlap":{"type":"boolean","title":"Trim Overlap","description":"True if the overlapping prefix was trimmed from the returned content."},"overlap_chars":{"type":"integer","title":"Overlap Chars","description":"Number of characters trimmed from the start when `trim_overlap=true`."},"text":{"type":"string","title":"Text","description":"Text content of the block. May be censored."},"censored":{"type":"boolean","title":"Censored","description":"True if the user has not unlocked the content and it was redacted."}},"type":"object","required":["container_id","entry_path","seq","offset","trim_overlap","overlap_chars","text","censored"],"title":"PartResponse"},"PartsItem":{"properties":{"seq":{"type":"integer","title":"Seq","description":"Sequential part number within the entry."},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes","description":"Size of the block in bytes, when recorded."},"offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Offset","description":"Byte offset of the block within the entry."},"ingested_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ingested At","description":"ISO timestamp of the ingestion time for the block."}},"type":"object","required":["seq"],"title":"PartsItem"},"PartsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PartsItem"},"type":"array","title":"Items","description":"Sequence of parts found for the requested slice."},"total":{"type":"integer","title":"Total","description":"Total number of parts available for the entry."},"page":{"type":"integer","title":"Page","description":"Requested page index (1-based)."},"page_size":{"type":"integer","title":"Page Size","description":"Number of parts returned in this page."},"window":{"anyOf":[{"$ref":"#/components/schemas/PartsWindow"},{"type":"null"}],"description":"Span of part indexes covered by the response."},"container_id":{"type":"string","title":"Container Id","description":"Identifier of the container queried."},"entry_path":{"type":"string","title":"Entry Path","description":"Entry path for which the parts are listed."}},"type":"object","required":["items","total","page","page_size","container_id","entry_path"],"title":"PartsResponse"},"PartsWindow":{"properties":{"start_index":{"type":"integer","title":"Start Index","description":"Index (0-based) of the first part present in the window."},"end_index":{"type":"integer","title":"End Index","description":"Index (0-based) of the last part present in the window."}},"type":"object","required":["start_index","end_index"],"title":"PartsWindow"},"PasswordRangeItem":{"properties":{"hash":{"type":"string","title":"Hash"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["hash","count"],"title":"PasswordRangeItem"},"PasswordRangeResponse":{"properties":{"prefix":{"type":"string","title":"Prefix"},"total":{"type":"integer","title":"Total"},"hashes":{"items":{"$ref":"#/components/schemas/PasswordRangeItem"},"type":"array","title":"Hashes"}},"type":"object","required":["prefix","total","hashes"],"title":"PasswordRangeResponse"},"PasswordStrengthCategory-Input":{"type":"string","enum":["too_weak","weak","medium","strong"],"title":"PasswordStrengthCategory"},"PasswordStrengthCategory-Output":{"properties":{"qty":{"type":"integer","title":"Qty"},"perc":{"type":"number","title":"Perc"}},"type":"object","required":["qty","perc"],"title":"PasswordStrengthCategory"},"PasswordStrengthSummary":{"properties":{"total_pass":{"type":"integer","title":"Total Pass","description":"Total number of passwords analysed."},"too_weak":{"$ref":"#/components/schemas/PasswordStrengthCategory-Output","description":"Breakdown for passwords rated 'too weak'."},"weak":{"$ref":"#/components/schemas/PasswordStrengthCategory-Output","description":"Breakdown for passwords rated 'weak'."},"medium":{"$ref":"#/components/schemas/PasswordStrengthCategory-Output","description":"Breakdown for passwords rated 'medium'."},"strong":{"$ref":"#/components/schemas/PasswordStrengthCategory-Output","description":"Breakdown for passwords rated 'strong'."}},"type":"object","required":["total_pass","too_weak","weak","medium","strong"],"title":"PasswordStrengthSummary"},"PlanBase":{"properties":{"id":{"type":"integer","title":"Id"},"plan_name":{"type":"string","title":"Plan Name"},"name":{"type":"string","title":"Name"},"price":{"type":"number","title":"Price"},"default_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Default Price"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"},"points":{"type":"integer","title":"Points"},"gb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Gb","default":0},"email_search":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Email Search","default":false},"domain_search":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Domain Search","default":false},"advanced_search":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Advanced Search","default":false},"raw_search":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Raw Search","default":false},"combolist_search":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Combolist Search","default":false},"dark_web_search":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dark Web Search","default":false},"show_sensitive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Sensitive","default":false},"monitoring_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monitoring Limit"},"unlocked_lists_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Unlocked Lists Limit"},"daily_request_cap":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Request Cap"},"concurrent_raw":{"type":"integer","title":"Concurrent Raw","default":1},"concurrent_advanced":{"type":"integer","title":"Concurrent Advanced","default":1},"bypass_points":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Bypass Points","default":false},"applied_discount_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Applied Discount Percent"},"upgrade_credit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Upgrade Credit"},"final_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Final Price"},"team_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Team Enabled","default":false},"team_member_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Member Limit"},"order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Order","default":0},"popular":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Popular","default":false},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["id","plan_name","name","price","default_price","period","points"],"title":"PlanBase"},"PlanUsageResponse":{"properties":{"caps_enforced":{"type":"boolean","title":"Caps Enforced","description":"False when the caps of your plan are not being applied.","default":true},"legacy_caps":{"type":"boolean","title":"Legacy Caps","description":"The daily request cap is not enforced on this account.","default":false},"is_team_member":{"type":"boolean","title":"Is Team Member","default":false},"plan_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Name"},"is_paid":{"type":"boolean","title":"Is Paid","default":false},"requests_daily":{"$ref":"#/components/schemas/UsageMetric"},"requests_daily_reset_epoch":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Requests Daily Reset Epoch","description":"Unix epoch of the next hourly rollover."},"concurrent_raw":{"$ref":"#/components/schemas/UsageMetric"},"concurrent_advanced":{"$ref":"#/components/schemas/UsageMetric"},"unlocked_lists":{"$ref":"#/components/schemas/UsageMetric"},"team":{"$ref":"#/components/schemas/TeamUsageMetric"},"monitoring":{"$ref":"#/components/schemas/MonitoringUsageMetric"}},"type":"object","required":["requests_daily","concurrent_raw","concurrent_advanced","unlocked_lists","team","monitoring"],"title":"PlanUsageResponse","description":"Plan limits and their live consumption, account-owner scoped.\n\nCounters are shared across a team: a member sees the owner's consumption."},"ProfileUpdate":{"properties":{"first_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Last Name"},"organization":{"anyOf":[{"type":"string","maxLength":180},{"type":"null"}],"title":"Organization"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"address_line2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line2"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"zip_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zip Code"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"tva_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tva Number"}},"type":"object","title":"ProfileUpdate","example":{"country":"US","first_name":"John","last_name":"Doe","organization":"Acme Inc"}},"RawCountResponse":{"properties":{"total":{"type":"integer","title":"Total","description":"Number of matching raw blocks for the same filters as /search/raw. This is the maximum number of parts (and, at 1 point per part, the maximum points) a mass unlock would consume. It counts all matches, including any the caller already unlocked (those are not re-charged), so treat it as an upper bound on cost."},"exact":{"type":"boolean","title":"Exact","description":"True when total is the exact match count. False when it is only an upper bound: q_exact (word-boundary post-filter) or dedup (app-side fold) shrink the real set."},"capped":{"type":"boolean","title":"Capped","description":"True if the count reached its upper limit; total is then a lower bound (\"at least\").","default":false},"blacklisted_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blacklisted Value","description":"If a filter value matched a blacklist entry, the matched value (total is 0)."}},"type":"object","required":["total","exact"],"title":"RawCountResponse"},"RawDownloadPreviewResponse":{"properties":{"sha256_original":{"type":"string","title":"Sha256 Original","description":"SHA-256 hash of the raw file that would be downloaded."},"raw_file_id":{"type":"integer","title":"Raw File Id","description":"Identifier of the raw file."},"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Name","description":"Proposed download file name, when available."},"original_file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original File Name","description":"Original file name when it differs from the stored name."},"source_size_bytes":{"type":"integer","title":"Source Size Bytes","description":"Original file size in bytes."},"already_unlocked":{"type":"boolean","title":"Already Unlocked","description":"Whether the user has already unlocked the complete file."},"cost_bytes":{"type":"integer","title":"Cost Bytes","description":"Number of bytes that will be debited if the user unlocks the file."},"user_gb_available_bytes":{"type":"integer","title":"User Gb Available Bytes","description":"Remaining quota in bytes for the current user."},"can_unlock":{"type":"boolean","title":"Can Unlock","description":"True when the user has enough quota to unlock the file."},"file_password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Password","description":"Password required to open the downloaded archive, when present."},"downloaded_before":{"type":"boolean","title":"Downloaded Before","description":"True if the user has downloaded this file previously, regardless of unlock expiration.","default":false}},"type":"object","required":["sha256_original","raw_file_id","source_size_bytes","already_unlocked","cost_bytes","user_gb_available_bytes","can_unlock"],"title":"RawDownloadPreviewResponse"},"RawFileAddedSummary":{"properties":{"id":{"type":"integer","title":"Id","description":"Identifier of the raw file."},"original_file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original File Name","description":"Original file name attached to the raw file."},"lines":{"type":"integer","title":"Lines","description":"Number of lines indexed for the raw file."},"ingested_at":{"type":"string","title":"Ingested At","description":"ISO timestamp indicating when the raw file was ingested."},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Category of the raw file (e.g. stealer-logs, database)."}},"type":"object","required":["id","lines","ingested_at"],"title":"RawFileAddedSummary"},"RawFileInfoResponse":{"properties":{"container_id":{"type":"string","title":"Container Id","description":"Identifier of the container that owns the entry."},"entry_path":{"type":"string","title":"Entry Path","description":"Entry path looked up in the index."},"entry_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entry Name","description":"Base name of the entry, when known."},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes","description":"Size of the entry in bytes, if provided by the index."},"sha256_original":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sha256 Original","description":"SHA-256 hash of the original raw file, when known."}},"type":"object","required":["container_id","entry_path"],"title":"RawFileInfoResponse"},"RawMatchType":{"type":"string","enum":["contains","starts_with","ends_with","exact"],"title":"RawMatchType","description":"How a raw file-name or folder value is matched.\n\nSeparate from AdvancedTextMatchType on purpose: raw has an EXACT mode the\nstealer fields do not, and adding it there would widen a contract that\nseven surfaces already depend on."},"RawSearchItem":{"properties":{"container_id":{"type":"string","title":"Container Id","description":"Identifier of the container that stores the raw entry."},"entry_path":{"type":"string","title":"Entry Path","description":"Path of the entry inside the container."},"entry_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entry Name","description":"Base file name extracted from the path, when available."},"ext":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ext","description":"Detected file extension for the entry."},"seq":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seq","description":"Sequential block number within the entry."},"offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Offset","description":"Byte offset of the block within the original file."},"ingested_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ingested At","description":"ISO timestamp of the ingestion time."},"sha256_original":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sha256 Original","description":"SHA-256 hash of the original raw file, when known."},"original_file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original File Name","description":"Name of the source leak file (container) this block comes from."},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Leak category of the source file: 'stealer-logs', 'database' or 'combolist'."},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"Friendly name to show: source file name for flat containers, else the entry name."},"snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snippet","description":"Preview of the matching line, censored when the block is locked."},"already_unlocked":{"type":"boolean","title":"Already Unlocked","description":"Indicates if the user has already unlocked this block or the parent file.","default":false},"matching_lines":{"items":{"type":"string"},"type":"array","title":"Matching Lines","description":"Lines from the block content that contain the queried text (export only)."}},"type":"object","required":["container_id","entry_path"],"title":"RawSearchItem"},"RawSearchRequest":{"properties":{"q":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q","description":"Optional full text query to match within raw blocks. Quotes are ignored for the length check. When omitted or empty, you must provide at least one filter among container_id, exts, categories, file_name."},"container_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Container Id","description":"Restrict the search to a specific container id."},"exts":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Exts","description":"List of file extensions to include (case-insensitive, without leading dot)."},"exts_not":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Exts Not","description":"List of file extensions to exclude (case-insensitive, without leading dot)."},"categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Categories","description":"Filter results by raw file category. Applied after the search query."},"categories_not":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Categories Not","description":"Exclude these raw file categories. Applied after the search query."},"file_name":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"File Name","description":"Case-insensitive wildcards that must match the entry name (OR by default, AND if force_and=true)."},"file_name_not":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"File Name Not","description":"Case-insensitive wildcards that must NOT match the entry name."},"folder_name":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Folder Name","description":"Case-insensitive match on the folder holding the block (OR by default, AND if force_and=true). By default the value must appear anywhere in the folder path; with folder_name_exact=true it must be a whole folder at any depth. Leading and trailing slashes are ignored."},"folder_name_not":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Folder Name Not","description":"Folders to exclude, same matching rules as folder_name. Not a standalone selector: a search using only folder_name_not is rejected, provide q or another positive filter."},"force_and":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Force And","description":"When true, require all file_name values to match, and all folder_name values to match (AND instead of OR within each list)."},"file_name_match_type":{"anyOf":[{"$ref":"#/components/schemas/RawMatchType"},{"type":"null"}],"description":"How each file_name value is matched against the entry name (case-insensitive): `contains` (default, substring), `starts_with`, `ends_with`, or `exact` (the whole name). `*` and `?` are literal in `exact` and ignored in the other modes."},"file_name_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/RawMatchType"},{"type":"null"}],"description":"How each file_name_not value is matched. Same modes as file_name_match_type, default `contains`."},"folder_name_match_type":{"anyOf":[{"$ref":"#/components/schemas/RawMatchType"},{"type":"null"}],"description":"How each folder_name value is matched against the folder path (case-insensitive): `contains` (default, substring of the path), `starts_with` (the path begins with the value), `ends_with` (the path ends with the value), or `exact` (a whole folder at any depth: 'data' matches 'a/b/data' but not 'a/b/database'; a value with slashes matches a whole run of folders)."},"folder_name_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/RawMatchType"},{"type":"null"}],"description":"How each folder_name_not value is matched. Same modes as folder_name_match_type, default `contains`."},"file_name_exact":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"File Name Exact","description":"Deprecated, use file_name_match_type and file_name_not_match_type. When true and neither is given, both file_name and file_name_not are matched as `exact`."},"folder_name_exact":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Folder Name Exact","description":"Deprecated, use folder_name_match_type and folder_name_not_match_type. When true and neither is given, both folder_name and folder_name_not are matched as `exact`."},"q_exact":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Q Exact","description":"When true, the q term must match on word boundaries: '4.4.4.4' will not match '4.4.4.400'. Applied as a content post-filter (no effect without q)."},"exclude_terms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Exclude Terms","description":"Content terms to exclude: any block whose content contains one of these (substring, case-insensitive) is removed from the results. Min 4 characters per term, max 20 terms. Not a standalone selector: a search using only exclude_terms is rejected, provide q or another positive filter."},"ingested_at_min":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ingested At Min","description":"Filter results ingested on or after this datetime (inclusive)."},"ingested_at_max":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ingested At Max","description":"Filter results ingested on or before this datetime (inclusive)."}},"type":"object","title":"RawSearchRequest","example":{"q":"example.com"}},"RawSearchResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/RawSearchItem"},"type":"array","title":"Items","description":"List of matching raw blocks."},"total":{"type":"integer","title":"Total","description":"Total number of results (-1 if using cursor mode)."},"page":{"type":"integer","title":"Page","description":"Requested page index (1-based)."},"page_size":{"type":"integer","title":"Page Size","description":"Maximum number of items returned in this page."},"has_more":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has More","description":"True if more results available (cursor mode only)."},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Cursor for next page (cursor mode only)."},"blacklisted_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blacklisted Value","description":"If a filter value matched a blacklist entry, this field contains the matched value."}},"type":"object","required":["items","total","page","page_size"],"title":"RawSearchResponse"},"RawUnlockedPartItem":{"properties":{"container_id":{"type":"integer","title":"Container Id","description":"Raw file / container ID the entry belongs to."},"entry_path":{"type":"string","title":"Entry Path","description":"Path of the file entry within the container."},"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Name","description":"Source file display name (original or stored)."},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Source file category."},"first_unlocked_seq":{"type":"integer","title":"First Unlocked Seq","description":"Lowest unlocked block seq; the viewer opens here so it lands on unlocked content."},"preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview","description":"First lines of the first unlocked block (already-unlocked, no re-charge)."},"first_unlocked_at":{"type":"string","format":"date-time","title":"First Unlocked At","description":"First time a part in this entry was unlocked."},"last_unlocked_at":{"type":"string","format":"date-time","title":"Last Unlocked At","description":"Most recent unlock in this entry."}},"type":"object","required":["container_id","entry_path","first_unlocked_seq","first_unlocked_at","last_unlocked_at"],"title":"RawUnlockedPartItem"},"ResolvePathFiles":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TreeEntry"},"type":"array","title":"Items","description":"Entries included in the prefetched slice."},"total":{"type":"integer","title":"Total","description":"Total number of entries reported for the segment."},"page":{"type":"integer","title":"Page","description":"Page index of the prefetched slice."},"page_size":{"type":"integer","title":"Page Size","description":"Maximum number of entries returned in the slice."}},"type":"object","required":["items","total","page","page_size"],"title":"ResolvePathFiles"},"ResolvePathOptions":{"properties":{"prefetch_files":{"type":"boolean","title":"Prefetch Files","description":"Whether the resolver should prefetch the first page of files for each segment.","default":true},"max_subfolders":{"type":"integer","maximum":100000.0,"minimum":1.0,"title":"Max Subfolders","description":"Maximum number of subfolders to fetch per segment.","default":1000},"file_page_size":{"type":"integer","maximum":1000.0,"minimum":1.0,"title":"File Page Size","description":"Page size used when prefetching files for each segment.","default":200},"prefetch_parts":{"anyOf":[{"$ref":"#/components/schemas/ResolvePathPrefetchParts"},{"type":"null"}],"description":"Optional window of parts to prefetch for the resolved file."}},"type":"object","title":"ResolvePathOptions"},"ResolvePathPrefetchParts":{"properties":{"seq":{"type":"integer","minimum":0.0,"title":"Seq","description":"Sequence number to centre the prefetched window around."},"limit":{"anyOf":[{"type":"integer","maximum":1000.0,"minimum":1.0},{"type":"null"}],"title":"Limit","description":"Number of parts to retrieve around the target sequence."}},"type":"object","required":["seq"],"title":"ResolvePathPrefetchParts"},"ResolvePathRequest":{"properties":{"container_id":{"type":"integer","minimum":1.0,"title":"Container Id","description":"Identifier of the container that owns the entry."},"entry_path":{"type":"string","title":"Entry Path","description":"Entry path to resolve from the root of the container.","default":""},"options":{"anyOf":[{"$ref":"#/components/schemas/ResolvePathOptions"},{"type":"null"}],"description":"Fine-grained resolver options."}},"type":"object","required":["container_id"],"title":"ResolvePathRequest","example":{"container_id":123,"entry_path":"db/users.txt"}},"ResolvePathResponse":{"properties":{"container_id":{"type":"string","title":"Container Id","description":"Identifier of the container that owns the resolved path."},"entry_path":{"type":"string","title":"Entry Path","description":"Entry path requested by the caller."},"segments":{"items":{"$ref":"#/components/schemas/ResolvePathSegment"},"type":"array","title":"Segments","description":"Ordered list of segments composing the folder chain."},"target_entry":{"anyOf":[{"$ref":"#/components/schemas/TreeEntry"},{"type":"null"}],"description":"Entry metadata for the resolved file when found."},"target_parts":{"anyOf":[{"$ref":"#/components/schemas/PartsResponse"},{"type":"null"}],"description":"Prefetched parts for the resolved file when requested."}},"type":"object","required":["container_id","entry_path","segments"],"title":"ResolvePathResponse"},"ResolvePathSegment":{"properties":{"prefix":{"type":"string","title":"Prefix","description":"Folder prefix represented by this segment."},"subfolders":{"items":{"type":"string"},"type":"array","title":"Subfolders","description":"Immediate subfolders available under the prefix."},"subfolders_truncated":{"type":"boolean","title":"Subfolders Truncated","description":"True when more subfolders are available beyond the prefetched slice.","default":false},"files":{"anyOf":[{"$ref":"#/components/schemas/ResolvePathFiles"},{"type":"null"}],"description":"Prefetched file entries located in this prefix when available."}},"type":"object","required":["prefix"],"title":"ResolvePathSegment"},"StatsResponse":{"properties":{"leaks":{"$ref":"#/components/schemas/LeaksStats"},"raw_lines":{"$ref":"#/components/schemas/LeaksStats"},"combolists":{"anyOf":[{"$ref":"#/components/schemas/LeaksStats"},{"type":"null"}],"description":"Statistics for globally deduplicated credential pairs in the dedicated Combolists dataset. Absent while that dataset is disabled."},"dark_web_posts":{"anyOf":[{"$ref":"#/components/schemas/DarkWebPostsStats"},{"type":"null"}]}},"type":"object","required":["leaks","raw_lines"],"title":"StatsResponse"},"StatsUnavailableResponse":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"StatsUnavailableResponse"},"StatusUpdateIn":{"properties":{"status":{"type":"string","title":"Status","description":"Target status: new, in_progress, fixed, accepted_risk"}},"type":"object","required":["status"],"title":"StatusUpdateIn","example":{"status":"fixed"}},"SubdomainOccurrences":{"properties":{"subdomain":{"type":"string","title":"Subdomain","description":"Subdomain value."},"occurrences":{"type":"integer","title":"Occurrences","description":"Number of leaked credentials associated with this subdomain."}},"type":"object","required":["subdomain","occurrences"],"title":"SubdomainOccurrences"},"SubfoldersResponse":{"properties":{"items":{"items":{"type":"string"},"type":"array","title":"Items","description":"List of immediate subfolders found below the prefix."},"total":{"type":"integer","title":"Total","description":"Total count of distinct immediate subfolders estimated precisely."},"page":{"type":"integer","title":"Page","description":"Requested page index (1-based)."},"page_size":{"type":"integer","title":"Page Size","description":"Page size used for the listing."},"has_more":{"type":"boolean","title":"Has More","description":"True if there are more subfolders beyond this page."},"container_id":{"type":"string","title":"Container Id","description":"Identifier of the container that was browsed."},"prefix":{"type":"string","title":"Prefix","description":"Folder prefix used for the aggregation."}},"type":"object","required":["items","total","page","page_size","has_more","container_id","prefix"],"title":"SubfoldersResponse"},"TaskStatusOut":{"properties":{"task_id":{"type":"string","title":"Task Id"},"running":{"type":"boolean","title":"Running"},"completed":{"type":"boolean","title":"Completed"},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total"},"updated":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Updated"},"version_conflicts":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version Conflicts"}},"type":"object","required":["task_id","running","completed"],"title":"TaskStatusOut","example":{"completed":true,"running":false,"task_id":"a1b2c3:UNLOCK","total":100,"updated":100,"version_conflicts":0}},"TeamInvitationActor":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","format":"email","title":"Email"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"}},"type":"object","required":["id","email"],"title":"TeamInvitationActor"},"TeamInvitationCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"role":{"type":"string","enum":["member","admin"],"title":"Role","default":"member"}},"type":"object","required":["email"],"title":"TeamInvitationCreate","example":{"email":"newmember@example.com","name":"Jane Doe","role":"member"}},"TeamInvitationResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Invitation ID."},"invited_email":{"type":"string","format":"email","title":"Invited Email","description":"Email address of the invited user."},"invited_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invited Name","description":"Name of the invited user."},"role":{"type":"string","title":"Role","description":"Assigned role: 'member' or 'admin'."},"status":{"type":"string","title":"Status","description":"Invitation status: 'pending', 'accepted', 'revoked', or 'expired'."},"expires_at":{"type":"string","format":"date-time","title":"Expires At","description":"Expiration date of the invitation."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Creation date of the invitation."},"invited_by":{"anyOf":[{"$ref":"#/components/schemas/TeamInvitationActor"},{"type":"null"}],"description":"User who sent the invitation."},"accepted_user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Accepted User Id","description":"ID of the user who accepted the invitation."},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token","description":"Invitation token (only returned on creation)."}},"type":"object","required":["id","invited_email","role","status","expires_at","created_at"],"title":"TeamInvitationResponse"},"TeamMemberResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"User ID of the team member."},"email":{"type":"string","format":"email","title":"Email","description":"Email address of the team member."},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name","description":"First name."},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name","description":"Last name."},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization","description":"Organization name."},"team_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Role","description":"Role within the team: 'member' or 'admin'."},"joined_at":{"type":"string","format":"date-time","title":"Joined At","description":"Date when the member joined the team."},"last_login":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login","description":"Last login date."},"is_owner":{"type":"boolean","title":"Is Owner","description":"Whether this member is the team owner.","default":false}},"type":"object","required":["id","email","joined_at"],"title":"TeamMemberResponse"},"TeamMemberRoleUpdate":{"properties":{"team_role":{"type":"string","enum":["member","admin"],"title":"Team Role"}},"type":"object","required":["team_role"],"title":"TeamMemberRoleUpdate","example":{"team_role":"admin"}},"TeamOverviewResponse":{"properties":{"owner":{"$ref":"#/components/schemas/TeamMemberResponse","description":"Team owner details."},"members":{"items":{"$ref":"#/components/schemas/TeamMemberResponse"},"type":"array","title":"Members","description":"Active team members."},"invitations":{"items":{"$ref":"#/components/schemas/TeamInvitationResponse"},"type":"array","title":"Invitations","description":"Pending and past invitations."},"plan":{"$ref":"#/components/schemas/TeamPlanSummary","description":"Current plan summary for the team."},"quota":{"$ref":"#/components/schemas/TeamQuotaResponse","description":"Team member quota and availability."}},"type":"object","required":["owner","members","invitations","plan","quota"],"title":"TeamOverviewResponse"},"TeamPlanSummary":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id","description":"Plan ID."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Plan name."},"team_enabled":{"type":"boolean","title":"Team Enabled","description":"Whether the plan includes team features.","default":false},"team_member_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Member Limit","description":"Maximum number of team members allowed by the plan."}},"type":"object","title":"TeamPlanSummary"},"TeamQuotaResponse":{"properties":{"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit","description":"Maximum number of team members allowed by the plan."},"members":{"type":"integer","title":"Members","description":"Current number of active team members."},"pending":{"type":"integer","title":"Pending","description":"Number of pending invitations."},"available":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Available","description":"Number of remaining seats available."}},"type":"object","required":["members","pending"],"title":"TeamQuotaResponse"},"TeamUsageMetric":{"properties":{"used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Used","description":"Current consumption, null when unreadable."},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit","description":"Plan limit, null when unlimited."},"pending":{"type":"integer","title":"Pending","description":"Pending invitations, they hold a seat.","default":0},"enabled":{"type":"boolean","title":"Enabled","description":"Whether the plan allows a team at all.","default":false}},"type":"object","title":"TeamUsageMetric"},"TransparencyAuthorityRequests":{"properties":{"received":{"type":"integer","title":"Received"},"complied_with":{"type":"integer","title":"Complied With"}},"type":"object","required":["received","complied_with"],"title":"TransparencyAuthorityRequests"},"TransparencyExclusionField":{"properties":{"field":{"type":"string","title":"Field"},"total":{"type":"integer","title":"Total"},"from_request":{"type":"integer","title":"From Request"}},"type":"object","required":["field","total","from_request"],"title":"TransparencyExclusionField"},"TransparencyExclusionRules":{"properties":{"by_field":{"items":{"$ref":"#/components/schemas/TransparencyExclusionField"},"type":"array","title":"By Field"},"total":{"type":"integer","title":"Total"},"from_request":{"type":"integer","title":"From Request"},"pattern_rules":{"type":"integer","title":"Pattern Rules"}},"type":"object","required":["by_field","total","from_request","pattern_rules"],"title":"TransparencyExclusionRules"},"TransparencyPeriod":{"properties":{"label":{"type":"string","title":"Label"},"start":{"type":"string","title":"Start"},"end":{"type":"string","title":"End"},"display":{"type":"string","title":"Display"}},"type":"object","required":["label","start","end","display"],"title":"TransparencyPeriod"},"TransparencyRemovalRequests":{"properties":{"received":{"type":"integer","title":"Received"},"approved":{"type":"integer","title":"Approved"},"rejected":{"type":"integer","title":"Rejected"},"pending":{"type":"integer","title":"Pending"},"awaiting_confirmation":{"type":"integer","title":"Awaiting Confirmation"},"expired":{"type":"integer","title":"Expired"},"from_public_form":{"type":"integer","title":"From Public Form"},"from_account":{"type":"integer","title":"From Account"}},"type":"object","required":["received","approved","rejected","pending","awaiting_confirmation","expired","from_public_form","from_account"],"title":"TransparencyRemovalRequests"},"TransparencyStatsResponse":{"properties":{"period":{"$ref":"#/components/schemas/TransparencyPeriod"},"generated_at":{"type":"string","title":"Generated At"},"exclusion_rules":{"$ref":"#/components/schemas/TransparencyExclusionRules"},"accounts_suspended":{"type":"integer","title":"Accounts Suspended"},"removal_requests":{"$ref":"#/components/schemas/TransparencyRemovalRequests"},"authority_requests":{"$ref":"#/components/schemas/TransparencyAuthorityRequests"},"data_quality_rules":{"type":"integer","title":"Data Quality Rules"},"corrupted_batches_purged":{"type":"integer","title":"Corrupted Batches Purged"},"staff_account_accesses":{"type":"integer","title":"Staff Account Accesses"}},"type":"object","required":["period","generated_at","exclusion_rules","accounts_suspended","removal_requests","authority_requests","data_quality_rules","corrupted_batches_purged","staff_account_accesses"],"title":"TransparencyStatsResponse","description":"Chiffres du rapport de transparence public.\n\n``period`` ne couvre que le dernier trimestre CLOS. Les compteurs qui n'ont\npas de date en base (règles d'exclusion, comptes suspendus) sont des cumuls\nconstatés à ``generated_at``, pas des chiffres de période: la page doit le\ndire, sinon elle laisse croire à une variation trimestrielle qui n'existe\npas."},"TreeEntry":{"properties":{"entry_path":{"type":"string","title":"Entry Path","description":"Entry path inside the container."},"entry_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entry Name","description":"Base name of the entry, when present."},"ext":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ext","description":"File extension for the entry."},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes","description":"Size of the entry in bytes, when known."},"mtime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mtime","description":"Last modification timestamp."}},"type":"object","required":["entry_path"],"title":"TreeEntry"},"URLOccurrences":{"properties":{"url":{"type":"string","title":"Url","description":"URL value."},"occurrences":{"type":"integer","title":"Occurrences","description":"Number of leaked credentials associated with this URL."}},"type":"object","required":["url","occurrences"],"title":"URLOccurrences"},"UnlockRequest":{"properties":{"leak_ids":{"items":{"type":"string","maxLength":64,"strip_whitespace":true},"type":"array","title":"Leak Ids","description":"List of leak document IDs to unlock."},"target_list_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Target List Id","description":"Optional list id to assign to newly unlocked items."}},"type":"object","required":["leak_ids"],"title":"UnlockRequest","example":{"leak_ids":["3f1a9c2b7e","8d4e0a1f6c"],"target_list_id":42}},"UnlockedAdvancedExportRequest":{"properties":{"username":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Username","description":"Username values to match."},"username_not":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Username Not","description":"Username values to exclude."},"username_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Username matching mode. Omitted means contains."},"username_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded username matching mode. Omitted means contains."},"password":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Password","description":"Password values to match."},"password_not":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Password Not","description":"Password values to exclude."},"password_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Password matching mode. Omitted means contains."},"password_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded password matching mode. Omitted means contains."},"url":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url","description":"URL values to match."},"url_not":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url Not","description":"URL values to exclude."},"url_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"URL matching mode. Omitted means contains."},"url_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded URL matching mode. Omitted means contains."},"url_domain":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url Domain","description":"URL domain values to match."},"url_domain_not":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url Domain Not","description":"URL domain values to exclude."},"url_domain_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"URL domain matching mode. Omitted means contains."},"url_domain_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded URL domain matching mode. Omitted means contains."},"url_host":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url Host","description":"URL host values to match."},"url_host_not":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url Host Not","description":"URL host values to exclude."},"url_host_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"URL host matching mode. Omitted means contains."},"url_host_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded URL host matching mode. Omitted means contains."},"username_hash":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Username Hash","description":"Username SHA-1 hash prefix (hex)."},"password_hash":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Password Hash","description":"Password SHA-1 hash prefix (hex)."},"url_scheme":{"anyOf":[{"items":{"type":"string","maxLength":20,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url Scheme","description":"URL scheme(s) to include (multi)."},"url_scheme_not":{"anyOf":[{"items":{"type":"string","maxLength":20,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url Scheme Not","description":"URL scheme(s) to exclude (multi)."},"url_port":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Url Port","description":"URL port(s) to include (multi)."},"url_port_not":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Url Port Not","description":"URL port(s) to exclude (multi)."},"url_tld":{"anyOf":[{"items":{"type":"string","maxLength":10,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url Tld","description":"URL TLD(s) to include (multi)."},"url_tld_not":{"anyOf":[{"items":{"type":"string","maxLength":10,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Url Tld Not","description":"URL TLD(s) to exclude (multi)."},"is_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Email","description":"Identifier type filter: true=email only, false=username only, null=both."},"email_domain":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Email Domain","description":"Email domain values to match."},"email_domain_not":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Email Domain Not","description":"Email domain values to exclude."},"email_domain_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Email domain matching mode. Omitted means contains."},"email_domain_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded email domain matching mode. Omitted means contains."},"email_host":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Email Host","description":"Email host values to match."},"email_host_not":{"anyOf":[{"items":{"type":"string","maxLength":100,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Email Host Not","description":"Email host values to exclude."},"email_host_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Email host matching mode. Omitted means contains."},"email_host_not_match_type":{"anyOf":[{"$ref":"#/components/schemas/AdvancedTextMatchType"},{"type":"null"}],"description":"Excluded email host matching mode. Omitted means contains."},"email_tld":{"anyOf":[{"items":{"type":"string","maxLength":10,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Email Tld","description":"Email TLD(s) to include (multi)."},"email_tld_not":{"anyOf":[{"items":{"type":"string","maxLength":10,"strip_whitespace":true},"type":"array"},{"type":"null"}],"title":"Email Tld Not","description":"Email TLD(s) to exclude (multi)."},"password_strength":{"anyOf":[{"$ref":"#/components/schemas/PasswordStrengthCategory-Input"},{"type":"null"}],"description":"Filter by password strength category. too_weak = score 0-2, weak = 3-4, medium = 5-7, strong = 8+."},"added_from":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Added From","description":"Only include leaks indexed on/after this UTC datetime."},"added_to":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Added To","description":"Only include leaks indexed on/before this UTC datetime."},"force_and":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Force And","description":"When true, require all values within each field (AND within field)."},"unlocked_at_min":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Unlocked At Min","description":"Only items unlocked at or after this instant. Needs a timezone."},"list_id":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"List Id","description":"Filter by list id."},"list_none":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"List None","description":"Only items that belong to no list."},"status":{"anyOf":[{"type":"string","enum":["new","in_progress","fixed","accepted_risk"]},{"type":"null"}],"title":"Status","description":"Remediation status filter. Omit to export every status."}},"type":"object","title":"UnlockedAdvancedExportRequest","description":"Advanced filters plus the unlocked scope, in one flat JSON body.\n\nThe route historically declared the scope keys as query parameters while\nthe app sent them in the body, where pydantic dropped them without a word.\nWidening the body model is what makes them arrive; the query parameters are\nkept so existing API callers are unaffected.\n\nIt has to be a SUBCLASS and the three fields must never move onto\n`LeakSearchFilters` itself: `has_effective_advanced_filters` iterates the\nbase class's `model_fields`, so a scope-only payload keeps being refused\nhere, and the ten other call sites of that gate (advanced unlock, full\ncorpus exports) keep their meaning.","example":{"password":["123456"],"url_domain":["example.com"]}},"UnlockedExportRequest":{"properties":{"search":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Search"},"is_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Email"},"unlocked_at_min":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Unlocked At Min"},"list_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"List Id"},"list_none":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"List None","default":false},"status":{"anyOf":[{"type":"string","enum":["new","in_progress","fixed","accepted_risk"]},{"type":"null"}],"title":"Status","description":"Remediation status filter, same values as the unlocked listing. Omit to export every status."}},"type":"object","title":"UnlockedExportRequest","example":{"is_email":true,"search":"example.com"}},"UnlockedLeakDetails":{"properties":{"id":{"type":"string","title":"Id","description":"Unique leak identifier."},"url":{"type":"string","title":"Url","description":"Source URL where the credentials were found."},"username":{"type":"string","title":"Username","description":"Leaked username or email address."},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password","description":"Leaked password (plaintext). Null when the user has enabled `hide_passwords` in their preferences."},"password_strength":{"type":"integer","title":"Password Strength","description":"Password strength raw score (integer, 0+). Categories: too_weak (0-2), weak (3-4), medium (5-7), strong (8+)."},"unlocked":{"type":"boolean","title":"Unlocked","description":"Always true for unlocked items.","default":false},"is_email":{"type":"boolean","title":"Is Email","description":"True if the username is an email address."},"added_at":{"type":"string","format":"date-time","title":"Added At","description":"Date when this leak was added to the database."},"unlocked_at":{"type":"string","format":"date-time","title":"Unlocked At","description":"Date when this item was unlocked by the current account."},"auto_unlocked":{"type":"boolean","title":"Auto Unlocked","description":"Whether this item was automatically unlocked (via auto_unlock or notification).","default":false},"auto_unlocked_by":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Unlocked By","description":"ID of the notification that triggered the auto-unlock, if applicable."},"list_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"List Id","description":"ID of the unlocked list this item is assigned to."},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment","description":"User-defined comment on this unlocked item."},"status":{"type":"string","title":"Status","description":"Remediation status: new, in_progress, fixed, accepted_risk.","default":"new"}},"type":"object","required":["id","url","username","password_strength","is_email","added_at","unlocked_at"],"title":"UnlockedLeakDetails"},"UnlockedListCreateIn":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"},"color":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Color"}},"type":"object","required":["name"],"title":"UnlockedListCreateIn","example":{"color":"#3b82f6","name":"Priority targets"}},"UnlockedListOut":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"items_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Items Count"}},"type":"object","required":["id","name","color","created_at","updated_at"],"title":"UnlockedListOut","example":{"color":"#3b82f6","created_at":"2025-01-15T10:30:00Z","id":42,"items_count":12,"name":"Priority targets","updated_at":"2025-01-15T10:30:00Z"}},"UnlockedListUpdateIn":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":80,"minLength":1},{"type":"null"}],"title":"Name"},"color":{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"null"}],"title":"Color"}},"type":"object","title":"UnlockedListUpdateIn","example":{"color":"#10b981","name":"Renamed list"}},"UsageMetric":{"properties":{"used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Used","description":"Current consumption, null when unreadable."},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit","description":"Plan limit, null when unlimited."}},"type":"object","title":"UsageMetric","description":"One plan dimension: how much of it is consumed right now.\n\n``limit = None`` means unlimited, ``used = None`` means the counter could\nnot be read right now and the UI should show \"unavailable\" rather than 0."},"UserBase":{"properties":{"id":{"type":"integer","title":"Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"},"email":{"type":"string","title":"Email"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"address_line2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line2"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"zip_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zip Code"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"tva_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tva Number"},"admin":{"type":"boolean","title":"Admin"},"is_uploader":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Uploader","default":false},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"subscription_start_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Subscription Start Date"},"subscription_end_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Subscription End Date"},"subscription_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Subscription Active"},"subscription_points":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Subscription Points"},"subscription_gb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Subscription Gb"},"extra_points":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Extra Points"},"extra_gb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Extra Gb"},"last_gb_reset":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Gb Reset"},"stripe_subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Subscription Id"},"plan_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Plan Id"},"invoices":{"items":{"$ref":"#/components/schemas/InvoiceBase"},"type":"array","title":"Invoices"},"plan":{"anyOf":[{"$ref":"#/components/schemas/PlanBase"},{"type":"null"}]},"parent_user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent User Id"},"team_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Role"},"email_confirmed":{"type":"boolean","title":"Email Confirmed"},"last_login":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login"},"last_login_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Login Ip"},"registration_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registration Ip"},"campaign_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign Code"},"register_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Register By"},"banned":{"type":"boolean","title":"Banned"},"api":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api"},"twofa_enabled":{"type":"boolean","title":"Twofa Enabled"},"twofa_pin_enabled":{"type":"boolean","title":"Twofa Pin Enabled","default":false},"twofa_totp_enabled":{"type":"boolean","title":"Twofa Totp Enabled","default":false},"has_password":{"type":"boolean","title":"Has Password","default":true},"referral_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referral Code"},"referral_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Referral Percentage"},"referral_percentage_renewal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Referral Percentage Renewal"},"last_points_reset":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Points Reset"}},"type":"object","required":["id","first_name","last_name","organization","email","address","address_line2","city","region","zip_code","country","phone","tva_number","admin","timestamp","subscription_start_date","subscription_end_date","subscription_active","subscription_points","stripe_subscription_id","plan_id","invoices","plan","email_confirmed","last_login","last_login_ip","registration_ip","campaign_code","register_by","banned","api","twofa_enabled"],"title":"UserBase"},"UserPreferencesRead":{"properties":{"hide_passwords":{"type":"boolean","title":"Hide Passwords","description":"When true, plaintext passwords are redacted from search results, the unlocked-leaks list, and exports on email/domain/advanced scopes.","default":false}},"type":"object","title":"UserPreferencesRead"},"UserPreferencesUpdate":{"properties":{"hide_passwords":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hide Passwords","description":"Toggle password redaction. Omit to leave unchanged."}},"type":"object","title":"UserPreferencesUpdate","example":{"hide_passwords":true}},"UserTaskItem":{"properties":{"id":{"type":"integer","title":"Id","description":"Task ID."},"kind":{"type":"string","title":"Kind","description":"Task type (e.g. unlock, export)."},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope","description":"Scope of the task (e.g. email, domain, advanced)."},"status":{"type":"string","title":"Status","description":"Task status: pending, running, completed, or failed."},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total","description":"Total number of items to process."},"updated":{"type":"integer","title":"Updated","description":"Number of items processed so far."},"points_charged":{"type":"integer","title":"Points Charged","description":"Total points charged for this task."},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Error message if the task failed."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Date when the task was created."},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At","description":"Date when the task started processing."},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At","description":"Date when the task finished."}},"type":"object","required":["id","kind","status","updated","points_charged","created_at"],"title":"UserTaskItem"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"ValidationErrorDetail":{"properties":{"loc":{"items":{"type":"string"},"type":"array","title":"Loc"},"msg":{"type":"string","title":"Msg"},"type":{"type":"string","title":"Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationErrorDetail"},"WebhookCustomHeader":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name","description":"HTTP header name.","strip_whitespace":true},"value":{"type":"string","maxLength":500,"title":"Value","description":"HTTP header value.","strip_whitespace":true}},"additionalProperties":false,"type":"object","required":["name","value"],"title":"WebhookCustomHeader"},"WebhookHeaderOut":{"properties":{"name":{"type":"string","title":"Name"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"}},"type":"object","required":["name"],"title":"WebhookHeaderOut"}},"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"tags":[{"name":"Search Email","description":"Search leaked credentials by email address or username."},{"name":"Search Domain","description":"Search leaked credentials by domain. Includes employees, customers, third-parties, subdomains, and URLs."},{"name":"Search Advanced","description":"Search leaked credentials with advanced multi-field filters (username, password, URL, email domain, etc.)."},{"name":"Raw Search","description":"Full-text search across raw leak files and stealer logs. Browse containers, parts, and download files."},{"name":"Search Combolists","description":"Search the Combolists dataset: `email:password` and `username:password` pairs parsed from public leak files. It is a separate index from stealer logs, so a credential found here does not appear in Email / Domain / Advanced search, and unlocked records live in their own space (see **Unlocked Combolists**). Records carry no URL: a pair is an identifier plus a password, with the email domain when the identifier is an email address."},{"name":"Unlocked Combolists","description":"List, annotate and export the Combolist credentials you have unlocked. Kept separate from **Unlocked Leaks** (stealer logs) at every level: different endpoints, different storage, different exports. Lists created under `/profile/unlocked/lists` are shared between both datasets."},{"name":"Dark Web Search","description":"Search dark web forum posts and mentions."},{"name":"Notifications","description":"Create and manage leak monitoring notifications. Supports email, Slack, Telegram, Discord, and webhook delivery."},{"name":"Notifications Runs","description":"View notification run history and results. Unlock or export items discovered by a notification run."},{"name":"Unlocked Leaks","description":"List and manage your previously unlocked leak records."},{"name":"Unlocked Leaks Lists","description":"Organize unlocked leaks into custom lists."},{"name":"Exports","description":"List and download your export jobs (CSV, TXT, JSON)."},{"name":"Profile","description":"View and update your user profile."},{"name":"Profile Downloads","description":"List and download your raw file downloads."},{"name":"Team","description":"Manage your team: invite members, update roles, and remove members."}],"security":[{"BearerAuth":[]}],"servers":[{"url":"https://api.leakradar.io","description":"Production API"}]}