# List + fetch call recordings from a CodeB tenant. # European Digital Identity Wallet-enabled tenants use the same key surface. # [compliance-archive-cookbook 2026-07-23] # pip install requests # # Endpoints live-verified in signal.ashx: # GET signal.ashx?recordings-list=1 # GET signal.ashx?recording=&download=1 import os, sys, requests, pathlib TENANT = os.environ.get("CODEB_TENANT", "https://") API_KEY = os.environ.get("CODEB_API_KEY") OUT_DIR = pathlib.Path(os.environ.get("OUT_DIR", "./codeb-recordings")) if not API_KEY: print("CODEB_API_KEY not set", file=sys.stderr); sys.exit(2) OUT_DIR.mkdir(parents=True, exist_ok=True) sess = requests.Session() sess.headers["Authorization"] = f"Bearer {API_KEY}" def list_recordings(): r = sess.get(f"{TENANT}/signal.ashx?recordings-list=1", timeout=30) r.raise_for_status() return r.json().get("items", []) def fetch_one(call_id: str) -> pathlib.Path: url = f"{TENANT}/signal.ashx?recording={call_id}&download=1" dst = OUT_DIR / f"{call_id}.wav" with sess.get(url, timeout=120, stream=True) as r: r.raise_for_status() with dst.open("wb") as f: for chunk in r.iter_content(65536): f.write(chunk) return dst if __name__ == "__main__": items = list_recordings() print("[list]", len(items), "sidecars") for it in items: cid = it.get("callId") if not cid: continue p = fetch_one(cid) print("[fetch]", cid, "->", p)