{"openapi":"3.1.0","info":{"title":"Hardware Hunter API","description":"Automated deal alerts for homelab builders. Set a hunt, we watch Slickdeals, Reddit, and eBay. You get pinged when it's a real deal.","version":"0.1.0","x-versioning":{"strategy":"header-and-url","current_version":"v2","header":"X-API-Version","supported_versions":["v1","v2"],"deprecation_policy":{"notice_period_days":90,"sunset_header":"Sunset","deprecation_header":"Deprecation","documentation":"https://hardwarehunter.io/docs/api-reference"}}},"paths":{"/account/me":{"get":{"tags":["account"],"summary":"Get account details","operationId":"get_account_account_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountResponse"}}}},"401":{"description":"Unauthorized — valid Bearer token required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden — insufficient permissions or tier limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}},"security":[{"HTTPBearer":[]}]}},"/billing/status":{"get":{"tags":["billing"],"summary":"Current billing tier and subscription info","description":"Returns tier, Stripe IDs, and cached (≤60s) subscription status.","operationId":"billing_status_billing_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingStatusResponse"}}}},"401":{"description":"Unauthorized — valid Bearer token required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden — insufficient permissions or tier limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}},"security":[{"HTTPBearer":[]}]}},"/users/me/entitlements":{"get":{"tags":["users"],"summary":"Get effective tier entitlements for the current user","description":"Effective cadence/cap contract for the authenticated user.\n\nThe dashboard uses this instead of reconstructing tier rules in\nJavaScript. active_hunt_count includes hunts with a future paused_until\n(a timed pause does not free the slot); remaining is clamped at zero so\ngrandfathered/over-cap data cannot produce a negative UI value.","operationId":"get_my_entitlements_users_me_entitlements_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntitlementsResponse"}}}},"401":{"description":"Unauthorized — valid Bearer token required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden — insufficient permissions or tier limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}},"security":[{"HTTPBearer":[]}]}},"/hunts":{"get":{"tags":["hunts"],"summary":"List all hunts for the current user","operationId":"list_hunts_hunts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HuntResponse"},"title":"Response List Hunts Hunts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Unauthorized — valid Bearer token required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden — insufficient permissions or tier limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"post":{"tags":["hunts"],"summary":"Create a new hunt","operationId":"create_hunt_hunts_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HuntCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HuntResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Unauthorized — valid Bearer token required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden — insufficient permissions or tier limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/hunts/results":{"get":{"tags":["hunts"],"summary":"Paginated results feed across all hunts for the current user","description":"Returns all scan results across all of the user's hunts, newest first.\nEach row joins hunt_scan_results → listings → hunts, with alert_channel from alerts.\n\nfilter:\n  all       — everything\n  alerted   — action=ALERT\n  near_miss — action=WATCH\n  skipped   — action=SKIP","operationId":"get_results_feed_hunts_results_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Filter"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"hunt_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Hunt Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanResultsPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Unauthorized — valid Bearer token required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden — insufficient permissions or tier limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/hunts/{hunt_id}":{"get":{"tags":["hunts"],"summary":"Get a specific hunt","operationId":"get_hunt_hunts__hunt_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hunt_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Hunt Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HuntResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Unauthorized — valid Bearer token required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden — insufficient permissions or tier limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"patch":{"tags":["hunts"],"summary":"Update a hunt","operationId":"update_hunt_hunts__hunt_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hunt_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Hunt Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HuntUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HuntResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Unauthorized — valid Bearer token required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden — insufficient permissions or tier limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"delete":{"tags":["hunts"],"summary":"Delete a hunt (hard delete)","operationId":"delete_hunt_hunts__hunt_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hunt_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Hunt Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Unauthorized — valid Bearer token required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden — insufficient permissions or tier limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/hunts/{hunt_id}/alerts":{"get":{"tags":["hunts"],"summary":"List recent alerts fired for a hunt","operationId":"list_hunt_alerts_hunts__hunt_id__alerts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hunt_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Hunt Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AlertResponse"},"title":"Response List Hunt Alerts Hunts  Hunt Id  Alerts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Unauthorized — valid Bearer token required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden — insufficient permissions or tier limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/hunts/{hunt_id}/listings":{"get":{"tags":["hunts"],"summary":"List listings evaluated for a hunt (recent alerts)","description":"Returns listings that were evaluated for this hunt.\nFilter by action=ALERT|WATCH|SKIP or leave blank for all.","operationId":"list_hunt_listings_hunts__hunt_id__listings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hunt_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Hunt Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ListingResponse"},"title":"Response List Hunt Listings Hunts  Hunt Id  Listings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Unauthorized — valid Bearer token required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden — insufficient permissions or tier limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/hunts/{hunt_id}/scan":{"post":{"tags":["hunts"],"summary":"Trigger a manual scan for this hunt","operationId":"trigger_manual_scan_hunts__hunt_id__scan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hunt_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Hunt Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Unauthorized — valid Bearer token required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden — insufficient permissions or tier limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/v2/evaluate":{"post":{"tags":["v2"],"summary":"Evaluate","description":"Evaluate a listing: component-match diagnostics plus direct listing\nfacts. Market benchmarks are quarantined (2026-08-14), so the verdict is\n``INCONCLUSIVE`` and all benchmark-derived fields are null until a trusted\ncomparable-listing cohort exists.","operationId":"evaluate_api_v2_evaluate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v2/components/search":{"get":{"tags":["v2-components"],"summary":"Search Components","operationId":"search_components_api_v2_components_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Search text","title":"Q"},"description":"Search text"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category","title":"Category"},"description":"Filter by category"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max results","default":20,"title":"Limit"},"description":"Max results"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor (last component ID)","title":"Cursor"},"description":"Pagination cursor (last component ID)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/v2/components/{component_id}":{"get":{"tags":["v2-components"],"summary":"Get Component","operationId":"get_component_api_v2_components__component_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"component_id","in":"path","required":true,"schema":{"type":"string","title":"Component Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/api/v2/components/{component_id}/history":{"get":{"tags":["v2-components"],"summary":"Get Price History","operationId":"get_price_history_api_v2_components__component_id__history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"component_id","in":"path","required":true,"schema":{"type":"string","title":"Component Id"}},{"name":"period","in":"query","required":false,"schema":{"type":"string","description":"Time period: 7d, 30d, 90d, all","default":"90d","title":"Period"},"description":"Time period: 7d, 30d, 90d, all"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/users/me/channels":{"get":{"tags":["notification-channels"],"summary":"List Channels","operationId":"list_channels_users_me_channels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelListResponse"}}}},"401":{"description":"Unauthorized — valid Bearer token required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden — insufficient permissions or tier limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["notification-channels"],"summary":"Create Channel","operationId":"create_channel_users_me_channels_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Unauthorized — valid Bearer token required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden — insufficient permissions or tier limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}},"security":[{"HTTPBearer":[]}]}},"/users/me/channels/{channel_id}":{"patch":{"tags":["notification-channels"],"summary":"Update Channel","operationId":"update_channel_users_me_channels__channel_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Unauthorized — valid Bearer token required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden — insufficient permissions or tier limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}},"delete":{"tags":["notification-channels"],"summary":"Delete Channel","operationId":"delete_channel_users_me_channels__channel_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Unauthorized — valid Bearer token required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden — insufficient permissions or tier limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}},"/users/me/channels/{channel_id}/test":{"post":{"tags":["notification-channels"],"summary":"Test Channel","operationId":"test_channel_users_me_channels__channel_id__test_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","title":"Channel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Test Channel Users Me Channels  Channel Id  Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"401":{"description":"Unauthorized — valid Bearer token required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"403":{"description":"Forbidden — insufficient permissions or tier limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}},"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}}}}},"components":{"schemas":{"ChannelCreate":{"properties":{"label":{"type":"string","maxLength":100,"minLength":1,"title":"Label"},"channel_type":{"type":"string","minLength":1,"title":"Channel Type"},"apprise_url":{"type":"string","maxLength":500,"minLength":1,"title":"Apprise Url"},"is_default":{"type":"boolean","title":"Is Default","default":false}},"type":"object","required":["label","channel_type","apprise_url"],"title":"ChannelCreate"},"ChannelResponse":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"channel_type":{"type":"string","title":"Channel Type"},"redacted_url":{"type":"string","title":"Redacted Url"},"enabled":{"type":"boolean","title":"Enabled"},"is_default":{"type":"boolean","title":"Is Default"},"alerts_sent":{"type":"integer","title":"Alerts Sent","default":0},"alerts_opened":{"type":"integer","title":"Alerts Opened","default":0},"alerts_clicked":{"type":"integer","title":"Alerts Clicked","default":0},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","label","channel_type","redacted_url","enabled","is_default","created_at"],"title":"ChannelResponse","description":"Public response — never exposes raw secrets."},"BillingStatusResponse":{"properties":{"tier":{"type":"string","title":"Tier"},"stripe_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Customer Id"},"stripe_subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Subscription Id"},"subscription_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Status"}},"type":"object","required":["tier","stripe_customer_id","stripe_subscription_id","subscription_status"],"title":"BillingStatusResponse"},"EvaluateRequest":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"price":{"type":"number","title":"Price"},"condition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condition"}},"type":"object","required":["price"],"title":"EvaluateRequest"},"EvaluateResponse":{"properties":{"component":{"anyOf":[{"$ref":"#/components/schemas/ComponentMatch"},{"type":"null"}]},"verdict":{"type":"string","title":"Verdict"},"confidence":{"type":"number","title":"Confidence"},"reasoning":{"type":"string","title":"Reasoning"},"source_context":{"$ref":"#/components/schemas/SourceContext"},"savings":{"anyOf":[{"$ref":"#/components/schemas/Savings"},{"type":"null"}]},"price_metrics":{"anyOf":[{"$ref":"#/components/schemas/PriceMetrics"},{"type":"null"}]},"forecast":{"anyOf":[{"$ref":"#/components/schemas/Forecast"},{"type":"null"}]},"signal":{"anyOf":[{"$ref":"#/components/schemas/SignalInfo"},{"type":"null"}]},"source_comparisons":{"anyOf":[{"items":{"$ref":"#/components/schemas/SourcePriceComparison"},"type":"array"},{"type":"null"}],"title":"Source Comparisons"},"historical_context":{"anyOf":[{"$ref":"#/components/schemas/HistoricalContext"},{"type":"null"}]},"benchmark_trust":{"anyOf":[{"$ref":"#/components/schemas/BenchmarkTrustStatus"},{"type":"null"}]}},"type":"object","required":["verdict","confidence","reasoning","source_context"],"title":"EvaluateResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"SourceContext":{"properties":{"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"trust_tier":{"type":"string","title":"Trust Tier","default":"medium"},"comparable_observations":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Comparable Observations"}},"type":"object","title":"SourceContext"},"HuntCreate":{"properties":{"name":{"type":"string","title":"Name"},"config":{"type":"object","title":"Config"},"poll_interval_hours":{"type":"integer","title":"Poll Interval Hours","default":24},"criteria":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Criteria"},"target_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target Price"},"ceiling_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ceiling Price"},"sources_enabled":{"anyOf":[{"additionalProperties":{"type":"boolean"},"type":"object"},{"type":"null"}],"title":"Sources Enabled"}},"type":"object","required":["name","config"],"title":"HuntCreate"},"HistoricalContext":{"properties":{"best_price_ever":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Best Price Ever"},"best_price_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Best Price Date"},"price_30d_ago":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price 30D Ago"},"seasonal_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seasonal Note"},"class_avg_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Class Avg Price"},"class_avg_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Avg Label"}},"type":"object","title":"HistoricalContext"},"ComponentSearchResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/ComponentListItem"},"type":"array","title":"Results"},"total":{"type":"integer","title":"Total"},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"},"has_more":{"type":"boolean","title":"Has More"}},"type":"object","required":["results","total","has_more"],"title":"ComponentSearchResponse"},"Savings":{"properties":{"vs_median_90d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vs Median 90D"},"vs_avg_30d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vs Avg 30D"},"vs_historical_low":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vs Historical Low"}},"type":"object","title":"Savings"},"AccountResponse":{"properties":{"email":{"type":"string","title":"Email"},"tier":{"type":"string","title":"Tier"},"is_admin":{"type":"boolean","title":"Is Admin"},"telegram_chat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Telegram Chat Id"},"totp_enabled":{"type":"boolean","title":"Totp Enabled"},"has_password":{"type":"boolean","title":"Has Password"},"stripe_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Customer Id"},"stripe_subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Subscription Id"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}},"type":"object","required":["email","tier","is_admin","telegram_chat_id","totp_enabled","has_password","stripe_customer_id","stripe_subscription_id"],"title":"AccountResponse"},"PriceHistoryResponse":{"properties":{"component_id":{"type":"string","title":"Component Id"},"period":{"type":"string","title":"Period"},"observations":{"items":{"$ref":"#/components/schemas/PricePoint"},"type":"array","title":"Observations"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["component_id","period","observations","total"],"title":"PriceHistoryResponse"},"PriceMetrics":{"properties":{"current":{"type":"number","title":"Current"},"median_90d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median 90D"},"avg_30d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg 30D"},"historical_low":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Historical Low"},"trend_7d":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Trend 7D"}},"type":"object","required":["current"],"title":"PriceMetrics"},"ListingResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"external_id":{"type":"string","title":"External Id"},"source":{"type":"string","title":"Source"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"capacity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capacity"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Score"},"verdict":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verdict"},"action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"},"first_seen":{"type":"string","format":"date-time","title":"First Seen"},"last_seen":{"type":"string","format":"date-time","title":"Last Seen"}},"type":"object","required":["id","external_id","source","title","url","price","capacity","category","score","verdict","action","first_seen","last_seen"],"title":"ListingResponse"},"BenchmarkTrustStatus":{"properties":{"status":{"type":"string","title":"Status"},"reason_code":{"type":"string","title":"Reason Code"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"}},"type":"object","required":["status","reason_code"],"title":"BenchmarkTrustStatus","description":"Why benchmark-derived fields are present or absent (PR 1 containment).\n\n``status`` mirrors ``hunter.benchmark_trust.BenchmarkTrust``: legacy\nsummaries/evaluations are ``untrusted`` or ``insufficient_evidence``\nuntil a trusted cohort path exists, and the reason codes are stable and\nmachine-readable."},"ScanResultsPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ScanResultResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"ScanResultsPage"},"AlertResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"listing_id":{"type":"string","format":"uuid","title":"Listing Id"},"hunt_id":{"type":"string","format":"uuid","title":"Hunt Id"},"channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel"},"action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"},"score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Score"},"sent_at":{"type":"string","format":"date-time","title":"Sent At"}},"type":"object","required":["id","listing_id","hunt_id","channel","action","score","sent_at"],"title":"AlertResponse"},"ComponentListItem":{"properties":{"id":{"type":"string","title":"Id"},"mpn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mpn"},"brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"subcategory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subcategory"},"capacity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capacity"},"observation_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Observation Count"},"listing_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Listing Count"}},"type":"object","required":["id"],"title":"ComponentListItem"},"ChannelListResponse":{"properties":{"channels":{"items":{"$ref":"#/components/schemas/ChannelResponse"},"type":"array","title":"Channels"},"tier":{"type":"string","title":"Tier"},"max_channels":{"type":"integer","title":"Max Channels"},"max_instant_destinations":{"type":"integer","title":"Max Instant Destinations"},"allowed_notification_types":{"items":{"type":"string"},"type":"array","title":"Allowed Notification Types"}},"type":"object","required":["channels","tier","max_channels","max_instant_destinations","allowed_notification_types"],"title":"ChannelListResponse"},"HuntUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Config"},"poll_interval_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Poll Interval Hours"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"criteria":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Criteria"},"target_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target Price"},"ceiling_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ceiling Price"},"sources_enabled":{"anyOf":[{"additionalProperties":{"type":"boolean"},"type":"object"},{"type":"null"}],"title":"Sources Enabled"}},"type":"object","title":"HuntUpdate"},"ChannelUpdate":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Label"},"apprise_url":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Apprise Url"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"is_default":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Default"}},"type":"object","title":"ChannelUpdate"},"SignalInfo":{"properties":{"composite_score":{"type":"integer","title":"Composite Score"},"composite_label":{"type":"string","title":"Composite Label"},"below_median":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Below Median"},"trend":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trend"}},"type":"object","required":["composite_score","composite_label"],"title":"SignalInfo"},"ScanResultResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"hunt_id":{"type":"string","format":"uuid","title":"Hunt Id"},"hunt_name":{"type":"string","title":"Hunt Name"},"listing_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Listing Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Score"},"action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"},"verdict":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verdict"},"alert_channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alert Channel"},"is_backfill":{"type":"boolean","title":"Is Backfill","default":false},"run_at":{"type":"string","format":"date-time","title":"Run At"}},"type":"object","required":["id","hunt_id","hunt_name","listing_id","title","url","price","source","score","action","verdict","alert_channel","run_at"],"title":"ScanResultResponse","description":"A single scan result row for the Results Feed — one listing evaluated against one hunt."},"EntitlementsResponse":{"properties":{"tier":{"type":"string","title":"Tier"},"max_active_hunts":{"type":"integer","title":"Max Active Hunts"},"active_hunt_count":{"type":"integer","title":"Active Hunt Count"},"remaining_active_hunts":{"type":"integer","title":"Remaining Active Hunts"},"poll_interval_hours":{"type":"integer","title":"Poll Interval Hours"}},"type":"object","required":["tier","max_active_hunts","active_hunt_count","remaining_active_hunts","poll_interval_hours"],"title":"EntitlementsResponse","description":"Effective tier entitlements for the current user (GET /users/me/entitlements).\n\nactive_hunt_count counts active IS TRUE hunts, including hunts with a\nfuture paused_until (a timed pause does not free the slot).\nremaining_active_hunts is clamped at zero."},"ComponentDetail":{"properties":{"id":{"type":"string","title":"Id"},"mpn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mpn"},"brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"subcategory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subcategory"},"capacity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capacity"},"observation_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Observation Count"},"listing_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Listing Count"},"form_factor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Form Factor"},"interface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Interface"},"generation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generation"},"aliases":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Aliases"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id"],"title":"ComponentDetail"},"HuntResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"name":{"type":"string","title":"Name"},"config":{"type":"object","title":"Config"},"poll_interval_hours":{"type":"integer","title":"Poll Interval Hours"},"active":{"type":"boolean","title":"Active"},"paused_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paused Until"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run At"},"last_manual_scan_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Manual Scan At"},"criteria":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Criteria"},"target_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target Price"},"ceiling_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ceiling Price"},"sources_enabled":{"anyOf":[{"additionalProperties":{"type":"boolean"},"type":"object"},{"type":"null"}],"title":"Sources Enabled"},"alert_count":{"type":"integer","title":"Alert Count","default":0},"last_alert_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Alert At"},"last_alert_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Alert Status"}},"type":"object","required":["id","user_id","name","config","poll_interval_hours","active","paused_until","created_at"],"title":"HuntResponse"},"ComponentMatch":{"properties":{"id":{"type":"string","title":"Id"},"brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"confidence":{"type":"number","title":"Confidence","default":0.0}},"type":"object","required":["id"],"title":"ComponentMatch"},"Forecast":{"properties":{"predicted_30d":{"type":"number","title":"Predicted 30D"},"range":{"items":{"type":"number"},"type":"array","title":"Range"}},"type":"object","required":["predicted_30d","range"],"title":"Forecast"},"PricePoint":{"properties":{"price":{"type":"number","title":"Price"},"observed_at":{"type":"string","format":"date-time","title":"Observed At"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"condition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condition"}},"type":"object","required":["price","observed_at"],"title":"PricePoint"},"SourcePriceComparison":{"properties":{"source":{"type":"string","title":"Source"},"avg_price":{"type":"number","title":"Avg Price"},"min_price":{"type":"number","title":"Min Price"},"observation_count":{"type":"integer","title":"Observation Count"}},"type":"object","required":["source","avg_price","min_price","observation_count"],"title":"SourcePriceComparison"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"ErrorResponse":{"type":"object","description":"Standard error response object.","properties":{"detail":{"type":"string","description":"Human-readable explanation of the error."},"code":{"type":"string","description":"Machine-readable error code."}},"required":["detail"]},"ProblemDetails":{"type":"object","description":"RFC 9457 Problem Details object.","properties":{"type":{"type":"string","format":"uri","description":"A URI reference identifying the problem type."},"title":{"type":"string","description":"Short, human-readable summary of the problem type."},"status":{"type":"integer","description":"The HTTP status code."},"detail":{"type":"string","description":"Human-readable explanation specific to this occurrence."},"instance":{"type":"string","format":"uri","description":"A URI reference identifying the specific occurrence."}},"required":["title","status"]}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}