Skip to main content

API reference

Public endpoints

MethodPathPurpose
GET/api/healthhealth check
GET/api/metaboard metadata
GET/api/statstotals, visible jobs, stale jobs, active sources, last crawl
GET/api/jobsjob listing and filtering
GET/api/jobs/:idsingle job detail
GET/api/digest/todaytoday’s grouped digest
POST/api/subscriptionsstart a double opt-in daily digest subscription
GET/subscribe/confirm?token=...confirm a pending subscription
GET/subscribe/unsubscribe?token=...unsubscribe an active subscriber

When visibility = private, anonymous requests to /api/stats, /api/jobs, /api/jobs/:id, and /api/digest/today are blocked. /api/meta still returns enough information for the app to show the board shell and claim/sign-in flow.

/api/jobs query params

ParamMeaning
querytitle or company search
pm_focusfocus category filter
remote_statusremote, hybrid, onsite, unknown
companyexact company filter
sortnewest_seen or newest_posted
limit1–100
offsetpagination offset
include_staleset to 1 to include stale rows

Admin endpoints

POST /api/admin/run-crawl
Authorization: Bearer YOUR_ADMIN_TOKEN
GET /api/admin/notifications
Authorization: Bearer YOUR_ADMIN_TOKEN
POST /api/admin/notifications/test
Authorization: Bearer YOUR_ADMIN_TOKEN
Content-Type: application/json

{ "email": "you@example.com" }

Owner auth endpoints

POST /api/auth/claim
Authorization: Bearer YOUR_ADMIN_TOKEN
Content-Type: application/json

{ "email": "owner@example.com" }
POST /api/auth/request-link
Content-Type: application/json

{ "email": "owner@example.com" }
GET /auth/verify?token=...
POST /api/auth/logout
GET /api/me

The board can only be claimed once. After claim, the owner uses emailed magic links and session cookies for the web app. The deploy-created admin token remains available for CLI/recovery flows and bearer-protected admin APIs.

Owner workspace endpoints

MethodPathPurpose
GET/api/me/jobstracked jobs for the signed-in owner
PUT/api/me/jobs/:jobId/stateupdate favorite, status, and notes
GET/api/me/profileowner profile
PUT/api/me/profileupdate owner profile
POST/api/me/resumeupload one active PDF resume
DELETE/api/me/resumeremove the active resume

Subscription flow

  • POST /api/subscriptions accepts { "email": "reader@example.com" }
  • success responses are intentionally neutral so the public form does not leak subscriber status
  • confirmation and unsubscribe endpoints return simple HTML pages for browser use
  • only active subscribers receive scheduled daily digests

Notes

  • stale jobs are excluded from default public listings
  • /api/jobs/:id can still return stale rows
  • /api/stats exposes both visibleJobs and staleJobs
  • public subscriber email is sent only after scheduled crawls with success or partial status
  • manual admin crawls never trigger subscriber delivery
  • owner tracking state is private to the board owner
  • v1 apply flow is external handoff plus tracking, not generic in-app ATS submission