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-reachConfigure
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.
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) — carriesretry_afterReachUpgradeRequiredError(429 withupgrade: true)ReachAPIError(any other non-2xx) — carriesstatus,code,errorReachNetworkError(transport failure)
Retries with exponential backoff are automatic for 429/5xx (configurable via max_retries).
See the API Reference and SSE stream.