Saltar para a documentação
Python

Paginação

`list` para uma página, `list_all` para todas as páginas e `iterate` para um item de cada vez.

Uma página: 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']

Uma página é {'items': [...], 'hasMore': ..., 'nextCursor': ...}. Passe nextCursor de volta como cursor=, com os mesmos filtros, para obter a página seguinte.

nextCursor é None na última página, e hasMore diz se há mais linhas que correspondem além desta. Em openemail.types uma página é Page[T], por isso emails.list devolve um Page[EmailResource] e um verificador de tipos sabe o que cada item contém.

A API pagina as conversas e os rascunhos com um pageToken. O cliente entrega-lho como nextCursor e recebe-o de volta como cursor=, tal como em todas as outras listagens, e list_all e iterate seguem-no por si. É opaco: devolva o que lhe foi dado e nunca construa um.

Todas as páginas: 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 segue nextCursor até à última página e devolve uma única list. Todas as páginas são obtidas antes de devolver o resultado, por isso dê-lhe um filtro que termine.

addresses.list_all é o único que devolve outra coisa: o livro de endereços completo, {'unrestricted': ..., 'addresses': [...], 'domains': [...]}, com os endereços de todas as páginas lá dentro.

Um de cada vez: 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 devolve um gerador. Chamá-lo não envia nada: a primeira página é obtida quando o ciclo pede o primeiro item, e cada página seguinte só quando o ciclo chega ao fim da anterior. Sair do ciclo, ou tirar uma fatia com itertools.islice, interrompe os pedidos.

limit= em list_all e iterate é o tamanho de cada página que obtêm, não um limite de quantos itens recebe, por isso um limit maior significa menos pedidos. cursor= começa o percurso a partir de uma página que já tem. Ambos param quando hasMore é falso ou nextCursor é None, e também quando uma página indica o cursor que a obteve, por isso uma página com mau comportamento não pode provocar um ciclo infinito.

Listas dentro de um espaço de nomes

list_all e iterate paginam o mesmo endpoint que o list ao lado deles, e o mesmo fazem os outros pares com o nome da lista que percorrem. Cada par aceita os mesmos filtros que a sua lista.

Espaço de nomesUma páginaTodas as páginasUm de cada vez
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

Páginas que trazem mais

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']))

Algumas listas trazem mais do que uma página. contacts.list_people acrescenta seen ao lado de items, hasMore e nextCursor, temp_mail.list_messages acrescenta expiresAt, e addresses.list devolve addresses em vez de items, ao lado de unrestricted, domains, hasMore e nextCursor. Ainda assim, cada uma continua com cursor= e percorre-se com o seu list_all e o seu iterate.

Duas listas paginam de outra forma. templates.list_sends conta páginas: passe page= e page_size=, e leia total, page e pageSize ao lado de items. imports.list_failures fica tal como a API a envia, {'object': 'list', 'data': [...], 'nextCursor': ...}, e continua com after=, o número que está em nextCursor. Nenhuma das duas tem list_all nem iterate.

Tamanhos de página

A maioria das listas aceita um limit= de 1 a 100, com 25 por omissão, os dois números de PAGE_LIMITS (PAGE_LIMITS.MAX_LIMIT e PAGE_LIMITS.DEFAULT_LIMIT). contacts.list, audiences.list_contacts, broadcasts.list_recipients e as listas de tracking aceitam até 200 com 50 por omissão, e temp_mail.list_messages aceita até 50. Um valor fora do intervalo é recusado com 422 em vez de ser ajustado ao limite.

Em AsyncOpenEmail

O cliente assíncrono pagina da mesma forma. list e list_all são chamados com await, e iterate devolve um iterador assíncrono que percorre com async for, sem await antes da chamada.

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())