Endpoint
POST/v1/logs
Base URL: https://timberlogs-ingest.enaboapps.workers.dev
Supported Formats
The ingestion endpoint accepts logs in multiple formats. Format is resolved by priority:?format=query parameter (highest priority)Content-Typeheader- Auto-detection via content sniffing (fallback)
Request
Headers
Query Parameters
Default query parameters are useful for formats like plain text and syslog where
source and environment may not be present in the log data.
Body (JSON)
[...] or a single object {...}.
Body (JSONL)
Body (Syslog)
RFC 5424:error, warning → warn, notice/info → info, debug → debug. The APP-NAME or TAG becomes source, and HOSTNAME/PROCID are stored in data.
Body (Plain Text)
YYYY-MM-DD HH:MM:SS, MM/DD/YYYY HH:MM:SS) and level keywords (ERROR, WARN, WARNING, INFO, DEBUG, case-insensitive). Use ?source= and ?environment= query params to set required fields.
Body (CSV)
Body (OBL)
button, utterance, action, and note.
Event mapping:
- button → message:
Button: {label}, data includesspoken,button_id,board_id - utterance → message:
Utterance: {text}, data includes constituentbuttons - action → message:
Action: {action}, data includesdestination_board_id,text - note → message:
Note: {text}, data includesauthor_name
user_id maps to userId, device_id maps to sessionId, and session/event metadata is stored in data. The root source field is used as the log source. Use ?source= and ?environment= query params to set defaults. Files may start with a /* ... */ comment block which is stripped before parsing. Auto-detection works by checking for "open-board-log-" in the JSON.
Log Entry Schema
Required fields can be provided via query parameter defaults when using non-JSON formats.
Batch Limits
- Minimum: 1 log per request
- Maximum: 100 logs per request
Response
Success (200)
Error Responses
400 Bad Request - Invalid request body or parse errorissues array. Common causes: invalid level enum value, missing required fields, malformed input, or exceeding the 100-log batch limit.
401 Unauthorized - Invalid or missing API key
retryAfter seconds before retrying. Consider batching logs into fewer requests or upgrading your plan.
Examples
Basic Log (JSON)
JSONL
Syslog
Plain Text
CSV
OBL (AAC Device Logs)
Log with Data
Error Log
Batch Logs
Flow Tracking
Raw Ingestion via SDK
The TypeScript and Python SDKs provideingestRaw() / ingest_raw() methods that send pre-formatted data directly to this endpoint. The SDK handles Content-Type headers, query parameter encoding, and retry logic automatically.
Rate Limits
Rate limits depend on your plan:
When rate limited, you’ll receive a
429 response with a retryAfter value indicating when to retry.
Best Practices
- Batch logs - Send multiple logs per request to reduce overhead
- Use the SDK - The TypeScript and Python SDKs handle batching and retries automatically
- Include context - Add
userId,sessionId, andrequestIdfor correlation - Use structured data - Put details in
datarather than interpolating intomessage - Tag appropriately - Use consistent tags for filtering
- Handle errors - Implement retry logic with exponential backoff
- Use explicit formats - Prefer
?format=orContent-Typeover auto-detection for reliability - Set defaults for non-JSON formats - Use
?source=and?environment=query params when sending plain text or syslog