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.webhook_secret() GET /v1/webhooks/secret
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.

Webhooks

Pass callback_url to create or bulk and the API POSTs a signed event there when each search completes, fails, or is refunded, so you need not poll. The event has ids, status, and cost, never the query or results; fetch those with retrieve.

from osintverse import OSINTverse, verify_webhook

client = OSINTverse()
secret = client.search.webhook_secret()  # once; one per wallet
client.search.create(
    provider="facecheck",
    input_type="image",
    query="https://example.com/photo.jpg",
    callback_url="https://hooks.example.com/osintverse",
)

# In your web handler, with the raw body:
event = verify_webhook(secret, request.headers, request.body)  # raises WebhookVerificationError
search = client.search.retrieve(event["data"]["id"])

The URL must be public https on port 443. Events follow Standard Webhooks; details at osintverse.com/docs/api/search.

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.3.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.3.0
File Size Uploaded Provenance Actions
osintverse-0.3.0.tar.gz 41.8 kB With provenance Details for osintverse-0.3.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for osintverse 0.3.0
File Interpreter ABI Platform Actions
osintverse-0.3.0-py3-none-any.whl Python 3 none any Details for osintverse-0.3.0-py3-none-any.whl

Total release size: 62.9 kB

Release files / osintverse-0.3.0.tar.gz

Download URL osintverse-0.3.0.tar.gz
Size 41.8 kB
Tags Source
SHA-256 checksum
How to use checksums
b65e94ccb28b5c7793cf26eb7289efeb2916aa1825cb0ce54179a0b378f38768
BLAKE2b-256 checksum
How to use checksums
cea57857bb12536737f5068d30d5ca47d28f363256636328772bde884352e508
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.3.0-py3-none-any.whl

Download URL osintverse-0.3.0-py3-none-any.whl
Size 21.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
36fd2d46dec0e53b1ae54c2384bd175d4b4b5e7da1d657033f1910119ae43f49
BLAKE2b-256 checksum
How to use checksums
7decb9709fb880397ba4313dc5d03568d301aa374723eb2fb381fbad4c38c9fc
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.3.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.3.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