Spoar
Dev widget

Log stream

GET
/v2/projects/{project}/logs

Every ingest and engine decision that is not a plain accepted event: rejected events with their code and field, duplicates, rate limited requests, bot verdicts from suspect up, one line per accepted batch, job runs and the SDK's own reports. Without after the last 100 lines; with it the newer lines as soon as they arrive or an empty page after 25 seconds; Accept: text/event-stream streams them. Filter with level, kind, source, visitor and q. Lines are kept for 7 days and never hold IP addresses, emails or prop values.

Authorization

AuthorizationBearer <token>

An API token from POST /v2/tokens (at_live_...), or a project's secret key (sk_...) for server-side ingest.

In: header

Path Parameters

project*string

The project id, as listed by GET /v2/projects.

Length1 <= length

Query Parameters

level?string

Severity.

Value in

  • "info"
  • "ok"
  • "warn"
  • "error"
kind?string

What the line is about.

Value in

  • "ingest"
  • "transport"
  • "pipeline"
  • "signals"
  • "jobs"
  • "auth"
source?string

What wrote the line: sdk lines are reported by the widget build of the SDK.

Value in

  • "api"
  • "sdk"
  • "engine"
  • "cron"
visitor?string

Only lines about this visitor.

Length1 <= length <= 128
q?string

Only lines whose message contains this text.

Length1 <= length <= 200
after?string

Return lines after this cursor, waiting for new ones. Without it, the last 100 lines.

Match^[0-9]{1,19}$

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v2/projects/string/logs"
{  "data": [    {      "id": "9102",      "ts": "2026-10-03T14:02:04.117Z",      "level": "error",      "kind": "ingest",      "source": "api",      "message": "RA_INGEST_REJECTED events[3].props: Expected object with at most 25 properties",      "data": {        "code": "RA_INGEST_REJECTED",        "reason": "VALIDATION_FAILED",        "index": 3,        "event": "quote_requested",        "field": "props"      },      "visitor": "8c4e1f0a-2b3c-4d5e-8f60-718293a4b5c6",      "session": "f1a2b3c4"    }  ],  "nextCursor": "9102"}