---
title: "Ingest client logs"
method: POST
path: "/api/logs"
tags: ["Logs"]
---

# Ingest client logs

`POST /api/logs`

## Request

- Base URL: `https://api.engram.page`
- URL: `https://api.engram.page/api/logs`
- Auth: HTTP bearer

## Request body

- LogIngestRequest
  - `logs` LogInput[], required
    - `category` string, nullable
    - `conn_id` string, nullable: WebSocket connection id, correlates client logs to server breadcrumbs.
    - `device_id` string, nullable: Per-install Obsidian instance id, for per-device attribution.
    - `forced` boolean, nullable: Set by the client when the entry bypassed its diagnostics gate (RemoteLogger.anomaly). Provenance, not severity: it marks a signal that reaches the whole fleet rather than only opted-in users.
    - `level` string
    - `message` string
    - `platform` string, nullable
    - `plugin_version` string, nullable
    - `stack` string, nullable
    - `ts` string, date-time, nullable

## Response `200`

Persisted count

- LogIngestResponse
  - `count` integer, required: Number of log lines persisted.
  - `ok` boolean, required

---

[API](https://skmtc.dev/engram/apis/engram-api.md) · [All operations](https://skmtc.dev/engram/apis/engram-api/llms.txt) · [OpenAPI document](https://skmtc.dev/engram/apis/engram-api/revisions/8c4c2eec29dc?raw)
