import requests
from typing import Generator, Dict, Any, Optional
class SuprSonicClient:
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = "https://www.suprsonic.com/api/v1"
self.session = requests.Session()
self.session.headers.update({
"Authorization": f"Bearer {api_key}"
})
def get_articles(self, **params) -> Dict[str, Any]:
"""Get a single page of articles."""
response = self.session.get(f"{self.base_url}/articles", params=params)
response.raise_for_status()
return response.json()
def iterate_all_articles(self, **filters) -> Generator[Dict[str, Any], None, None]:
"""Iterate through all articles across all pages."""
page = 1
while True:
response = self.get_articles(page=page, limit=100, **filters)
for article in response["data"]:
yield article
if not response["meta"]["pagination"]["hasNext"]:
break
page += 1
def get_all_articles(self, **filters) -> list[Dict[str, Any]]:
"""Get all articles as a list."""
return list(self.iterate_all_articles(**filters))
# Usage
client = SuprSonicClient("your-api-key")
# Process articles one by one (memory efficient)
for article in client.iterate_all_articles(status="published"):
print(f"Processing: {article['title']}")
# Get all articles at once
all_articles = client.get_all_articles(tags="seo,marketing")
print(f"Found {len(all_articles)} articles")
# Manual pagination
response = client.get_articles(limit=20)
print(f"Page {response['meta']['pagination']['page']} of {response['meta']['pagination']['totalPages']}")