Official Python client for the OSINTverse SearchIn API
Official client for SearchIn on osintverse.com: one API for LeakRadar, OSINT Industries, Facecheck.id, SecurityTrails, and every other SearchIn provider. Same prepaid wallet as the UI.
pip install osintverse
Python 3.10+. Talks to https://apiv1.osintverse.com. Not affiliated with other products that reuse the OSINTverse name.
For local open-source tools on Linux, OTinstaller installs them by name (pipx install otinstaller). This client is the SearchIn API, not that installer.
Full guide: osintverse.com/docs/python
Auth
Sign in once from a terminal. It shows a code, you approve it at osintverse.com/device, and a new key is saved to the same config file the JS CLI uses (%APPDATA%\osintverse on Windows, ~/.config/osintverse elsewhere), so npx osintverse login works for both:
python -m osintverse login # --json for agents, --no-browser on servers
python -m osintverse whoami
python -m osintverse logout # forgets the saved key; revoke it in the dashboard
Or create a key at Dashboard → API keys (ov_ prefix, shown once).
from osintverse import OSINTverse
client = OSINTverse() # api_key="ov_…", else OSINTVERSE_API_KEY, else the saved key
device_login() runs the same sign-in from code.
health() and providers.list() work without a key. Search methods require one.
Quick start
from osintverse import OSINTverse
with OSINTverse() as client:
search = client.search.create(
provider="leakradar-lite",
input_type="email",
query="user@example.com",
wait=True, # poll while status is running (~2s, 120s timeout)
)
print(search.status, search.cost_usd)
print(search.result.matches if search.result else [])
Async:
from osintverse import AsyncOSINTverse
async with AsyncOSINTverse() as client:
search = await client.search.create(
provider="leakradar-lite",
input_type="email",
query="user@example.com",
wait=True,
)
Methods
| SDK | HTTP |
|---|---|
client.health() |
GET /health |
client.providers.list() |
GET /v1/providers |
client.search.quote(...) |
POST /v1/search/quote (never charges) |
client.search.create(...) |
POST /v1/search |
client.search.bulk(...) |
POST /v1/search/bulk |
client.search.retrieve(id) |
GET /v1/search/{id} |
client.search.wait(id) |
poll retrieve |
client.search.unlock(id) |
POST /v1/search/{id}/unlock |
client.search.premium(id) |
POST /v1/search/{id}/premium |
batch = client.search.bulk(
input_type="email",
queries=["alice@example.com", "bob@example.com"],
providers=["leakradar-lite", "dehashed"],
wait=True,
)
print(batch.summary)
client.search.unlock(search.id) # LeakRadar leftover credentials
client.search.premium(search.id) # OSINT Industries premium modules
Quote before you run, and stop when the wallet is short:
quote = client.search.quote(provider="leakradar-lite", input_type="email", count=2)
if not quote.sufficient_balance:
print(f"Add ${quote.shortfall_usd} at {quote.top_up_url}")
Every create sends an Idempotency-Key (a fresh UUID unless you pass idempotency_key=). Pass your own and reuse it when you retry after a timeout, and the API returns the original search instead of charging again.
wait=True on create raises SearchFailedError / SearchRefundedError if the job ends failed or refunded. Bulk wait polls running jobs and returns the batch — inspect summary for partial success (max 50 queries, 100 jobs).
This package is SearchIn lookups only. GraphIn (canvas, path, share) is the web desk.
Errors
| HTTP | Exception |
|---|---|
| 401 | AuthenticationError |
| 402 | PaymentRequiredError |
| 403 | ForbiddenError |
| 404 | NotFoundError |
| 409 | ConflictError (idempotency key reused for a different search) |
| 422 | ValidationError |
| 5xx | APIError |
Every APIError has status_code, detail, and, when the API sends them, code (for example insufficient_balance) and hint (what to do next).
Job status: failed / refunded on HTTP 200 raise SearchFailedError / SearchRefundedError when you pass wait=True on create. Poll timeout raises WaitTimeoutError.
Development
pip install -e ".[dev]"
pytest
ruff check src tests
License
MIT
Publishing
PyPI project: osintverse. GitHub Actions publishes on v* tags via Trusted Publishing (workflow publish.yml in dheerajydv19/osintverse-pythonsdk).
Bump version in pyproject.toml and VERSION in src/osintverse/_constants.py, then git tag vX.Y.Z && git push origin vX.Y.Z.
Metadata
Release files for osintverse 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| osintverse-0.2.0.tar.gz | 39.7 kB | With provenance | Details for osintverse-0.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| osintverse-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for osintverse-0.2.0-py3-none-any.whl |
Total release size: 58.8 kB
Release files / osintverse-0.2.0.tar.gz
| Download URL | osintverse-0.2.0.tar.gz |
|---|---|
| Size | 39.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7592904efec47bf5fa6c5907b097557be5718560c191c6a11166e028e06956d3
|
|
BLAKE2b-256 checksum How to use checksums |
0d510efefc6a70f868b8b2866010fbe30a00c1ee19eea07391dcaa2c9ff71268
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / osintverse-0.2.0-py3-none-any.whl
| Download URL | osintverse-0.2.0-py3-none-any.whl |
|---|---|
| Size | 19.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b891b043e52d8d98a8c8ad76fa042071f0519ce7535098f534cc60c0986d176c
|
|
BLAKE2b-256 checksum How to use checksums |
8be2d9317e663ea73ca884737a5fa3990e3ae83f408ae37c742e2e29fb0c706e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logSecurity for osintverse 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for osintverse-0.2.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.