---
title: "An app's own output"
method: GET
path: "/client/services/{id}/logs"
tags: ["Apps"]
---

# An app's own output

`GET /client/services/{id}/logs`

## Request

- Base URL: `https://api.roar-ai.com`
- URL: `https://api.roar-ai.com/client/services/{id}/logs`
- Auth: HTTP bearer

The last tail we hold of what the app printed. `id` is a SERVICE id — take it from `services[].id` on `GET /client/apps/{appId}`, not the app id itself.

A SNAPSHOT, not a stream: `collectedAt` says when the node last sent it, and nothing collects on a schedule. To get current output, `POST` to the sibling below and read this again a second or two later.

Falls back to the last deploy's BUILD output when the app has never sent a runtime tail — `source` says which you got, and the two are different questions.

## Path parameters

- `id` string, uuid, required

## Response `200`

The tail we hold

- ServiceLogs
  - `data` string[], required: Lines, oldest first
  - `redacted` boolean, required: Always true for a key: our machine identity is stripped, so a line reads `<timestamp> <message>`
  - `source` 'runtime' | 'build' | 'none', required: `runtime` is the app's own output; `build` is the fallback for an app that has never sent one
  - `collectedAt` string, date-time, nullable, required: When the node last sent this tail. Null for build output and when we hold nothing
  - `withheld` integer, required: Lines not shown to you because the node tagged them operator-only
  - `trimmed` boolean, nullable, required: Whether BUILD output is only its end. Meaningful when `source` is `build`; null means we do not know

## Other responses

- `404`: No such app service

---

[API](https://skmtc.dev/roar-ai/apis/roar-ai-api.md) · [All operations](https://skmtc.dev/roar-ai/apis/roar-ai-api/llms.txt) · [OpenAPI document](https://skmtc.dev/roar-ai/apis/roar-ai-api/revisions/37e4d0d5a7fe?raw)
