Developer Page Specifications
API Contracts
GET listing/details + PATCH founder-led update + POST moderation report.
Complete
Three endpoints: listing (paginated, filterable), details, and the founder-led update endpoint (gated by ownership). Plus the moderation report endpoint (any user can flag a founder-led profile for review).
1 · GET /api/founders — listing
- Query params: q · country (csv) · sector (csv) · role (csv) · verified (bool) · flavor (all|editorial|founder-led) · sort (most-relevant|newest|alphabetical|most-mentioned) · page · pageSize · lang.
- Response: { items: FounderListItem[], totalCount, page, pageSize, filters: { applied, available }, counts: { total, verified, founderLed, editorial } }.
- FounderListItem: { id, slug, displayName, headline, role, country {code,name}, avatarUrl, isVerified, flavor, startupThumbnails[<=3], totalStartups, mentionCount }.
- Cache: public, max-age=180, s-maxage=300, stale-while-revalidate=900. Invalidate on Founder publish/update.
2 · GET /api/founders/{slug} — details
- Path: slug. Query: lang.
- Response: { ...Founder full, bio, skills[], languages[], startups[] (with role + dates), speakingHistory[], coverageMentions[], filesAuthored[], editorialArticlesAuthored[], relatedFounders[], seo {metaTitle, metaDescription, jsonLd}, isOwnerView (computed from auth) }.
- Each related-entity array capped server-side at 12; full lists available via /api/founders/{slug}/speaking?offset=12 etc.
- Cache: 300s public + 900s s-maxage. Invalidate on Founder update OR any cross-module link change touching this Founder.
3 · PATCH /api/founders/{id} — founder-led update
- Auth: required. Authorization: viewer.userId must equal Founder.OwnerUserId AND Founder.Flavor === 'founder-led'. 403 otherwise.
- Body: partial Founder fields (DisplayName, Headline, Bio, AvatarUrl, LinkedInUrl, TwitterUrl, PersonalSiteUrl, etc). Lang variant determined by ?lang param.
- Server: creates a versioned snapshot in FounderVersion table. 90-day restore window. Response: updated Founder shape + versionId.
- Rate limit: 10 PATCH/founder/hour (anti-vandalism).
4 · POST /api/founders/{id}/report — moderation flag
- Auth: optional (anonymous reports allowed for impersonation reports).
- Body: { reason: 'impersonation' | 'inaccurate' | 'offensive' | 'spam' | 'other', notes?: string }.
- Server: enqueues to admin moderation queue (§10.4). Rate-limited per IP.
