Skip to content

API reference

jabol’s HTTP API is served by the Hono backend at /api/*. Mutating endpoints require authentication via session cookie (better-auth).

Public

MethodPathNotes
GET/api/info{ readOnly, signupOpen, hasAdmin } — boot status.
GET/api/session`{ session: { user }
GET/api/eventsServer-Sent Events. Fires links:update whenever the canonical changes.
GET/api/linksFull canonical with hidden links filtered out.
GET/api/icons/:filenameServes a cached favicon / OG image. Cache-Control: max-age=86400.
POST/api/signupOne-shot. 404s once an admin exists or env-var seeding is configured.
ANY/api/auth/*better-auth handlers (sign-in, sign-out, session refresh).

Admin (requires sign-in)

MethodPathBody / notes
GET/api/links/adminFull canonical including hidden links.
POST/api/links/admin{ categoryId, link } — add a link.
PATCH/api/links/admin/:idPartial link fields.
DELETE/api/links/admin/:idRemove a link.
PUT/api/links/adminReplace the entire canonical (used by DropZone import).
POST/api/links/admin/refresh-assetsRe-scrape favicons + OG images for every link. Returns { count }.
POST/api/categories{ name, icon? } — add a category.
PATCH/api/categories/:idPartial fields.
DELETE/api/categories/:id400 if links remain.
GET/api/adminsList admin users.
POST/api/admins{ email, password } — create an admin.
DELETE/api/admins/:idRemove. 400 on the last admin.
PATCH/api/settings{ brand?, title?, favicon? } — pass null to clear a field.
POST/api/settings/faviconMultipart file upload OR JSON { url } to fetch + cache.

curl examples

Get app info:

Terminal window
curl http://localhost:8080/api/info

Get the public canonical:

Terminal window
curl http://localhost:8080/api/links | jq

Sign in via better-auth:

Terminal window
curl -c cookies.txt -X POST http://localhost:8080/api/auth/sign-in/email \
-H 'content-type: application/json' \
-d '{"email": "admin@example.com", "password": "…"}'

Add a link (using saved cookie):

Terminal window
curl -b cookies.txt -X POST http://localhost:8080/api/links/admin \
-H 'content-type: application/json' \
-d '{
"categoryId": "<uuid>",
"link": { "name": "GitHub", "url": "https://github.com", "tags": ["dev"] }
}'

Trigger an asset refresh:

Terminal window
curl -b cookies.txt -X POST http://localhost:8080/api/links/admin/refresh-assets
# → { "count": 27 }

Subscribe to live updates (SSE):

Terminal window
curl -N http://localhost:8080/api/events
# event: links:update
# data: 1717200000000
# …