Docs
Filtering
One list endpoint powers every timeline in your product. Combine filters to build user history pages, workspace audit trails, support views, and admin tooling from the same event source.
The list endpoint
All queries go through GET /v1/events, authenticated with your secret key (or, from the browser, a feed token — which pins actor_id to one user):
curl "https://api.softechlog.com/v1/events?actor_id=user_123&action=member.invited&limit=50" \ -H "Authorization: Bearer stl_sk_xxxxxxxxxxxx"
Available filters
| Parameter | Type | Description |
|---|---|---|
actor_id | string | Only events by this user (your external ID) |
action | string | Exact action match (member.invited), or a prefix ending in * (member.*) |
target_type | string | Only events on this resource type, e.g. workspace |
target_id | string | Only events on a specific resource |
capture_mode | manual · auto | Separate SDK-tracked events from auto-captured UI events |
session_id | string | All events in one session |
from / to | ISO 8601 datetime | Time window bounds on occurred_at |
q | string | Free-text search across action, target name/id, and actor name/email/id (case-insensitive, ≤ 200 chars) |
limit | 1–100 | Page size (default 25) |
cursor | string | Opaque cursor from the previous page's next_cursor |
Filters combine with AND semantics — every parameter you pass narrows the result.
Action prefixes & search
# Every member.* action — invited, removed, role_changed … curl "https://api.softechlog.com/v1/events?action=member.*" \ -H "Authorization: Bearer stl_sk_xxxxxxxxxxxx" # Free-text search across action, target name/id, and actor name/email/id curl "https://api.softechlog.com/v1/events?q=acme" \ -H "Authorization: Bearer stl_sk_xxxxxxxxxxxx"
Time windows
# Everything a user did last week curl "https://api.softechlog.com/v1/events?actor_id=user_123&from=2026-08-10T00:00:00Z&to=2026-08-17T00:00:00Z" \ -H "Authorization: Bearer stl_sk_xxxxxxxxxxxx"
Response & cursor pagination
Responses are newest-first and cursor-paginated. Pass next_cursor back as cursor to fetch the next page, until has_more is false:
{
"events": [
{
"id": "9b2f0f5e-4c1a-4e7b-9d3f-2a6c8e1b7f10",
"action": "member.invited",
"target_type": "workspace",
"target_id": "ws_abc",
"target_name": "Acme",
"metadata": { "role": "admin" },
"capture_mode": "manual",
"session_id": null,
"occurred_at": "2026-08-17T14:09:31.412Z",
"created_at": "2026-08-17T14:09:31.598Z",
"actor": { "id": "…", "external_id": "user_123", "name": "Ari", "email": "ari@acme.co", "avatar_url": null }
}
/* … up to `limit` events, newest first … */
],
"has_more": true,
"next_cursor": "<opaque cursor — pass back as ?cursor=>"
}Export
GET /v1/events/export?format=csv|json accepts the same filters and streams up to 10,000 matching rows as a download (Content-Disposition: attachment). It is available on every plan, needs a secret key (feed tokens can't export), and the same export is one click away in the dashboard's Events page.
# Same filters as /v1/events; up to 10,000 rows, newest first curl -o events.csv "https://api.softechlog.com/v1/events/export?format=csv&action=member.*&from=2026-08-01T00:00:00Z" \ -H "Authorization: Bearer stl_sk_xxxxxxxxxxxx"
Common recipes
- User history page:
actor_id={user}— everything one user did. - Workspace audit trail:
target_type=workspace&target_id={ws}— everything that happened to one workspace. - Security review:
action=security.*&from=…— every sensitive action across all users in a window. - Support debugging:
session_id={session}— replay exactly what a user saw and clicked in one browsing session (list sessions withGET /v1/sessions?actor_id=…). - "Find that customer":
q=acme— free-text across actors and targets when you only have a name or email.