Cómo paginar una API REST en Power Automate: paso a paso
Muchas APIs REST devuelven los datos en páginas: 100 registros cada vez, más un puntero a la página siguiente. Si el flujo solo lee la primera respuesta, se queda con una fracción de los datos. Paginar una API REST en Power Automate lo resuelve con un patrón simple y reutilizable: un bucle Do until alrededor de una acción HTTP, que repite la llamada hasta que deja de existir página siguiente.
Requisitos previos
- Una licencia que incluya conectores premium (la acción HTTP es premium).
- Una API REST que devuelva JSON e indique cómo llegar a la página siguiente: un enlace (
next), un cursor o un número de página. - La clave o el token de autenticación de la API.
- Nociones básicas de expresiones:
body(),variables(),empty(),coalesce().
Paso 1: Crear el flujo e inicializar las variables
Cree un flujo programado (o instantáneo, para probar) y añada dos acciones Inicializar variable. Una guarda la URL de la página siguiente; la otra acumula los registros recogidos.
Nombre: NextUrl Tipo: String Valor: https://api.ejemplo.com/v1/clientes?limit=100
Nombre: Results Tipo: Array Valor: (dejar vacío)
El truco está en NextUrl: empieza con la URL de la primera página y, al final de cada vuelta, pasa a contener la URL de la siguiente — o queda vacía cuando ya no hay nada más que leer. Esa variable gobierna todo el bucle.
Paso 2: Añadir el bucle Do until
Añada la acción Do until. La condición de salida comprueba si NextUrl se ha quedado vacía. Cambie el campo de la izquierda a modo expresión y escriba:
empty(variables('NextUrl')) es igual a true
Mientras haya una URL, el bucle se repite. En cuanto la variable quede vacía, el flujo sale del bucle y continúa con las acciones siguientes.
Paso 3: Llamar a la API con la acción HTTP
Dentro del bucle, añada la acción HTTP. El método es GET y la URI es la propia variable — nunca una URL fija, porque entonces el flujo leería siempre la misma página.
Method: GET
URI: @{variables('NextUrl')}
Headers:
{
"Authorization": "Bearer @{variables('Token')}",
"Accept": "application/json"
}
Guarde el token en una variable (o, mejor aún, en Azure Key Vault) en lugar de escribirlo a mano en la acción.
Paso 4: Acumular los registros de cada página
La respuesta solo trae los registros de esa página, así que hay que ir juntándolos. Añada un Apply to each sobre la lista devuelta y, dentro, la acción Anexar a la variable de matriz.
Apply to each → Seleccionar una salida: body('HTTP')?['data']
Anexar a la variable de matriz
Nombre: Results
Valor: items('Apply_to_each')
Sustituya data por el nombre real del campo en su API (es habitual items, results o value). Deje desactivado el control de simultaneidad del Apply to each: las escrituras en paralelo sobre la misma variable pueden perder registros.
Paso 5: Actualizar la URL de la página siguiente
Todavía dentro del bucle, después del Apply to each, añada Establecer variable sobre NextUrl. Si la API devuelve un enlace a la página siguiente, use coalesce() para tratar el caso en que ese campo sencillamente no llega en la última página:
coalesce(body('HTTP')?['next'], '')
Si la API usa número de página en vez de enlace, la regla pasa a ser: continuar mientras la página traiga registros. Añada una variable Page (Integer, valor inicial 1), increméntela con Incrementar variable y construya la URL así:
if(
empty(body('HTTP')?['data']),
'',
concat('https://api.ejemplo.com/v1/clientes?limit=100&page=', string(variables('Page')))
)
El orden dentro del bucle importa: HTTP, luego acumular, luego incrementar la página y solo al final establecer NextUrl.
Paso 6: Proteger el bucle frente a repeticiones infinitas
Una condición mal escrita, o una API que siempre devuelve el mismo next, convierten el Do until en un bucle eterno que consume sus ejecuciones. Abra Cambiar límites en la acción Do until y defina frenos explícitos:
Count: 500 (número máximo de vueltas)
Timeout: PT1H (duración máxima, formato ISO 8601)
Con 100 registros por página, 500 vueltas cubren 50 000 registros — ajústelo al volumen real de sus datos.
Verificar el resultado
Fuera del bucle, añada una acción Compose con esta expresión y ejecute el flujo:
length(variables('Results'))
Abra el historial de ejecuciones y compare el número con el total que informa la API (muchas devuelven un campo total o count). Expanda el Do until: debería ver varias iteraciones, siendo la última aquella en la que next llega nulo o la lista llega vacía.
Dos errores típicos: si el resultado coincide exactamente con el límite de página (100 registros justos), el bucle solo se ejecutó una vez — casi seguro que la URI de la acción HTTP está fija en lugar de usar variables('NextUrl'). Si aparece un 400 Bad Request en la última vuelta, se está llamando a HTTP con la URL ya vacía: compruebe que Establecer variable es realmente la última acción del bucle.
Conclusión
Este patrón — variable de cursor, Do until, HTTP, acumular, actualizar — funciona con casi todas las APIs paginadas; solo cambian los nombres de los campos. El siguiente paso natural es guardar el array Results donde resulte útil: un archivo JSON en SharePoint, filas en Dataverse o una tabla en Azure SQL. Un consejo final: antes de automatizar nada, llame a la API dos veces a mano y mire el JSON de la respuesta — el campo que apunta a la página siguiente es el corazón de todo el flujo. ¿Cuál usa su API: next, cursor o un simple número de página?