import logging import httpx from pydantic import TypeAdapter from .models import BriteVerifyValidationList, BriteVerifyValidationResult logger = logging.getLogger(__name__) BriteVerifyValidationResultList = TypeAdapter(list[BriteVerifyValidationResult]) class BriteVerifyBulkClient: url = "https://bulk-api.briteverify.com/api/v4" def __init__(self, api_key: str) -> None: self.web_client = httpx.Client( base_url=self.url, headers={ "Authorization": f"ApiKey: {api_key}", "Content-Type": "application/json", }, timeout=httpx.Timeout(10.0, connect=5.0), ) def get_available_credits(self) -> int: response = self.web_client.get("accounts/credits") response.raise_for_status() return response.json().get("credits", 0) def create_validation_list(self, emails: list[str]) -> BriteVerifyValidationList: response = self.web_client.post( "lists", json={ "directive": "start", # Start processing immediately "contacts": [{"email": email} for email in emails], }, ) response.raise_for_status() return BriteVerifyValidationList.model_validate(response.json()["list"]) def get_validation_list_state(self, list_id: str) -> str: response = self.web_client.get(f"lists/{list_id}") response.raise_for_status() return response.json().get("state") def get_validation_list_page_count(self, list_id: str) -> int: response = self.web_client.get(f"lists/{list_id}") response.raise_for_status() return response.json().get("page_count") def get_validation_results(self, list_id: str) -> list[BriteVerifyValidationResult]: results: list[dict[str, dict[str, str | None]]] = [] validation_list_page_count = self.get_validation_list_page_count(list_id) for page in range(1, validation_list_page_count + 1): response = self.web_client.get(f"lists/{list_id}/export/{page}") response.raise_for_status() results.extend(response.json()["results"]) return BriteVerifyValidationResultList.validate_python(results)