"""Save as cheapotp_client.py. Install requests; set CHEAPOTP_API_KEY locally. Examples in main only read data. Calling rent/cancel spends/refunds real money. """ import os import uuid import requests class CheapOTP: BASE_URL = "https://cheapestotp.com/api/v1" def __init__(self, api_key): self.session = requests.Session() self.session.headers.update({"Authorization": "Bearer " + api_key}) def request(self, method, path, full_response=False, **kwargs): response = self.session.request(method, self.BASE_URL + path, timeout=(3, 30), allow_redirects=False, **kwargs) data = response.json() if not response.ok or not data.get("success"): raise RuntimeError(f"HTTP {response.status_code}: {data.get('error')} - {data.get('message')}; " f"Retry-After={response.headers.get('Retry-After', '')}") return data if full_response else data["data"] def account(self): return self.request("GET", "/account") def countries(self): return self.request("GET", "/countries") def services(self): return self.request("GET", "/services") def orders(self, status="", before_id=None): params = {"limit": 100} if status: params['status'] = status if before_id is not None: params['beforeId'] = before_id return self.request("GET", "/orders", full_response=True, params=params) def transactions(self, before_id=None): params = {"limit": 100} if before_id is not None: params['beforeId'] = before_id return self.request("GET", "/transactions", full_response=True, params=params) def rent(self, service_id, country_id, max_price_usdt=None, request_id=None): # Generate uuid.uuid4().hex ONCE per intended purchase and persist it. # After timeout/restart use the SAME request_id and SAME parameters. if not request_id: raise ValueError("A persistent request_id is required for each intended purchase") body = {"serviceId": service_id, "countryId": country_id} if max_price_usdt is not None: body["maxPriceUsdt"] = max_price_usdt return self.request("POST", "/orders", headers={"Idempotency-Key": request_id}, json=body) def order(self, order_id): return self.request("GET", f"/orders/{int(order_id)}") def cancel(self, order_id): return self.request("POST", f"/orders/{int(order_id)}/cancel") if __name__ == "__main__": client = CheapOTP(os.environ["CHEAPOTP_API_KEY"]) print(client.account()) print(client.countries()) print(client.services()) # Choose a service ID from the catalogue. # purchase_id = uuid.uuid4().hex # Persist before calling rent; never retry with a new ID. # result = client.rent(service_id, country_id, max_price_usdt, purchase_id) # Poll client.order(result['order']['id']) every 5 seconds until a terminal status.