Sayfalama
Tek sayfa için `list`, tüm sayfalar için `list_all` ve her seferinde tek öğe için `iterate`.
Tek sayfa: list
cursor: str | None = None while True: page = client.emails.list(status='failed', limit=50, cursor=cursor) for email in page['items']: print(email['id'], email['lastError']) if not page['hasMore'] or page['nextCursor'] is None: break cursor = page['nextCursor']Bir sayfa {'items': [...], 'hasMore': ..., 'nextCursor': ...} biçimindedir. Sonraki sayfa için nextCursor değerini aynı filtrelerle cursor= olarak geri geçirin.
Son sayfada nextCursor değeri None olur ve hasMore bu sayfanın ötesinde eşleşen başka satır olup olmadığını söyler. openemail.types içinde bir sayfa Page[T] olarak tanımlıdır; bu yüzden emails.list bir Page[EmailResource] döndürür ve bir tür denetleyicisi her öğenin ne taşıdığını bilir.
API, konuşmaları ve taslakları bir pageToken ile sayfalar. İstemci bunu diğer tüm listelerde olduğu gibi size nextCursor olarak verir ve cursor= olarak geri alır; list_all ve iterate bunu sizin için izler. Opaktır: size verileni geri geçirin ve asla kendiniz oluşturmayın.
Tüm sayfalar: list_all
complaints = client.suppressions.list_all(reason='complaint')print(len(complaints), [row['email'] for row in complaints]) book = client.addresses.list_all()print(book['unrestricted'], len(book['addresses']), len(book['domains']))list_all, nextCursor değerini son sayfaya kadar izler ve tek bir list döndürür. Dönmeden önce her sayfa getirilir; bu yüzden ona sonu olan bir filtre verin.
Başka bir şey döndüren tek metot addresses.list_all'dır: her sayfanın adreslerini içeren adres defterinin tamamı, {'unrestricted': ..., 'addresses': [...], 'domains': [...]}.
Tek tek: iterate
from itertools import islice for email in client.emails.iterate(status='bounced'): if email['createdAt'] < '2026-09-01': break print(email['id'], email['lastError']) first_ten = list(islice(client.threads.iterate(folder='inbox'), 10))print([thread['id'] for thread in first_ten])iterate bir üreteç döndürür. Onu çağırmak hiçbir şey göndermez: ilk sayfa, döngü ilk öğesini istediğinde getirilir; sonraki her sayfa ise ancak döngü bir öncekinin sonuna ulaştığında. Döngüden çıkmak ya da itertools.islice ile bir dilim almak istekleri durdurur.
list_all ve iterate üzerindeki limit=, getirdikleri her sayfanın boyutudur, kaç öğe alacağınıza dair bir üst sınır değildir; bu yüzden daha büyük bir limit daha az istek demektir. cursor=, gezinmeyi zaten elinizde olan bir sayfadan başlatır. İkisi de hasMore false olduğunda ya da nextCursor None olduğunda durur; ayrıca bir sayfa kendisini getiren cursor'ı gösterdiğinde de durur, böylece hatalı davranan bir sayfa sonsuza dek döngüye giremez.
Bir ad alanının içindeki listeler
list_all ve iterate, yanlarındaki list ile aynı uç noktada sayfa sayfa ilerler; gezindikleri listenin adını taşıyan diğer çiftler de öyle. Her çift, kendi listesiyle aynı filtreleri alır.
| Ad alanı | Tek sayfa | Tüm sayfalar | Tek tek |
|---|---|---|---|
| emails | list_events | list_all_events | iterate_events |
| calendar | list_events | list_all_events | iterate_events |
| templates | list_versions | list_all_versions | iterate_versions |
| templates | list_images | list_all_images | iterate_images |
| tracking | list_opens | list_all_opens | iterate_opens |
| tracking | list_clicks | list_all_clicks | iterate_clicks |
| rules | list_runs | list_all_runs | iterate_runs |
| audiences | list_contacts | list_all_contacts | iterate_contacts |
| broadcasts | list_recipients | list_all_recipients | iterate_recipients |
| contacts | list_people | list_all_people | iterate_people |
| contacts | list_threads | list_all_threads | iterate_threads |
| domains | list_addresses | list_all_addresses | iterate_addresses |
| forms | list_submissions | list_all_submissions | iterate_submissions |
| members | list_invitations | list_all_invitations | iterate_invitations |
| files | list_links | list_all_links | iterate_links |
| temp_mail | list_messages | list_all_messages | iterate_messages |
| webhooks | list_deliveries | list_all_deliveries | iterate_deliveries |
| webhooks | list_workspace_deliveries | list_all_workspace_deliveries | iterate_workspace_deliveries |
| webhooks | list_activity | list_all_activity | iterate_activity |
| webhooks | list_workspace_activity | list_all_workspace_activity | iterate_workspace_activity |
| keys | list_requests | list_all_requests | iterate_requests |
| keys | list_activity | list_all_activity | iterate_activity |
| keys | list_workspace_requests | list_all_workspace_requests | iterate_workspace_requests |
| keys | list_workspace_activity | list_all_workspace_activity | iterate_workspace_activity |
Daha fazlasını taşıyan sayfalar
people = client.contacts.list_people(sort='recent', limit=50)print(len(people['items']), people['seen'], people['nextCursor']) sends = client.templates.list_sends('order-shipped', page=2, page_size=50)print(sends['total'], sends['page'], sends['pageSize'], len(sends['items']))Birkaç liste bir sayfadan fazlasını taşır. contacts.list_people, items, hasMore ve nextCursor yanına seen ekler; temp_mail.list_messages expiresAt ekler; addresses.list ise items yerine addresses döndürür, yanında unrestricted, domains, hasMore ve nextCursor bulunur. Her biri yine cursor= ile devam eder ve kendi list_all ve iterate metotlarıyla baştan sona gezilir.
İki liste başka bir şekilde sayfalanır. templates.list_sends sayfaları sayar: page= ve page_size= geçirin ve items yanında total, page ve pageSize değerlerini okuyun. imports.list_failures, API'nin gönderdiği gibi bırakılır, {'object': 'list', 'data': [...], 'nextCursor': ...}, ve nextCursor içindeki sayı olan after= ile devam eder. İkisinin de list_all ya da iterate metodu yoktur.
Sayfa boyutları
Çoğu liste 1 ile 100 arasında bir limit= alır ve varsayılanı 25'tir; bunlar PAGE_LIMITS içindeki iki sayıdır (PAGE_LIMITS.MAX_LIMIT ve PAGE_LIMITS.DEFAULT_LIMIT). contacts.list, audiences.list_contacts, broadcasts.list_recipients ve tracking listeleri varsayılanı 50 olmak üzere en fazla 200 alır; temp_mail.list_messages ise en fazla 50 alır. Aralığın dışındaki bir değer sınıra çekilmez, 422 ile reddedilir.
AsyncOpenEmail üzerinde
Asenkron istemci de aynı şekilde sayfalar. list ve list_all await ile çağrılır; iterate ise çağrının önüne await koymadan async for ile üzerinde döndüğünüz bir asenkron yineleyici döndürür.
import asyncio from openemail import AsyncOpenEmail async def main() -> None: async with AsyncOpenEmail() as client: page = await client.emails.list(status='failed', limit=50) print(len(page['items']), page['nextCursor']) everyone = await client.members.list_all() print(len(everyone)) async for delivery in client.webhooks.iterate_deliveries('whe_…', status='failed'): print(delivery['eventType'], delivery['responseCode']) asyncio.run(main())