All dashboard API routes are under /api/0/. Authentication is via trapfall_session cookie.
TrapFall includes Swagger UI for exploring the API interactively at /api/docs:
OpenAPI spec available at /api/docs/openapi.yaml.
First-run setup wizard. Creates admin user + default project. Only available when no users exist.
Request:
{
"email": "admin@example.com",
"name": "Admin",
"password": "secure-password"
}Response: 201 Created
{
"user": { "id": "...", "email": "...", "name": "...", "role": "admin" },
"project_slug": "default",
"dsn": "https://<key>@host/<project_id>"
}Check if setup is needed.
Response: 200 OK
{ "needs_setup": true }Request: { "email": "...", "password": "..." }
Response: 200 OK + Set-Cookie: trapfall_session=<uuid>
Response: 200 OK + clears cookie
Response: Current user info (requires auth)
Request: { "current_password": "...", "new_password": "..." }
List all projects (active + archived). Auth required.
Response field: archived_at is null for active projects, ISO timestamp for archived.
Create a project. Auth required.
Request: { "name": "My App", "slug": "my-app" } (slug optional)
Response: 201 Created
Get project detail including DSN.
Rename project. Auth required.
Request: { "name": "New Name" }
Permanently delete a project. Only works for archived projects. Returns 409 if project is still active. Cascades to all related data (events, issues, alert rules, history).
Archive a project (soft-delete). Hides from main list, still ingests events.
Unarchive a project. Restores to active list.
Regenerate DSN key. Old key is immediately revoked. Returns updated project.
List issues for a project. Supports status and level filters.
Response:
{
"data": [{ "id": "...", "title": "...", "level": "error", "count": 5, "status": "unresolved" }],
"total": 42,
"page": 1,
"per_page": 20
}Get issue detail.
Set issue status. Request: { "status": "resolved" }
Valid statuses: unresolved, resolved, ignored
List events for an issue.
Substring search across issue titles. Uses LIKE (SQLite) or ILIKE (Postgres).
Sentry-compatible envelope endpoint. DSN key auth via X-Sentry-Auth header or Authorization: Bearer <key>.
Content types: application/x-sentry-envelope, supports gzip.
Real-time updates. Cookie auth. Sends IssueCreated and IssueUpdated messages.
Request:
{
"name": "Alert on Fatal",
"conditions": { "level": "fatal" },
"action_type": "webhook",
"action_config": { "url": "https://hooks.example.com/..." }
}