Saltar al contenido principal
Logs en tiempo real
curl --request GET \
  --url https://api.squarecloud.app/v2/apps/{app_id}/realtime \
  --header 'Authorization: <authorization>'
import requests

url = "https://api.squarecloud.app/v2/apps/{app_id}/realtime"

headers = {"Authorization": "<authorization>"}

response = requests.get(url, headers=headers)

print(response.text)
const options = {method: 'GET', headers: {Authorization: '<authorization>'}};

fetch('https://api.squarecloud.app/v2/apps/{app_id}/realtime', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.squarecloud.app/v2/apps/{app_id}/realtime",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"net/http"
"io"
)

func main() {

url := "https://api.squarecloud.app/v2/apps/{app_id}/realtime"

req, _ := http.NewRequest("GET", url, nil)

req.Header.Add("Authorization", "<authorization>")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.get("https://api.squarecloud.app/v2/apps/{app_id}/realtime")
.header("Authorization", "<authorization>")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.squarecloud.app/v2/apps/{app_id}/realtime")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'

response = http.request(request)
puts response.read_body
{
  "status": "<string>"
}
El API Playground está deshabilitado para este endpoint debido a la naturaleza de las conexiones SSE, que no son compatibles de forma universal con los navegadores.
Authorization
string
requerido
La clave de API de tu cuenta. Puedes encontrarla en la configuración de tu cuenta.

Parámetros

app_id
string
requerido
El ID de la aplicación cuyos logs quieres monitorear. Este ID se puede encontrar en la URL del panel de administración de tu aplicación.

Respuesta

status
string
Indica si la llamada fue exitosa. success si fue exitosa, error si no.
En caso de fallo, la respuesta incluirá un campo code junto con el estado de error, detallando la causa. Si la solicitud es exitosa, la respuesta será un stream text/event-stream que contiene el feed en tiempo real de la aplicación. Cada conexión dura hasta 10 minutos. Cada cuenta puede mantener 5 conexiones concurrentes en tiempo real (REALTIME_MAX_CONNECTIONS) y cada aplicación 30 entre todos los usuarios (REALTIME_MAX_CONNECTIONS_APP); superar cualquiera de los dos devuelve 429.

Estructura de los Server-Sent Events (SSE)

La respuesta es un stream continuo en formato text/event-stream. Cada mensaje se compone de un campo event y un campo data. Las estructuras varían según el evento, así que analiza los payloads de forma defensiva.

Tipos de evento

  • system: Señales a nivel de protocolo. La línea data es un único código en mayúsculas: REALTIME_CONNECTING | <sseId> al conectar, y luego cualquiera de REALTIME_TIMEOUT, REALTIME_DISCONNECTED, REALTIME_RECONNECT o REALTIME_ERROR.
  • logs: Una única línea de log cuyo primer carácter es un byte de identificación del stream: \x01 (stdout) o \x02 (stderr). Lee data.charCodeAt(0) (1 = stdout, 2 = stderr) y luego data.slice(1) para el texto. Una línea sin ese byte de prefijo es stdout.
  • status: Métricas del contenedor en vivo como una cadena JSON, aproximadamente un frame por segundo. El primer frame de cada (re)conexión es completo: { cpu, cpuLimit, ram: [usedMB, limitMB], status, netIO: { i, o, new: { i, o } }, bIO: { i, o }, uptime } (uptime es el tiempo de inicio en ms epoch; netIO.new son bytes por segundo). Cada frame posterior es reducido, y solo contiene { cpu, ram, netIO, bIO }: combina cada uno con el último frame completo, conservando el cpuLimit, status y uptime anteriores. Mientras este stream esté abierto, prefiérelo antes que sondear GET /v2/apps/{app_id}/status, que puede estar desactualizado hasta cerca de un minuto para una aplicación con un stream en tiempo real abierto.
  • error: Contiene un código de error como CONTAINER_NOT_FOUND.
En el ejemplo de abajo, \x01 / \x02 representan los bytes de prefijo crudos de stdout / stderr.
event: system
data: REALTIME_CONNECTING | abc123-1716000000000-deadbeef

event: status
data: {"cpu":12.5,"cpuLimit":100,"ram":[128,512],"status":"running","netIO":{"i":2048,"o":4096,"new":{"i":64,"o":128}},"bIO":{"i":0,"o":0},"uptime":1716000000000}

event: status
data: {"cpu":13.1,"ram":[131,512],"netIO":{"i":2176,"o":4288,"new":{"i":72,"o":140}},"bIO":{"i":0,"o":0}}

event: logs
data: \x01Server listening on :3000

event: logs
data: \x02Error: connect ECONNREFUSED