curl --request GET \
--url https://telemetry.{region}.basaltic.sh/v1/logs \
--header 'Authorization: Bearer <token>'import requests
url = "https://telemetry.{region}.basaltic.sh/v1/logs"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://telemetry.{region}.basaltic.sh/v1/logs', 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://telemetry.{region}.basaltic.sh/v1/logs",
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: Bearer <token>"
],
]);
$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://telemetry.{region}.basaltic.sh/v1/logs"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://telemetry.{region}.basaltic.sh/v1/logs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://telemetry.{region}.basaltic.sh/v1/logs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"logs": [
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"timestamp": "2026-01-15T09:30:00Z",
"organization_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"account_id": "9b2e4d11-6c3a-4f8e-bd47-1a2b3c4d5e6f",
"log_group_id": "1d3f5a72-8b90-4c1e-a2d6-7e8f9a0b1c2d",
"log_group": "/app/prod/api",
"log_stream": "api-host-07",
"severity": "INFO",
"severity_number": 9,
"body": "request completed status=200 dur=12ms",
"attributes": {},
"resource": {},
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"span_id": "00f067aa0ba902b7"
}
],
"meta": {
"total": 150,
"limit": 20,
"marker": "550e8400-e29b-41d4-a716-446655440000",
"has_more": true
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication required",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "ACCESS_DENIED",
"message": "You don't have permission to perform this action",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "An internal error occurred",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}Buscar entradas de log
Devuelve los registros de la organización actual, más nuevos primero, con la paginación de conjunto de claves activada (marca de tiempo, id). La búsqueda de cuerpo de texto libre es una subcadena que no distingue mayúsculas de minúsculas; los filtros por atributo usan la convención de parámetro de consulta attr.<key>=<value>. from y to son obligatorios; la ventana debe ser de como máximo 31 días. Requiere telemetry:ReadLogs permiso.
curl --request GET \
--url https://telemetry.{region}.basaltic.sh/v1/logs \
--header 'Authorization: Bearer <token>'import requests
url = "https://telemetry.{region}.basaltic.sh/v1/logs"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://telemetry.{region}.basaltic.sh/v1/logs', 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://telemetry.{region}.basaltic.sh/v1/logs",
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: Bearer <token>"
],
]);
$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://telemetry.{region}.basaltic.sh/v1/logs"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://telemetry.{region}.basaltic.sh/v1/logs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://telemetry.{region}.basaltic.sh/v1/logs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"logs": [
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"timestamp": "2026-01-15T09:30:00Z",
"organization_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"account_id": "9b2e4d11-6c3a-4f8e-bd47-1a2b3c4d5e6f",
"log_group_id": "1d3f5a72-8b90-4c1e-a2d6-7e8f9a0b1c2d",
"log_group": "/app/prod/api",
"log_stream": "api-host-07",
"severity": "INFO",
"severity_number": 9,
"body": "request completed status=200 dur=12ms",
"attributes": {},
"resource": {},
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"span_id": "00f067aa0ba902b7"
}
],
"meta": {
"total": 150,
"limit": 20,
"marker": "550e8400-e29b-41d4-a716-446655440000",
"has_more": true
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication required",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "ACCESS_DENIED",
"message": "You don't have permission to perform this action",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "An internal error occurred",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}telemetry:ReadLogs. Consulte permisos de telemetría para obtener la lista completa, lo que cubre cada una y un ejemplo de directiva.Autorizaciones
Un token bearer de OAuth 2.0, enviado como Authorization: Bearer <token>. Esta es la forma recomendada de autenticación.
Obtén el token intercambiando el par de claves de acceso de una cuenta de servicio en POST /v1/oauth/token con grant_type=client_credentials. Es el flujo estándar de credenciales de cliente; las bibliotecas compatibles con OAuth pueden obtener y renovar el token por ti.
curl -s -u "$KEY_ID:$SECRET" -d grant_type=client_credentials \
https://iam.basaltic.sh/v1/oauth/token
Los tokens duran una hora por defecto. El mismo par de claves de acceso también sirve como credencial AWS SigV4 para el endpoint de objetos compatible con S3, que solo acepta ese método de autenticación.
Parámetros de consulta
Límite inferior en la marca de tiempo (inclusive)
"2026-01-15T00:00:00Z"
Limite superior en la marca de tiempo (exclusivo); debe ser después de y dentro de 31d
"2026-01-16T00:00:00Z"
Filtrar por UUID de grupo de registro, CRN o nombre exacto en la cuenta autenticada. Los CRN deben coincidir con la región de entrega y el identificador de cuenta; las referencias no válidas nunca se convierten en nombres.
"/app/prod/api"
Filtrar por nombre de flujo dentro del grupo
"api-host-07"
Filtrar a registros con severidad >= esta banda
TRACE, DEBUG, INFO, WARN, ERROR, FATAL "WARN"
Filtrar por región emisora
"sa-saopaulo-1"
Subcadena que no distingue mayúsculas de minúsculas en el cuerpo del registro
"status=200"
Filtrar a los registros que llevan este id de rastreo de W3C
"4bf92f3577b34da6a3ce929d0e0e4736"
Número máximo de artículos a devolver. Un valor por encima del máximo se le aplica en lugar de rechazarlo, por lo que una página más corta que la que solicitaste es normal — page until meta.has_more es falso, no hasta que una página se vea corta.
1 <= x <= 100Cursor de paginación opaco. Hacer eco del valor meta.marker de la página anterior para buscar la siguiente; no construirlo ni analizarlo. La forma interna del token varía según el punto final (un ID de recurso, una marca de tiempo, etc.) y no se garantiza su estabilidad entre versiones.

