{"openapi":"3.1.0","info":{"title":"FinDefend API","version":"0.1.0"},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"User API key minted at /app/settings (fd_…). Scopes: read (GETs), write (PATCH/POST)."}}},"paths":{"/health":{"get":{"summary":"Liveness probe","responses":{"200":{"description":"{\"ok\":true,\"commit\":<sha|null>}"}}}},"/api/v1/vendors":{"get":{"summary":"List watched vendors with cadence, amount, and next renewal (read scope)","security":{"bearerAuth":[]},"responses":{"200":{"description":"{ vendors: DashboardVendor[], total: number }"},"401":{"description":"Missing, invalid, or revoked bearer token"}}}},"/api/v1/vendors/{id}":{"patch":{"summary":"Update vendor status (active, watching, cancelled, snoozed) (write scope)","security":{"bearerAuth":[]},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Vendor ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["active","watching","cancelled","snoozed"]}},"required":["status"]}}}},"responses":{"200":{"description":"{ success: true, vendorId: string, status: string }"},"401":{"description":"Missing, invalid, or revoked bearer token"},"403":{"description":"Insufficient token scope for operation"},"404":{"description":"Resource not found or does not belong to user"},"422":{"description":"Invalid status parameter or transition"}}}},"/api/v1/alerts":{"get":{"summary":"List open spend alerts (price hikes, renewals, zombie trials) (read scope)","security":{"bearerAuth":[]},"responses":{"200":{"description":"{ alerts: DashboardAlert[] }"},"401":{"description":"Missing, invalid, or revoked bearer token"}}}},"/api/v1/alerts/{id}/acknowledge":{"post":{"summary":"Acknowledge / resolve a spend alert (write scope)","security":{"bearerAuth":[]},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Alert ID"}],"responses":{"200":{"description":"{ success: true, alertId: string, status: 'resolved' }"},"401":{"description":"Missing, invalid, or revoked bearer token"},"403":{"description":"Insufficient token scope for operation"},"404":{"description":"Resource not found or does not belong to user"}}}},"/api/v1/summary":{"get":{"summary":"Monthly burn totals and month-over-month delta (read scope)","security":{"bearerAuth":[]},"responses":{"200":{"description":"{ currentMonthBurnCents, prevMonthBurnCents, momDeltaCents, momDeltaPercent, totalVendorsCount }"},"401":{"description":"Missing, invalid, or revoked bearer token"}}}},"/api/v1/export":{"get":{"summary":"Full data export for the authenticated user (read scope)","security":{"bearerAuth":[]},"responses":{"200":{"description":"UserExportData JSON"},"401":{"description":"Missing, invalid, or revoked bearer token"}}}}}}