MisarMisar Docs
MisarMailMisarBlogMisarReachMisarPostMisarDevMisarCoderMisarSEOMisar PlatformMisar SSO
SDKs

Python SDK

Install and use the misar-reach Python SDK — lead finder, SSE job streaming, deals/pipeline CRM, channels, autopilot, and the sales agent.

Official Python SDK for the MisarReach developer API — lead finder (23 sources), multi-channel outreach, deals/pipeline CRM, autopilot, and the AI sales agent. Every method has an a-prefixed async twin.

Install

pip install misar-reach

Configure

Authenticate with a reach developer key (mrk_…) against https://api.misar.io/reach/api. The key is validated only against the reach key table, so a key from another Misar product is rejected.

client.py
from misar_reach import MisarReachClient

client = MisarReachClient("mrk_your_key")   # or MisarReachClient(api_key=..., base_url=..., max_retries=5)

Lead search + SSE stream

client.leads.search() starts an async job; stream its progress over Server-Sent Events instead of polling.

job = client.leads.search({"query": "SaaS founders in Berlin", "useAI": True})

for evt in client.leads.stream_job(job["jobId"]):
    print(evt.event, evt.data)      # progress … then complete / error

leads = client.leads.list(page=1, limit=50)

Async twin:

import asyncio
from misar_reach import MisarReachClient

async def main():
    client = MisarReachClient("mrk_your_key")
    res = await client.leads.asearch({"query": "fintech CFOs"})
    async for evt in client.leads.astream_job(res["jobId"]):
        print(evt.event, evt.data)

asyncio.run(main())

Deals & pipeline

deal = client.deals.create({"leadEmail": "cto@acme.com", "value": 5000})
board = client.pipeline.get()
client.pipeline.move({"dealId": deal["id"], "stage": "interested"})

Channels

client.channels.status()
client.channels.connect("whatsapp", {"phoneNumberId": "…", "accessToken": "…"})

Resources

leads · deals · pipeline · channels · autopilot · sales_agent · campaigns · contacts · conversations · settings · workspaces · ads — full coverage of all 84 developer-API operations.

Errors

All non-2xx responses raise a subclass of ReachError:

  • ReachAuthError (401/403)
  • ReachNotFoundError (404)
  • ReachRateLimitError (429) — carries retry_after
  • ReachUpgradeRequiredError (429 with upgrade: true)
  • ReachAPIError (any other non-2xx) — carries status, code, error
  • ReachNetworkError (transport failure)

Retries with exponential backoff are automatic for 429/5xx (configurable via max_retries).

See the API Reference and SSE stream.