Como paginar uma API REST no Power Automate: passo a passo
Muitas APIs REST devolvem os dados em páginas: 100 registos de cada vez, mais um ponteiro para a página seguinte. Se o fluxo só ler a primeira resposta, fica com uma fração dos dados. Paginar uma API REST no Power Automate resolve isso com um padrão simples e reutilizável: um ciclo Do until à volta de uma ação HTTP, que repete a chamada até deixar de existir página seguinte.
Pré-requisitos
- Uma licença que inclua conectores premium (a ação HTTP é premium).
- Uma API REST que devolva JSON e indique como chegar à página seguinte: um link (
next), um cursor ou um número de página. - A chave ou token de autenticação da API.
- Noções básicas de expressões:
body(),variables(),empty(),coalesce().
Passo 1: Criar o fluxo e inicializar as variáveis
Crie um fluxo agendado (ou instantâneo, para testar) e adicione duas ações Inicializar variável. Uma guarda o URL da próxima página, a outra acumula os registos recolhidos.
Nome: NextUrl Tipo: String Valor: https://api.exemplo.com/v1/clientes?limit=100
Nome: Results Tipo: Array Valor: (deixar vazio)
O truque está em NextUrl: começa com o URL da primeira página e, no fim de cada volta, passa a conter o URL da seguinte — ou fica vazio quando já não há mais nada para ler. É essa variável que comanda o ciclo.
Passo 2: Adicionar o ciclo Do until
Adicione a ação Do until. A condição de paragem testa se NextUrl ficou vazio. Mude o campo da esquerda para modo de expressão e escreva:
empty(variables('NextUrl')) é igual a true
Enquanto houver um URL, o ciclo repete. Assim que a variável ficar vazia, o fluxo sai do ciclo e continua para as ações seguintes.
Passo 3: Chamar a API com a ação HTTP
Dentro do ciclo, adicione a ação HTTP. O método é GET e o URI é a própria variável — nunca um URL fixo, senão o fluxo lê sempre a mesma página.
Method: GET
URI: @{variables('NextUrl')}
Headers:
{
"Authorization": "Bearer @{variables('Token')}",
"Accept": "application/json"
}
Guarde o token numa variável (ou, melhor ainda, no Azure Key Vault) em vez de o escrever à mão na ação.
Passo 4: Acumular os registos de cada página
A resposta traz apenas os registos daquela página, por isso é preciso ir juntando tudo. Adicione um Apply to each sobre a lista devolvida e, lá dentro, a ação Anexar à variável de matriz.
Apply to each → Selecionar uma saída: body('HTTP')?['data']
Anexar à variável de matriz
Nome: Results
Valor: items('Apply_to_each')
Substitua data pelo nome real do campo na sua API (é comum ser items, results ou value). Deixe o controlo de concorrência do Apply to each desligado: escritas paralelas na mesma variável podem perder registos.
Passo 5: Atualizar o URL da página seguinte
Ainda dentro do ciclo, a seguir ao Apply to each, adicione Definir variável sobre NextUrl. Se a API devolve um link para a página seguinte, use coalesce() para tratar o caso em que esse campo simplesmente não vem na última página:
coalesce(body('HTTP')?['next'], '')
Se a API usa número de página em vez de link, a regra passa a ser: continuar enquanto a página trouxer registos. Acrescente uma variável Page (Integer, valor inicial 1), incremente-a com Incrementar variável e construa o URL assim:
if(
empty(body('HTTP')?['data']),
'',
concat('https://api.exemplo.com/v1/clientes?limit=100&page=', string(variables('Page')))
)
A ordem dentro do ciclo importa: HTTP, depois acumular, depois incrementar a página, e só no fim definir NextUrl.
Passo 6: Proteger o ciclo contra repetições infinitas
Uma condição mal escrita ou uma API que devolve sempre o mesmo next transformam o Do until num ciclo eterno que consome as suas execuções. Abra Alterar limites na ação Do until e defina travões explícitos:
Count: 500 (número máximo de voltas)
Timeout: PT1H (duração máxima, formato ISO 8601)
Com 100 registos por página, 500 voltas cobrem 50 000 registos — ajuste ao volume real dos seus dados.
Verificar o resultado
Fora do ciclo, adicione uma ação Compose com esta expressão e execute o fluxo:
length(variables('Results'))
Abra o histórico de execuções e compare o número com o total que a API reporta (muitas devolvem um campo total ou count). Expanda o Do until: deve ver várias iterações, sendo a última aquela em que next vem nulo ou a lista vem vazia.
Dois erros típicos: se o resultado for exatamente igual ao limite da página (100 registos certinhos), o ciclo só correu uma vez — quase de certeza o URI da ação HTTP está fixo em vez de usar variables('NextUrl'). Se aparecer um 400 Bad Request na última volta, o HTTP está a ser chamado com o URL já vazio: confirme que Definir variável é mesmo a última ação do ciclo.
Conclusão
Este padrão — variável de cursor, Do until, HTTP, acumular, atualizar — funciona com quase todas as APIs paginadas, mudando apenas o nome dos campos. O passo seguinte natural é guardar o array Results onde ele seja útil: um ficheiro JSON no SharePoint, linhas no Dataverse ou uma tabela no Azure SQL. Uma dica final: antes de automatizar, chame a API duas vezes à mão e olhe para o JSON da resposta — o campo que indica a página seguinte é o coração de todo o fluxo. Qual é o campo que a sua API usa: next, cursor ou um simples número de página?