Skip to content
Reference

HTTP API

Every endpoint the dashboard (and you) can call.

The dashboard is a client of a FastAPI server on 127.0.0.1:8000. Everything it shows comes from these endpoints, and anything slow runs as a background task you can poll.

Conventions#

ConventionDetail
Interactive docsOpenAPI at http://127.0.0.1:8000/docs
Long jobsReturn {"task_id": "…"}; poll GET /api/tasks/{id} until status is done or error.
Public modeWith ZONULY_PUBLIC set, every write is refused and operator areas (replies, config, Gmail, research, tasks) are closed. /api/health stays open.
Operator keyAn X-API-Key header matching ZONULY_API_KEY lifts the public restrictions.
CORSlocalhost dev ports, the LAN, and *.vercel.app; override with ZONULY_CORS_ORIGINS.
example: fill one company and wait
TASK=$(curl -s -X POST localhost:8000/api/companies/2802/fill | jq -r .task_id)
curl -s localhost:8000/api/tasks/$TASK | jq '.status, .result.why'

Companies#

MethodPathDoes
GET/api/companiesFilter by tier, hiring, contacts; sort by priority, score, tier, pay or name
POST/api/companiesAdd a company {name, website?, ats?, ats_slug?, scrape_now}
GET/api/companies/{id}/detailEverything about one company, plus the graph’s verdict
GET/api/companies/fillingIncomplete companies and what each is missing
GET/api/companies/groupedRoles grouped by family, with referrers
POST/api/companies/{id}/fillFill one company now (task); ?auto=true skips complete / recently filled
POST/api/companies/{id}/find-contactsDiscover people (task)
POST/api/companies/{id}/find-emailsWeb addresses, then fill by pattern
POST/api/companies/{id}/verify-hiringCheck hiring proof (?fresh)
POST/api/companies/{id}/enrichRead the site and regrade (?fresh)
GET/api/companies/{id}/dossierThe research dossier (reports/<name>-dossier.md) as markdown — operator only; 404 when none is written
GET/api/networkThe company atlas

Roles#

MethodPathDoes
GET/api/jobsSearch roles: q, status, source, min_score, min_lpa, remote, sort, limit, offset
GET / PATCH/api/jobs/{id}One role / set its status
GET/api/rolesRoles by selection odds: market, band, sort
GET / POST/api/roles/{id}/briefSelection breakdown and needs brief / rebuild it

The decision brain#

MethodPathDoes
GET/api/decideThe ranked shortlist: pool=Bengaluru|Hyderabad|Remote|all, or verdict=after_dsa|skip|… for parked rows; with counts
GET/api/decide/todayToday’s company — picked on the first read of the day
POST/api/decide/today/{status}asked | skipped | filled (?note=); a skip picks the next company
GET/api/decide/company/{id}Every question, its chance and evidence, for one company
POST/api/decide/runDecide everything again (task)
POST/api/decide/outcomeRecord what happened: ?company_id=&stage=replied|referred|interview|offer|rejected|no_response
GET/api/decide/calibrationBrier score and log loss against recorded outcomes, and the reply-rate posterior

The mixer#

MethodPathDoes
GET/api/mixer/planThe free funnel, who would be bought next, the estimate and today’s Apify spend — spends nothing
POST/api/mixer/runBuy the next companies inside the mixer’s share and the referral reserve (task; ?limit=)
GET/api/mixer/historyEvery paid lookup

Upskill#

MethodPathDoes
GET/api/upskillThe gaps across the shortlist, ranked by expected offers gained, and the DSA outlook (?refresh)
POST/api/upskill/{skill}{status: todo|learning|done, proof_url, proof_note} — done needs both
POST/api/upskill/{skill}/add-to-profileAdd a done skill to profile.json, then re-score (task)

People#

MethodPathDoes
GET/api/leadsThe Leads page: source, city, who=ready|all, with_email
GET/api/contactsAll people: company_id, confidence, affiliation
POST/api/contacts/{id}/researchResearch one person

Drafts, review and sending#

MethodPathDoes
GET/api/emailsEmails by status and kind
POST/api/emails/draft · /draft-batch · /draft-betsWrite drafts (tasks)
POST/api/emails/{id}/approveApprove, optionally with an edited subject and body
POST/api/emails/{id}/rejectReject a draft
POST/api/outreach/emails/{id}/save · /unapproveSave edits / send back to review
GET/api/outreach/review/countDrafts waiting (the sidebar badge)
GET/api/outreach/pipelineStage counts, sentiment, cap, can-send
GET/api/outreach/ledgerToday’s cap, used, guessed cap, send mode
GET/api/outreach/preflightLive-send readiness
POST/api/emails/{id}/send · /send-approvedSend now, inside the cap
GET / POST/api/outreach/proposalsHow each email would be written / regenerate
GET/api/outreach/track · /thread/{id}Every email’s lifecycle / one conversation

Replies and calendar#

MethodPathDoes
GET/api/repliesReplies by sentiment
POST/api/replies/pollRead Gmail now (task)
GET/api/tracker · /api/learnSent matrix / what works
GET/api/eventsCalls, interviews, assessments
POST/api/events/{id}/confirm · /reschedule · /statusAct on an event

Lists#

MethodPathDoes
GET/api/lists · /api/lists/{key}All lists / one list (★ India includes every BLR/HYD company that clears the guardrails)
POST/api/lists/{key}/sync · /find-peopleAttach to the database / find referrers (task)

Knowledge graph#

MethodPathDoes
GET/api/graph/mapThe Graph page: view=market | pipeline | project
GET/api/kg/search · /nodes/{id} · /path · /hubsSearch, neighbours, paths, centrality
GET/api/kg/briefBRIEF.md as text
POST/api/kg/notes · /build · /composeRecord a note / rebuild / compose designs
GET/api/kg/warm/company/{id} · /similar/{id}Warm paths / similar companies

System#

MethodPathDoes
GET/api/tasks · /api/tasks/{id}Background tasks and their results
GET/api/healthLLM, matcher, scheduler and research channels
GET/api/auditLast hourly audit and 48 h of history
GET/api/overviewDashboard counts
GET / PATCH/api/configconfig.yaml with secrets stripped / write back safe sections
GET/api/models · /api/models/costsOpenRouter status and spend
GET / POST/api/gmail/*Gmail status, credentials, app password, verify, disconnect
POST/api/pipeline/scrape · score · daily …Run a pipeline stage (task)
GET/api/research/*Search, read, company research (operator only)
Note
Routers are mounted from api.py, outreach/routes.py, research/routes.py, kg/routes_warm.py and campaigns.py. See also the CLI, which reaches the same functions.