"""KnowFirm Python SDK (starter, stdlib-only — no dependencies). Generated to mirror sdk/typescript/knowfirm.ts; finalize/publish via the `api-sdk-client-generation` skill (typed models, retries, pagination). import os from knowfirm import KnowFirm kf = KnowFirm(api_key=os.environ["KNOWFIRM_KEY"]) biz = kf.business(name="bank of america") # -> dict | None hits = kf.screening(name="Example Trading Co") # -> dict """ from __future__ import annotations import json import urllib.error import urllib.parse import urllib.request from typing import Any, Optional class KnowFirmError(Exception): def __init__(self, status: int, body: Any) -> None: super().__init__(f"KnowFirm API error {status}") self.status = status self.body = body class KnowFirm: def __init__(self, api_key: str, base_url: str = "https://api.knowfirm.com") -> None: self.api_key = api_key self.base_url = base_url.rstrip("/") def _request(self, method: str, path: str, query: Optional[dict] = None, body: Any = None) -> Any: url = self.base_url + path if query: params = {k: v for k, v in query.items() if v is not None} if params: url += "?" + urllib.parse.urlencode(params) data = json.dumps(body).encode() if body is not None else None req = urllib.request.Request(url, data=data, method=method) req.add_header("X-API-Key", self.api_key) if data is not None: req.add_header("Content-Type", "application/json") try: with urllib.request.urlopen(req) as resp: return json.loads(resp.read().decode()) except urllib.error.HTTPError as e: if e.code == 404: return None payload: Any = None try: payload = json.loads(e.read().decode()) except Exception: pass raise KnowFirmError(e.code, payload) def health(self) -> Any: return self._request("GET", "/v1/health") def business(self, ein=None, lei=None, cik=None, cert=None, ticker=None, name=None) -> Optional[dict]: """Resolve one business by EIN, LEI, CIK, FDIC cert, ticker, or name. Returns None on no match.""" return self._request( "GET", "/v1/business", query={"ein": ein, "lei": lei, "cik": cik, "cert": cert, "ticker": ticker, "name": name}, ) def search(self, q: str, limit: int = 10) -> list: return self._request("GET", "/v1/business/search", query={"q": q, "limit": limit}) def screening(self, name: str, country=None, address=None) -> dict: return self._request("POST", "/v1/screening", body={"name": name, "country": country, "address": address}) def enrich(self, items: list) -> dict: return self._request("POST", "/v1/enrich", body={"items": items})