दस्तावेज़ पर जाएँ
Python

पेजिनेशन

एक पेज के लिए `list`, हर पेज के लिए `list_all`, और एक बार में एक आइटम के लिए `iterate`।

एक पेज: list

list_page.py
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']

एक पेज {'items': [...], 'hasMore': ..., 'nextCursor': ...} होता है। उसके बाद वाले पेज के लिए nextCursor को उन्हीं फ़िल्टरों के साथ cursor= के रूप में वापस भेजें।

आख़िरी पेज पर nextCursor None होता है, और hasMore बताता है कि इस पेज के आगे और पंक्तियाँ मेल खाती हैं या नहीं। openemail.types में पेज Page[T] है, इसलिए emails.list एक Page[EmailResource] लौटाता है और type checker जानता है कि हर आइटम में क्या है।

API थ्रेड और ड्राफ़्ट को pageToken के साथ पेज करता है। क्लाइंट इसे बाकी हर सूची की तरह आपको nextCursor के रूप में देता है और cursor= के रूप में वापस लेता है, और list_all तथा iterate आपके लिए उसका अनुसरण करते हैं। यह अपारदर्शी है: जो मिला वही वापस भेजें और ख़ुद कभी न बनाएँ।

हर पेज: list_all

list_all.py
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 का अनुसरण करते हुए आख़िरी पेज तक जाता है और एक list लौटाता है। लौटने से पहले हर पेज fetch किया जाता है, इसलिए इसे ऐसा फ़िल्टर दें जो ख़त्म हो।

addresses.list_all ही अकेला है जो कुछ और लौटाता है: पूरी address book, {'unrestricted': ..., 'addresses': [...], 'domains': [...]}, जिसमें हर पेज के पते होते हैं।

एक बार में एक: iterate

iterate.py
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 एक generator लौटाता है। इसे कॉल करने से कुछ नहीं भेजा जाता: पहला पेज तब fetch होता है जब loop अपना पहला आइटम माँगता है, और उसके बाद का हर पेज तभी जब loop पिछले पेज के अंत तक पहुँचता है। loop से बाहर निकलना, या itertools.islice से एक slice लेना, अनुरोध रोक देता है।

list_all और iterate पर limit= उनके द्वारा fetch किए गए हर पेज का आकार है, न कि आपको मिलने वाले आइटम की कुल सीमा, इसलिए बड़ा limit मतलब कम अनुरोध। cursor= चलना उस पेज से शुरू करता है जो आपके पास पहले से है। दोनों तब रुकते हैं जब hasMore false हो या nextCursor None हो, और तब भी जब कोई पेज वही cursor बताए जिससे वह fetch हुआ था, ताकि ग़लत व्यवहार करने वाला पेज हमेशा के लिए loop में न घूमे।

किसी namespace के अंदर की सूचियाँ

list_all और iterate उसी endpoint से पेज-दर-पेज गुज़रते हैं जिससे उनके साथ वाला list, और यही बात उन दूसरी जोड़ियों पर भी लागू होती है जिनका नाम उस सूची पर रखा गया है जिसे वे पार करती हैं। हर जोड़ी वही फ़िल्टर लेती है जो उसकी सूची।

नेमस्पेसएक पेजहर पेजएक बार में एक
emailslist_eventslist_all_eventsiterate_events
calendarlist_eventslist_all_eventsiterate_events
templateslist_versionslist_all_versionsiterate_versions
templateslist_imageslist_all_imagesiterate_images
trackinglist_openslist_all_opensiterate_opens
trackinglist_clickslist_all_clicksiterate_clicks
ruleslist_runslist_all_runsiterate_runs
audienceslist_contactslist_all_contactsiterate_contacts
broadcastslist_recipientslist_all_recipientsiterate_recipients
contactslist_peoplelist_all_peopleiterate_people
contactslist_threadslist_all_threadsiterate_threads
domainslist_addresseslist_all_addressesiterate_addresses
formslist_submissionslist_all_submissionsiterate_submissions
memberslist_invitationslist_all_invitationsiterate_invitations
fileslist_linkslist_all_linksiterate_links
temp_maillist_messageslist_all_messagesiterate_messages
webhookslist_deliverieslist_all_deliveriesiterate_deliveries
webhookslist_workspace_deliverieslist_all_workspace_deliveriesiterate_workspace_deliveries
webhookslist_activitylist_all_activityiterate_activity
webhookslist_workspace_activitylist_all_workspace_activityiterate_workspace_activity
keyslist_requestslist_all_requestsiterate_requests
keyslist_activitylist_all_activityiterate_activity
keyslist_workspace_requestslist_all_workspace_requestsiterate_workspace_requests
keyslist_workspace_activitylist_all_workspace_activityiterate_workspace_activity

ज़्यादा जानकारी वाले पेज

other_pages.py
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']))

कुछ सूचियाँ एक पेज से ज़्यादा जानकारी लाती हैं। contacts.list_people items, hasMore और nextCursor के साथ seen जोड़ता है, temp_mail.list_messages expiresAt जोड़ता है, और addresses.list items की जगह addresses लौटाता है, unrestricted, domains, hasMore और nextCursor के साथ। हर एक फिर भी cursor= से आगे बढ़ता है और अपने list_all और iterate से पूरा पार किया जाता है।

दो सूचियाँ अलग तरह से पेज करती हैं। templates.list_sends पेज गिनता है: page= और page_size= पास करें, और items के साथ total, page और pageSize पढ़ें। imports.list_failures को वैसे ही छोड़ा गया है जैसे API भेजता है, {'object': 'list', 'data': [...], 'nextCursor': ...}, और यह after= से आगे बढ़ता है, जो nextCursor में दी गई संख्या है। दोनों में से किसी के पास list_all या iterate नहीं है।

पेज के आकार

ज़्यादातर सूचियाँ 1 से 100 तक का limit= लेती हैं और डिफ़ॉल्ट 25 होता है, यही दो संख्याएँ PAGE_LIMITS में हैं (PAGE_LIMITS.MAX_LIMIT और PAGE_LIMITS.DEFAULT_LIMIT)। contacts.list, audiences.list_contacts, broadcasts.list_recipients और tracking की सूचियाँ 200 तक लेती हैं और डिफ़ॉल्ट 50 होता है, और temp_mail.list_messages 50 तक लेता है। सीमा से बाहर का मान सीमा में खींचे जाने के बजाय 422 के साथ अस्वीकार होता है।

AsyncOpenEmail पर

एसिंक क्लाइंट भी इसी तरह पेज करता है। list और list_all को await किया जाता है, और iterate एक async iterator लौटाता है जिस पर आप async for से loop चलाते हैं, कॉल के आगे कोई await लगाए बिना।

async_pages.py
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())