bichito
API

Dashboard API

The endpoints under /api/v1 that back the dashboard. List, read, mutate bichitos, comments, labels, projects, teams, blocklist.

This page documents the endpoints the bichito dashboard hits with your JWT. Use them when you want to script something the dashboard already does — bulk imports, custom reporting, internal tooling.

Every endpoint requires Authorization: Bearer <jwt> (see Auth). All access is scoped to teams the JWT's user owns; foreign IDs return 404.

Bichitos

GET    /api/v1/bugs-admin                       List, with filters.
GET    /api/v1/bugs-admin/{id}                  Full detail.
PATCH  /api/v1/bugs-admin/{id}                  Update status / severity / assignee.
DELETE /api/v1/bugs-admin/{id}                  Delete (cascade).
POST   /api/v1/bugs-admin/bulk                  Bulk op on up to 500 ids.
GET    /api/v1/bugs-admin/export.csv            Stream CSV.
POST   /api/v1/bugs-admin/{id}/duplicate-of/{other_id}
DELETE /api/v1/bugs-admin/{id}/duplicate-of

GET /bugs-admin query parameters:

ParamTypeNotes
project_idintHoneycomb id.
statusenumopen/in_progress/resolved/closed/wont_fix/spam.
severityenumlow/medium/high/critical.
assignee_idint / me / none
label_idint (repeatable)AND-joined; bichito must have all listed labels.
searchstringPostgres FTS prefix-match in prod, ILIKE in dev.
limitintDefault 50, max 200.
offsetintFor pagination.

Bulk op shape:

POST /api/v1/bugs-admin/bulk
{
  "ids": [1, 2, 3],
  "operation": "set_status",   // set_status | set_severity | assign | add_label | remove_label | mark_spam | delete
  "value": "resolved"          // shape depends on operation
}

Returns { "affected": <int> }. IDs not visible to the JWT's user are silently dropped.

Comments

GET    /api/v1/bugs-admin/{id}/comments         List.
POST   /api/v1/bugs-admin/{id}/comments         Create.
PATCH  /api/v1/bugs-admin/{id}/comments/{cid}   Edit (your own only).
DELETE /api/v1/bugs-admin/{id}/comments/{cid}   Delete (your own only).

body is 1–10,000 chars. Editing a comment leaves an edited_at timestamp; deleting leaves an activity row but removes the comment row.

Labels (per-team catalogue)

GET    /api/v1/teams/{team_id}/labels           List the catalogue.
POST   /api/v1/teams/{team_id}/labels           Create. Body: { name, color }.
PATCH  /api/v1/teams/{team_id}/labels/{id}      Rename / recolor.
DELETE /api/v1/teams/{team_id}/labels/{id}      Delete (cascade detach).

POST   /api/v1/bugs-admin/{bug_id}/labels/{label_id}    Attach.
DELETE /api/v1/bugs-admin/{bug_id}/labels/{label_id}    Detach.

Color is #RRGGBB. Names are unique per team.

Projects (honeycombs)

GET    /api/v1/projects                          List the user's projects across all teams.
GET    /api/v1/projects?team_id={id}             Filter to one team.
POST   /api/v1/projects                          Create. Body: { team_id, name, description? }.
GET    /api/v1/projects/{id}                     Detail (includes the api_key).
PATCH  /api/v1/projects/{id}                     Update name / description / allowed_origins / notification_emails.

Additional API keys for a project (the multi-key surface):

GET    /api/v1/projects/{id}/api-keys            List (without plaintext).
POST   /api/v1/projects/{id}/api-keys            Mint. Body: { name }. Returns plaintext once.
PATCH  /api/v1/projects/{id}/api-keys/{key_id}   Rename.
DELETE /api/v1/projects/{id}/api-keys/{key_id}   Revoke.

Teams (hives)

GET    /api/v1/teams                             List.
GET    /api/v1/teams/{id}                        Detail.
PATCH  /api/v1/teams/{id}                        Update name / slug.
GET    /api/v1/teams/{id}/stats?range=week|month|all
                                                 Aggregate counts for the dashboard summary.

Saved views

GET    /api/v1/teams/{id}/saved-views            List the caller's views in this team.
POST   /api/v1/teams/{id}/saved-views            Create. Body: { name, filters, is_pinned? }.
PATCH  /api/v1/teams/{id}/saved-views/{view_id}  Rename / repin / refilter.
DELETE /api/v1/teams/{id}/saved-views/{view_id}

Cap of 20 per (user, team). Filters JSON shape mirrors the inbox URL — q, status, severity, assignee, project, label[]. Unknown keys are rejected.

Blocklist

GET    /api/v1/projects/{id}/blocklist           List rules.
POST   /api/v1/projects/{id}/blocklist           Create. Body: { kind, value, reason? }.
DELETE /api/v1/projects/{id}/blocklist/{rule_id} Remove.

kind is one of email, ip, user_agent, keyword. See Blocklist for matching semantics.

Webhooks

GET    /api/v1/projects/{id}/webhooks                    List.
POST   /api/v1/projects/{id}/webhooks                    Create. Body: { url, events, transform? }.
PATCH  /api/v1/projects/{id}/webhooks/{wid}              Edit.
DELETE /api/v1/projects/{id}/webhooks/{wid}              Revoke.
GET    /api/v1/projects/{id}/webhooks/{wid}/deliveries   Per-delivery log.
POST   /api/v1/projects/{id}/webhooks/{wid}/test         Send a synthetic delivery to confirm wiring.

events is a non-empty array of bug.created / bug.updated / bug.commented. transform is raw (default), slack, or discord.

OpenAPI

The full set is browsable at /docs on the API host (FastAPI auto-generates it). For prod that's bichito-api.fly.dev/docs. Useful when you want a try-it-now playground.

On this page