curl --request GET \
--url https://api.simpl.gg/v1/servers/{instance_id}/logs \
--header 'api-key: <api-key>'import requests
url = "https://api.simpl.gg/v1/servers/{instance_id}/logs"
headers = {"api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'api-key': '<api-key>'}};
fetch('https://api.simpl.gg/v1/servers/{instance_id}/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://api.simpl.gg/v1/servers/{instance_id}/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 => [
"api-key: <api-key>"
],
]);
$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.simpl.gg/v1/servers/{instance_id}/logs"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("api-key", "<api-key>")
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.simpl.gg/v1/servers/{instance_id}/logs")
.header("api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.simpl.gg/v1/servers/{instance_id}/logs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "1041",
"timestamp": "2026-09-21T14:00:00.101000Z",
"level": "info",
"message": "Godot Engine v4.6.2.stable.official",
"continuation": false
},
{
"id": "1042",
"timestamp": "2026-09-21T14:00:00.123456Z",
"level": "info",
"message": "Server started on port 7777",
"continuation": false
}
],
"older_token": "b3wyMDI2LTA5LTIxVDE0OjAwOjAwLjEwMTAwMFp8MTA0MQ",
"retention_days": 3
}Get server logs
Cursor-paginated stdout and stderr from the game process, oldest line first. Only what the game prints: no platform lines. Lines are kept for 3 days, then deleted: download anything you want to keep. How the server ended (exit code, stop reason) is on the server’s stop fields.
If a log cap stopped storage, the response carries log_cap.
Without a cursor, returns the newest limit lines, or with since, the
first limit lines from then on. There is no follow parameter. For
live output use GET /v1/servers/{instance_id}/logs/stream.
Lines usually arrive within a few seconds of being printed, including the last lines of a server that has stopped.
curl --request GET \
--url https://api.simpl.gg/v1/servers/{instance_id}/logs \
--header 'api-key: <api-key>'import requests
url = "https://api.simpl.gg/v1/servers/{instance_id}/logs"
headers = {"api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'api-key': '<api-key>'}};
fetch('https://api.simpl.gg/v1/servers/{instance_id}/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://api.simpl.gg/v1/servers/{instance_id}/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 => [
"api-key: <api-key>"
],
]);
$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.simpl.gg/v1/servers/{instance_id}/logs"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("api-key", "<api-key>")
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.simpl.gg/v1/servers/{instance_id}/logs")
.header("api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.simpl.gg/v1/servers/{instance_id}/logs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "1041",
"timestamp": "2026-09-21T14:00:00.101000Z",
"level": "info",
"message": "Godot Engine v4.6.2.stable.official",
"continuation": false
},
{
"id": "1042",
"timestamp": "2026-09-21T14:00:00.123456Z",
"level": "info",
"message": "Server started on port 7777",
"continuation": false
}
],
"older_token": "b3wyMDI2LTA5LTIxVDE0OjAwOjAwLjEwMTAwMFp8MTA0MQ",
"retention_days": 3
}Authorizations
Per-project server key, prefixed sk_live_. Full access to every
endpoint. Keep it on your backend: never ship it in a game binary.
Path Parameters
Server instance identifier.
"abc123"
Query Parameters
Maximum number of log lines to return.
1 <= x <= 1000Only return log lines at or after this timestamp.
"2026-09-21T14:00:00Z"
Only return log lines before this timestamp.
"2026-09-21T15:00:00Z"
Only return log lines at exactly this level.
info, warn, error Case-insensitive substring filter applied to the log message. % and _
are matched literally.
200"port 7777"
Pagination cursor. Pass next_token from a previous response to page
towards newer lines, or older_token to page towards older lines.
"cursor_abc"
Response
A page of log lines.
Cursor-paginated logs, oldest line first. next_token pages towards newer
lines, older_token towards older lines. Both are absent when no more
lines exist in that direction. For live output use the SSE stream instead
of polling.
Show child attributes
Show child attributes
How many days lines are kept. Older lines are deleted and never returned.
3
"bnwyMDI2LTA5LTIxVDE0OjAwOjAwLjEyMzQ1Nlp8MTA0Mg"
"b3wyMDI2LTA5LTIxVDE0OjAwOjAwLjEyMzQ1Nlp8MTA0Mg"
Present when a log cap stopped Simpl storing this server's output within
the retention window: the server's cap (25,000 lines or 5 MiB over its
life) or the project's daily cap (250 MiB per UTC day). Lines the game
printed after at (until until, for the daily cap) were not stored.
Show child attributes
Show child attributes