Reference
15 routes. Secrets live only in server-side environment variables; the browser holds none. Manual refreshes are limited to one per 10 minutes. Each line says what the route does in plain words: click it for who can call it, what you send, what comes back and the safety limits.
Names of configured integrations only: secret values never leave the server.
Supabase Postgres holds investors, signals and runs.
Gemini Flash reads and judges the evidence.
A second route to the same Gemini Flash model, used only if the first fails.
Tavily finds public pages about each investor.
Fills your name and pitch into each draft. It never sends mail.
The meeting link added to every draft.
The daily report to your phone.
Starts the Monday and Thursday refresh.
Open demo mode: no passcode needed.
Health, the scheduled and manual refresh, and re-scoring.
A quick check that the app is running and which settings are in place. For each setting it says only yes or no, never the value.
curl https://vc-pipeline-intelligence.vercel.app/api/healthEvery Monday and Thursday the scheduler calls this. It picks the investors worth checking, looks for their news from the last 30 days, scores them and saves the four signal columns. Your notes are never touched.
curl -H "Authorization: Bearer $CRON_SECRET" https://vc-pipeline-intelligence.vercel.app/api/cron/refreshEvery morning the scheduler calls this. It sends you one short message: who to email first, how many follow-ups are due, and who not to chase. It reads the saved scores and changes nothing.
curl -H "Authorization: Bearer $CRON_SECRET" https://vc-pipeline-intelligence.vercel.app/api/cron/digestThe same refresh, started by you from the page. It is limited to one every 10 minutes so the free search credits last.
{ "linkedin": true } (optional; roughly doubles the search credits this run uses)curl -X POST -H "x-admin-passcode: …" https://…/api/refreshA refresh can take longer than one server run, so it hands the rest to a new run. The app calls this itself; people never do.
{ "run_id": "<uuid>", "chain": 1..50 }Recalculates every score from evidence that is already saved. It uses no search credits and no AI, and it makes older evidence fade day by day.
curl -X POST -H "Authorization: Bearer $CRON_SECRET" https://…/api/rescoreFeeds the Ctrl+K search with each investor's name, score and recommended action.
The chat box. You ask a question in plain words and Gemini Flash answers from the dashboard's own data only. If Gemini is down, you get a plain summary of the same data instead.
{ "message": "Who should I email this week?", "history"?: [{ "role": "user"|"assistant", "text": "…" }] } (message up to 500 characters, up to 6 earlier turns)curl -X POST -H "content-type: application/json" -d '{"message":"Who should I email this week?"}' https://…/api/chatThe columns a refresh can never write.
Edits only the columns that belong to you: relationship status, last contact date, contact history and personal notes. The refresh can never write these.
{ "relationship_status"?, "last_contact_date"?: "YYYY-MM-DD"|null, "add_contact"?: { date?, channel?, note }, "personal_notes"?: string|null } (strict: any other key is rejected)Add a startup, its rubric and its evaluation.
Saves a new startup and asks Gemini to draft its scoring rubric. If Gemini is down, a plain default rubric is used and labelled.
{ "name", "pitch", "sector", "stage": "pre_seed"|"seed"|"series_a"|"series_b_plus", "geography"?, "round_size"?, "ask"? }Gemini reads the evidence already collected and judges it for this startup, then fixed rules score every investor. No web search is run.
Saves your changes to a startup's rubric, or asks Gemini for a new one. Number changes re-score instantly.
{ "rubric": { ... } } or { "action": "regenerate" }Removes a startup with its rubric and scores. The shared investors and evidence stay.
Synthetic accounts only: real data is never touched.
Deletes the labelled demo investors and creates them again. Real investors are never touched.
Pretends to run a refresh on the demo accounts only: no searches, no AI, no credits.