For agents & integrations
Machine API
Everything the human site shows, as stable JSON. CORS open. No key. Updated every research run.
| Endpoint | Returns |
|---|---|
| /api/v1/top.json | Top opportunities by attention (decision-ranked) |
| /api/v1/opportunities.json | Every opportunity with full computed record |
| /api/v1/opportunities/<slug>.json | One opportunity, full computed record |
| /api/v1/changes.json | Diff vs previous snapshot: added events + changed fields |
| /rss.xml | Every opportunity with full computed record |
| /sitemap.xml | All page URLs |
Field dictionary (22 fields)
| Field | Type | Description |
|---|---|---|
| slug | string | stable URL id; /opps/<slug> |
| title | string | event name from source platform |
| organizer | string|null | hosting org; null when platform hides it |
| prize_usd | number|null | raw USD parsed from platform card |
| prize | object (USD) | advertised_value|cash_value|credits_value|normalized_value|headline_inflation (%) |
| registrants | int|null | platform registration count |
| field | object | field_status(usable|forming), family_prior{submissions_per_registration,source}, estimated_serious_field P50, field_p10/p50/p90 |
| metrics | object | equal_share_naive $/registrant, fair_share_serious $/est.submission, days_left |
| score_v01 | object | components{expected_prize_value,winnability,organizer_quality} 0-100, known_components, opportunity_score |
| payout | object (USD/%) | paying_slots assumption p10/p50/p90, baseline_any_payout, p_paid sigmoid, ev_cash_heuristic USD |
| decision | object | action ENTER NOW|SPRINT|PREP|WATCH|SKIP|ENDED, reason, feasibility 0-1, feasibility_label, latest_safe_start YYYY-MM-DD, p_finish_proxy, build_model{p50_hours,p80_hours,hours_per_day,buffer_days,reuse_fraction} |
| mega | object|null | outlier flag {score,reasons[],category}; null = not unusual |
| cautions | string[] | verification warnings (unconfirmed cash, thin-field outliers, TBA prizes) |
| eligibility | object | eligible bool, failed[], confidence official_rules|platform_metadata_unverified, notes; gates{} incl age_confirmed UNKNOWN semantics |
| themes | string[] | category tags from platform |
| location_type | enum | online | in-person (in-person events are gated OUT of rankings) |
| starts_at | ISO date|null | submission window open |
| ends_at | ISO date|null | deadline; drives feasibility prior |
| source_url | url | OFFICIAL event page - always verify before committing |
| source | enum | devpost | brabble |
| source_authority | enum | official_platform_api | platform_metadata_unverified |
| observed_at | ISO datetime | when facts were captured |
Conventions
- Unknown = null. Never inferred. A null prize means we could not verify one — not that it is free.
- Decision states: ENTER NOW → SPRINT → PREP → WATCH → SKIP (+ ENDED). Each record carries the reason.
- Assumptions are embedded: payout.paying_slots and decision.build_model ship inside every record so you can see what was assumed.
- official source_url always included — verify there before committing hours.
- If you build on this API, credit hackathonhelp.pages.dev and link back.