generated_components table (and the
component_comments / component_ratings tables). Reads of the feed/comments/ratings are
public; everything user-owned needs a bearer token.
Saved symbols — /api/my-symbols
?page=1&limit=20 → { symbols, total, page, limit, totalPages }. Proxies
GET /api/v3/components/my (the backend components key is renamed to symbols).Body
{ symbolId, ...updates } (e.g. is_public). Proxies
PATCH /api/v3/components/generated/{symbolId}.Body
{ symbolId } → { success: true }. Proxies
DELETE /api/v3/components/generated/{symbolId}.Community feed — GET /api/community
?page=1&limit=20&q= → { symbols, total, page, limit, totalPages }. Proxies
GET /api/v3/components/community (60 s revalidate); components → symbols. Public,
generation-shared symbols only.
Comments — /api/comments
?symbolId=<id> → { comments, total }. Returns an empty list if unavailable.Body
{ component_id (or symbol_id), component_type, content (1–5000), comment_type, parent_id }.
The proxy maps symbol_id → component_id and defaults component_type to "symbol".Ratings — /api/rating
?symbolId=<id> → { up, down, total }.Body
{ symbolId, rating } where rating ∈ {1, -1} → updated { up, down, total }.
Proxies POST /api/v3/components/generated/{symbolId}/rate.type defaults to "symbol" across these endpoints, so the symbols site needs no explicit
type filter. The footprints site passes type=footprint everywhere.
