Skip to main content

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)

Source distribution for osintverse 0.2.0
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)

Table of built distributions (wheels) for osintverse 0.2.0
File Interpreter ABI Platform Actions
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 log

Release 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 log

Security 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.

Select from 2 files

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 log

A 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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page